From 75cf93ed22264fecaa79e82f05fa9f02d49fc58b Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sun, 4 Feb 2024 14:50:37 +0100 Subject: [PATCH 001/430] bump version number --- ApacheThrift.nuspec | 8 ++++---- CMakeLists.txt | 2 +- Thrift.podspec | 4 ++-- appveyor.yml | 2 +- bower.json | 2 +- compiler/cpp/src/thrift/version.h | 2 +- configure.ac | 2 +- contrib/Rebus/Properties/AssemblyInfo.cs | 4 ++-- contrib/thrift-maven-plugin/pom.xml | 2 +- contrib/thrift.spec | 2 +- contrib/zeromq/csharp/AssemblyInfo.cs | 2 +- doc/specs/idl.md | 2 +- lib/d/src/thrift/base.d | 2 +- lib/dart/pubspec.yaml | 2 +- lib/delphi/src/Thrift.pas | 2 +- lib/erl/src/thrift.app.src | 2 +- lib/haxe/haxelib.json | 2 +- lib/java/gradle.properties | 2 +- lib/js/package-lock.json | 2 +- lib/js/package.json | 2 +- lib/js/src/thrift.js | 2 +- lib/lua/Thrift.lua | 2 +- .../Thrift.IntegrationTests.csproj | 2 +- .../Thrift.PublicInterfaces.Compile.Tests.csproj | 2 +- lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj | 2 +- lib/netstd/Thrift/Properties/AssemblyInfo.cs | 4 ++-- lib/netstd/Thrift/Thrift.csproj | 6 +++--- lib/ocaml/_oasis | 2 +- lib/perl/lib/Thrift.pm | 2 +- lib/py/setup.py | 2 +- lib/rb/thrift.gemspec | 2 +- lib/rs/Cargo.toml | 2 +- lib/st/package.xml | 2 +- lib/swift/Sources/Thrift.swift | 2 +- lib/swift/Tests/ThriftTests/ThriftTests.swift | 2 +- lib/ts/package-lock.json | 2 +- lib/ts/package.json | 2 +- package-lock.json | 2 +- package.json | 2 +- sonar-project.properties | 6 +++--- test/dart/test_client/pubspec.yaml | 2 +- test/erl/src/thrift_test.app.src | 2 +- test/netstd/Client/Client.csproj | 2 +- test/netstd/Server/Server.csproj | 2 +- tutorial/dart/client/pubspec.yaml | 2 +- tutorial/dart/console_client/pubspec.yaml | 2 +- tutorial/dart/server/pubspec.yaml | 2 +- tutorial/delphi/DelphiClient/DelphiClient.dproj | 4 ++-- tutorial/delphi/DelphiServer/DelphiServer.dproj | 4 ++-- tutorial/netstd/Client/Client.csproj | 2 +- tutorial/netstd/Interfaces/Interfaces.csproj | 2 +- tutorial/netstd/Server/Server.csproj | 2 +- tutorial/ocaml/_oasis | 2 +- 53 files changed, 65 insertions(+), 65 deletions(-) diff --git a/ApacheThrift.nuspec b/ApacheThrift.nuspec index cd9a29c6c90..a4ca51e4256 100644 --- a/ApacheThrift.nuspec +++ b/ApacheThrift.nuspec @@ -19,14 +19,14 @@ the "Thrift" project. 2. nuget setApiKey 3. nuget pack ApacheThrift.nuspec -Symbols -SymbolPackageFormat snupkg - 4. nuget push ApacheThrift.0.20.0.nupkg -Source https://api.nuget.org/v3/index.json + 4. nuget push ApacheThrift.0.21.0.nupkg -Source https://api.nuget.org/v3/index.json --> ApacheThrift - 0.20.0 - Apache Thrift 0.20.0 + 0.21.0 + Apache Thrift 0.21.0 Apache Thrift Developers Apache Software Foundation Apache-2.0 @@ -36,7 +36,7 @@ Contains runtime libraries from lib/netstd for netstandard2.0 framework development. - + Apache Thrift RPC diff --git a/CMakeLists.txt b/CMakeLists.txt index a685e4f3705..78969f275e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,7 @@ endif() # PACKAGE_VERSION is used by cpack scripts currently # Both thrift_VERSION and PACKAGE_VERSION should be the same for now -set(thrift_VERSION "0.20.0") +set(thrift_VERSION "0.21.0") set(PACKAGE_VERSION ${thrift_VERSION}) project("thrift" VERSION ${PACKAGE_VERSION}) diff --git a/Thrift.podspec b/Thrift.podspec index 8bf70f64f18..4fde1e5988f 100644 --- a/Thrift.podspec +++ b/Thrift.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Thrift' - s.version = '0.20.0' + s.version = '0.21.0' s.summary = "Apache Thrift is a lightweight, language-independent software stack with an associated code generation mechanism for RPC." s.description = <<-DESC The Apache Thrift scalable cross-language software framework for networked services development combines a software stack with a code generation engine to build services that work efficiently and seamlessly between many programming languages. @@ -10,6 +10,6 @@ The Apache Thrift scalable cross-language software framework for networked servi s.author = { 'Apache Thrift Developers' => 'dev@thrift.apache.org' } s.ios.deployment_target = '9.0' s.osx.deployment_target = '10.10' - s.source = { :git => 'https://github.com/apache/thrift.git', :tag => 'v0.20.0' } + s.source = { :git => 'https://github.com/apache/thrift.git', :tag => 'v0.21.0' } s.source_files = 'lib/swift/Sources/*.swift' end diff --git a/appveyor.yml b/appveyor.yml index 5847ea926ba..0e81ba44757 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,7 +19,7 @@ # build Apache Thrift on AppVeyor - https://ci.appveyor.com -version: '0.20.0.{build}' +version: '0.21.0.{build}' shallow_clone: true diff --git a/bower.json b/bower.json index 84f3a989012..f80fe97bb02 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "thrift", - "version": "0.20.0", + "version": "0.21.0", "homepage": "https://github.com/apache/thrift.git", "authors": [ "Apache Thrift " diff --git a/compiler/cpp/src/thrift/version.h b/compiler/cpp/src/thrift/version.h index 65e0f43684b..9692231e549 100644 --- a/compiler/cpp/src/thrift/version.h +++ b/compiler/cpp/src/thrift/version.h @@ -24,6 +24,6 @@ #pragma once #endif // _MSC_VER -#define THRIFT_VERSION "0.20.0" +#define THRIFT_VERSION "0.21.0" #endif // _THRIFT_VERSION_H_ diff --git a/configure.ac b/configure.ac index eed4a84d775..12a1168a8af 100644 --- a/configure.ac +++ b/configure.ac @@ -20,7 +20,7 @@ AC_PREREQ(2.65) AC_CONFIG_MACRO_DIR([./aclocal]) -AC_INIT([thrift], [0.20.0]) +AC_INIT([thrift], [0.21.0]) AC_CONFIG_AUX_DIR([.]) diff --git a/contrib/Rebus/Properties/AssemblyInfo.cs b/contrib/Rebus/Properties/AssemblyInfo.cs index 33b0aa872c6..f1dc685c2f7 100644 --- a/contrib/Rebus/Properties/AssemblyInfo.cs +++ b/contrib/Rebus/Properties/AssemblyInfo.cs @@ -34,5 +34,5 @@ [assembly: Guid("0af10984-40d3-453d-b1e5-421529e8c7e2")] -[assembly: AssemblyVersion("0.20.0.0")] -[assembly: AssemblyFileVersion("0.20.0.0")] +[assembly: AssemblyVersion("0.21.0.0")] +[assembly: AssemblyFileVersion("0.21.0.0")] diff --git a/contrib/thrift-maven-plugin/pom.xml b/contrib/thrift-maven-plugin/pom.xml index 46f3cb18327..54ff1e02d6d 100644 --- a/contrib/thrift-maven-plugin/pom.xml +++ b/contrib/thrift-maven-plugin/pom.xml @@ -29,7 +29,7 @@ thrift-maven-plugin maven-plugin thrift-maven-plugin - 0.20.0 + 0.21.0 1.8 diff --git a/contrib/thrift.spec b/contrib/thrift.spec index 90bf4aae567..20dcc574060 100644 --- a/contrib/thrift.spec +++ b/contrib/thrift.spec @@ -28,7 +28,7 @@ Name: thrift License: Apache License v2.0 Group: Development Summary: RPC and serialization framework -Version: 0.20.0 +Version: 0.21.0 Release: 0 URL: http://thrift.apache.org Packager: Thrift Developers diff --git a/contrib/zeromq/csharp/AssemblyInfo.cs b/contrib/zeromq/csharp/AssemblyInfo.cs index 8d7ed390b49..7f91c339042 100644 --- a/contrib/zeromq/csharp/AssemblyInfo.cs +++ b/contrib/zeromq/csharp/AssemblyInfo.cs @@ -36,7 +36,7 @@ // The form "{Major}.{Minor}.*" will automatically update the build and revision, // and "{Major}.{Minor}.{Build}.*" will update just the revision. -[assembly: AssemblyVersion("0.20.0.0")] +[assembly: AssemblyVersion("0.21.0.0")] // The following attributes are used to specify the signing key for the assembly, // if desired. See the Mono documentation for more information about signing. diff --git a/doc/specs/idl.md b/doc/specs/idl.md index 0980f5bbc6d..f5803b54a50 100644 --- a/doc/specs/idl.md +++ b/doc/specs/idl.md @@ -1,6 +1,6 @@ ## Thrift interface description language -For Thrift version 0.20.0. +For Thrift version 0.21.0. The Thrift interface definition language (IDL) allows for the definition of [Thrift Types](/docs/types). A Thrift IDL file is processed by the Thrift code generator to produce code for the various target languages to support the defined structs and services in the IDL file. diff --git a/lib/d/src/thrift/base.d b/lib/d/src/thrift/base.d index e843a5c8549..ddc0dd498bf 100644 --- a/lib/d/src/thrift/base.d +++ b/lib/d/src/thrift/base.d @@ -50,7 +50,7 @@ class TCompoundOperationException : TException { /// The Thrift version string, used for informative purposes. // Note: This is currently hardcoded, but will likely be filled in by the build // system in future versions. -enum VERSION = "0.20.0"; +enum VERSION = "0.21.0"; /** * Functions used for logging inside Thrift. diff --git a/lib/dart/pubspec.yaml b/lib/dart/pubspec.yaml index 7e205483adc..069818f0864 100644 --- a/lib/dart/pubspec.yaml +++ b/lib/dart/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: thrift -version: 0.20.0 +version: 0.21.0 description: > A Dart library for Apache Thrift author: Apache Thrift Developers diff --git a/lib/delphi/src/Thrift.pas b/lib/delphi/src/Thrift.pas index 6696a195a57..9e1b0bbf59b 100644 --- a/lib/delphi/src/Thrift.pas +++ b/lib/delphi/src/Thrift.pas @@ -28,7 +28,7 @@ interface Thrift.Protocol; const - Version = '0.20.0'; + Version = '0.21.0'; type TException = Thrift.Exception.TException; // compatibility alias diff --git a/lib/erl/src/thrift.app.src b/lib/erl/src/thrift.app.src index 0e25b675592..8431213272a 100644 --- a/lib/erl/src/thrift.app.src +++ b/lib/erl/src/thrift.app.src @@ -22,7 +22,7 @@ {description, "Thrift bindings"}, % The version of the applicaton - {vsn, "0.20.0"}, + {vsn, "0.21.0"}, % All modules used by the application. {modules, []}, diff --git a/lib/haxe/haxelib.json b/lib/haxe/haxelib.json index 78779da4534..6f5de0b11b7 100644 --- a/lib/haxe/haxelib.json +++ b/lib/haxe/haxelib.json @@ -10,7 +10,7 @@ "framework" ], "description": "Haxe bindings for the Apache Thrift RPC and serialization framework", - "version": "0.20.0", + "version": "0.21.0", "releasenote": "Licensed under Apache License, Version 2.0. The Apache Thrift compiler needs to be installed separately.", "contributors": ["ApacheThrift"], "dependencies": { diff --git a/lib/java/gradle.properties b/lib/java/gradle.properties index 404318bed34..a3912e3cbe3 100644 --- a/lib/java/gradle.properties +++ b/lib/java/gradle.properties @@ -1,7 +1,7 @@ # This file is shared currently between this Gradle build and the # Ant builds for fd303 and JavaScript. Keep the dotted notation for # the properties to minimize the changes in the dependencies. -thrift.version=0.20.0 +thrift.version=0.21.0 thrift.groupid=org.apache.thrift release=false diff --git a/lib/js/package-lock.json b/lib/js/package-lock.json index 0d9de1242b8..88026612efb 100644 --- a/lib/js/package-lock.json +++ b/lib/js/package-lock.json @@ -1,6 +1,6 @@ { "name": "thrift", - "version": "0.20.0", + "version": "0.21.0", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/lib/js/package.json b/lib/js/package.json index 8543b2500c4..d9ab5a63bae 100644 --- a/lib/js/package.json +++ b/lib/js/package.json @@ -1,6 +1,6 @@ { "name": "thrift", - "version": "0.20.0", + "version": "0.21.0", "description": "Thrift is a software framework for scalable cross-language services development.", "main": "./src/thrift", "author": { diff --git a/lib/js/src/thrift.js b/lib/js/src/thrift.js index 7dbb560c740..de5ca198aaf 100644 --- a/lib/js/src/thrift.js +++ b/lib/js/src/thrift.js @@ -46,7 +46,7 @@ var Thrift = { * @const {string} Version * @memberof Thrift */ - Version: '0.20.0', + Version: '0.21.0', /** * Thrift IDL type string to Id mapping. diff --git a/lib/lua/Thrift.lua b/lib/lua/Thrift.lua index 1f9a562fac0..212359bc19e 100644 --- a/lib/lua/Thrift.lua +++ b/lib/lua/Thrift.lua @@ -48,7 +48,7 @@ function ttable_size(t) return count end -version = '0.20.0' +version = '0.21.0' TType = { STOP = 0, diff --git a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj index 3f8345926ae..5602f91292b 100644 --- a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj +++ b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj @@ -23,7 +23,7 @@ latestMajor Thrift.IntegrationTests Thrift.IntegrationTests - 0.20.0.0 + 0.21.0.0 Exe false false diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj index 7c5775026b8..5745bd9dae9 100644 --- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj +++ b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj @@ -19,7 +19,7 @@ --> - 0.20.0 + 0.21.0 Thrift version $(ThriftVersion) net8.0 latestMajor diff --git a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj index a37be1b1046..7f9dcb7cbb5 100644 --- a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj +++ b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj @@ -21,7 +21,7 @@ net8.0 latestMajor - 0.20.0.0 + 0.21.0.0 enable diff --git a/lib/netstd/Thrift/Properties/AssemblyInfo.cs b/lib/netstd/Thrift/Properties/AssemblyInfo.cs index bd84c4ea37a..383b256c4c1 100644 --- a/lib/netstd/Thrift/Properties/AssemblyInfo.cs +++ b/lib/netstd/Thrift/Properties/AssemblyInfo.cs @@ -52,5 +52,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.20.0.0")] -[assembly: AssemblyFileVersion("0.20.0.0")] +[assembly: AssemblyVersion("0.21.0.0")] +[assembly: AssemblyFileVersion("0.21.0.0")] diff --git a/lib/netstd/Thrift/Thrift.csproj b/lib/netstd/Thrift/Thrift.csproj index d255f37c4eb..3aa16d25ea1 100644 --- a/lib/netstd/Thrift/Thrift.csproj +++ b/lib/netstd/Thrift/Thrift.csproj @@ -40,8 +40,8 @@ true thrift.snk false - Apache Thrift 0.20.0 - 0.20.0.0 + Apache Thrift 0.21.0 + 0.21.0.0 false http://thrift.apache.org/ Apache Thrift Developers @@ -50,7 +50,7 @@ C# .NET Core bindings for the Apache Thrift RPC system Apache Thrift RPC - https://github.com/apache/thrift/blob/0.20.0/CHANGES.md + https://github.com/apache/thrift/blob/0.21.0/CHANGES.md README.md Copyright 2023 The Apache Software Foundation diff --git a/lib/ocaml/_oasis b/lib/ocaml/_oasis index be1ce1265b9..adf619804bc 100644 --- a/lib/ocaml/_oasis +++ b/lib/ocaml/_oasis @@ -1,5 +1,5 @@ Name: libthrift-ocaml -Version: 0.20.0 +Version: 0.21.0 OASISFormat: 0.3 Synopsis: OCaml bindings for the Apache Thrift RPC system Authors: Apache Thrift Developers diff --git a/lib/perl/lib/Thrift.pm b/lib/perl/lib/Thrift.pm index 4b5f781e09f..45bf33bb792 100644 --- a/lib/perl/lib/Thrift.pm +++ b/lib/perl/lib/Thrift.pm @@ -31,6 +31,6 @@ use warnings; # package Thrift; -use version 0.77; our $VERSION = version->declare("v0.20.0"); +use version 0.77; our $VERSION = version->declare("v0.21.0"); 1; diff --git a/lib/py/setup.py b/lib/py/setup.py index f5371af753c..31e2bae326e 100644 --- a/lib/py/setup.py +++ b/lib/py/setup.py @@ -105,7 +105,7 @@ def run_setup(with_binary): twisted_deps = ['twisted'] setup(name='thrift', - version='0.20.0', + version='0.21.0', description='Python bindings for the Apache Thrift RPC system', long_description=read_file("README.md"), long_description_content_type="text/markdown", diff --git a/lib/rb/thrift.gemspec b/lib/rb/thrift.gemspec index 6b510c78be9..86d21897bc2 100644 --- a/lib/rb/thrift.gemspec +++ b/lib/rb/thrift.gemspec @@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| s.name = 'thrift' - s.version = '0.20.0' + s.version = '0.21.0' s.authors = ['Apache Thrift Developers'] s.email = ['dev@thrift.apache.org'] s.homepage = 'http://thrift.apache.org' diff --git a/lib/rs/Cargo.toml b/lib/rs/Cargo.toml index a6e8533aa57..dd4a1b641cc 100644 --- a/lib/rs/Cargo.toml +++ b/lib/rs/Cargo.toml @@ -2,7 +2,7 @@ name = "thrift" description = "Rust bindings for the Apache Thrift RPC system" edition = "2021" -version = "0.20.0" +version = "0.21.0" license = "Apache-2.0" authors = ["Apache Thrift Developers "] homepage = "http://thrift.apache.org" diff --git a/lib/st/package.xml b/lib/st/package.xml index 7af883ee624..d606aadb748 100644 --- a/lib/st/package.xml +++ b/lib/st/package.xml @@ -17,7 +17,7 @@ specific language governing permissions and limitations under the License. --> - + libthrift-st thrift.st diff --git a/lib/swift/Sources/Thrift.swift b/lib/swift/Sources/Thrift.swift index 22981a0fcf4..d78cff6c01f 100644 --- a/lib/swift/Sources/Thrift.swift +++ b/lib/swift/Sources/Thrift.swift @@ -1,3 +1,3 @@ class Thrift { - let version = "0.20.0" + let version = "0.21.0" } diff --git a/lib/swift/Tests/ThriftTests/ThriftTests.swift b/lib/swift/Tests/ThriftTests/ThriftTests.swift index 3c6854c6587..10121e744fe 100644 --- a/lib/swift/Tests/ThriftTests/ThriftTests.swift +++ b/lib/swift/Tests/ThriftTests/ThriftTests.swift @@ -3,7 +3,7 @@ import XCTest class ThriftTests: XCTestCase { func testVersion() { - XCTAssertEqual(Thrift().version, "0.20.0") + XCTAssertEqual(Thrift().version, "0.21.0") } static var allTests : [(String, (ThriftTests) -> () throws -> Void)] { diff --git a/lib/ts/package-lock.json b/lib/ts/package-lock.json index f99d8a34713..31e0c52d69f 100644 --- a/lib/ts/package-lock.json +++ b/lib/ts/package-lock.json @@ -1,6 +1,6 @@ { "name": "thrift", - "version": "0.20.0", + "version": "0.21.0", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/lib/ts/package.json b/lib/ts/package.json index 054807f91c9..f2960657bf6 100644 --- a/lib/ts/package.json +++ b/lib/ts/package.json @@ -1,6 +1,6 @@ { "name": "thrift", - "version": "0.20.0", + "version": "0.21.0", "description": "Thrift is a software framework for scalable cross-language services development.", "author": { "name": "Apache Thrift Developers", diff --git a/package-lock.json b/package-lock.json index 3f8780a5ab5..5c3b06dd2f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "thrift", - "version": "0.20.0", + "version": "0.21.0", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package.json b/package.json index 47f9e874884..2925cc8f2ae 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "type": "git", "url": "https://github.com/apache/thrift.git" }, - "version": "0.20.0", + "version": "0.21.0", "author": { "name": "Apache Thrift Developers", "email": "dev@thrift.apache.org", diff --git a/sonar-project.properties b/sonar-project.properties index 258dfe913af..02b1195c229 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -16,7 +16,7 @@ development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between all major languages. # Apache Thrift Version -sonar.projectVersion=0.20.0 +sonar.projectVersion=0.21.0 # use this to set another version string # $ sonar-runner -D sonar.projectVersion=`git rev-parse HEAD` # set projectDate in combination with projectVersion for imports of old releases @@ -54,7 +54,7 @@ module1.sonar.projectName=Apache Thrift - Java Library module1.sonar.projectBaseDir=lib/java module1.sonar.sources=src module1.sonar.tests=test -module1.sonar.binaries=build/libs/libthrift-0.20.0.jar +module1.sonar.binaries=build/libs/libthrift-0.21.0.jar module1.sonar.libraries=build/deps/*.jar module1.sonar.language=java @@ -62,7 +62,7 @@ module2.sonar.projectName=Apache Thrift - Java Tutorial module2.sonar.projectBaseDir=. module2.sonar.sources=tutorial/java/src, tutorial/java/gen-java module2.sonar.binaries=tutorial/java/tutorial.jar -module2.sonar.libraries=lib/java/build/deps/*.jar,lib/java/build/libs/libthrift-0.20.0.jar +module2.sonar.libraries=lib/java/build/deps/*.jar,lib/java/build/libs/libthrift-0.21.0.jar module2.sonar.language=java module3.sonar.projectName=Apache Thrift - JavaScript Library diff --git a/test/dart/test_client/pubspec.yaml b/test/dart/test_client/pubspec.yaml index 177e2cdf141..f4d01358a9c 100644 --- a/test/dart/test_client/pubspec.yaml +++ b/test/dart/test_client/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: thrift_test_client -version: 0.20.0 +version: 0.21.0 description: A client integration test for the Dart Thrift library author: Apache Thrift Developers homepage: http://thrift.apache.org diff --git a/test/erl/src/thrift_test.app.src b/test/erl/src/thrift_test.app.src index 9d68a564533..b78fc296c75 100644 --- a/test/erl/src/thrift_test.app.src +++ b/test/erl/src/thrift_test.app.src @@ -22,7 +22,7 @@ {description, "Thrift cross language test"}, % The version of the applicaton - {vsn, "0.20.0"}, + {vsn, "0.21.0"}, % All modules used by the application. {modules, [ diff --git a/test/netstd/Client/Client.csproj b/test/netstd/Client/Client.csproj index aa90e2c5ec7..977303bbc58 100644 --- a/test/netstd/Client/Client.csproj +++ b/test/netstd/Client/Client.csproj @@ -24,7 +24,7 @@ Client Client Exe - 0.20.0.0 + 0.21.0.0 false false false diff --git a/test/netstd/Server/Server.csproj b/test/netstd/Server/Server.csproj index 63ce613bbda..359578a4e29 100644 --- a/test/netstd/Server/Server.csproj +++ b/test/netstd/Server/Server.csproj @@ -24,7 +24,7 @@ Server Server Exe - 0.20.0.0 + 0.21.0.0 false false false diff --git a/tutorial/dart/client/pubspec.yaml b/tutorial/dart/client/pubspec.yaml index e8c6db8ab90..b486ec80b28 100644 --- a/tutorial/dart/client/pubspec.yaml +++ b/tutorial/dart/client/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: tutorial_client -version: 0.20.0 +version: 0.21.0 description: A Dart client implementation of the Apache Thrift tutorial author: Apache Thrift Developers homepage: http://thrift.apache.org diff --git a/tutorial/dart/console_client/pubspec.yaml b/tutorial/dart/console_client/pubspec.yaml index e5c0938b973..bf61ded77ad 100644 --- a/tutorial/dart/console_client/pubspec.yaml +++ b/tutorial/dart/console_client/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: tutorial_console_client -version: 0.20.0 +version: 0.21.0 description: > A Dart console client to implementation of the Apache Thrift tutorial author: Apache Thrift Developers diff --git a/tutorial/dart/server/pubspec.yaml b/tutorial/dart/server/pubspec.yaml index 5f7edb9bc25..29811eb21be 100644 --- a/tutorial/dart/server/pubspec.yaml +++ b/tutorial/dart/server/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: tutorial_server -version: 0.20.0 +version: 0.21.0 description: A Dart server to support the Apache Thrift tutorial author: Apache Thrift Developers homepage: http://thrift.apache.org diff --git a/tutorial/delphi/DelphiClient/DelphiClient.dproj b/tutorial/delphi/DelphiClient/DelphiClient.dproj index 34d9f03dc22..fbb63f7f616 100644 --- a/tutorial/delphi/DelphiClient/DelphiClient.dproj +++ b/tutorial/delphi/DelphiClient/DelphiClient.dproj @@ -124,13 +124,13 @@ popd]]> Thrift Tutorial - 0.20.0.0 + 0.21.0.0 DelphiClient Copyright © 2012 The Apache Software Foundation DelphiClient.exe Thrift - 0.20.0.0 + 0.21.0.0 diff --git a/tutorial/delphi/DelphiServer/DelphiServer.dproj b/tutorial/delphi/DelphiServer/DelphiServer.dproj index fa8cb92d84a..376d90ae1b1 100644 --- a/tutorial/delphi/DelphiServer/DelphiServer.dproj +++ b/tutorial/delphi/DelphiServer/DelphiServer.dproj @@ -121,13 +121,13 @@ popd]]> Thrift Tutorial - 0.20.0.0 + 0.21.0.0 DelphiServer Copyright © 2012 The Apache Software Foundation DelphiServer.exe Thrift - 0.20.0.0 + 0.21.0.0 diff --git a/tutorial/netstd/Client/Client.csproj b/tutorial/netstd/Client/Client.csproj index 994d6be7be6..399b0e0d096 100644 --- a/tutorial/netstd/Client/Client.csproj +++ b/tutorial/netstd/Client/Client.csproj @@ -24,7 +24,7 @@ Client Client Exe - 0.20.0.0 + 0.21.0.0 false false false diff --git a/tutorial/netstd/Interfaces/Interfaces.csproj b/tutorial/netstd/Interfaces/Interfaces.csproj index c3524575adc..576722ba591 100644 --- a/tutorial/netstd/Interfaces/Interfaces.csproj +++ b/tutorial/netstd/Interfaces/Interfaces.csproj @@ -22,7 +22,7 @@ net6.0 Interfaces Interfaces - 0.20.0.0 + 0.21.0.0 false false false diff --git a/tutorial/netstd/Server/Server.csproj b/tutorial/netstd/Server/Server.csproj index c72ec88ce34..38131a6d32d 100644 --- a/tutorial/netstd/Server/Server.csproj +++ b/tutorial/netstd/Server/Server.csproj @@ -24,7 +24,7 @@ Server Server Exe - 0.20.0.0 + 0.21.0.0 false false false diff --git a/tutorial/ocaml/_oasis b/tutorial/ocaml/_oasis index 6072e4b969f..180f86560e8 100644 --- a/tutorial/ocaml/_oasis +++ b/tutorial/ocaml/_oasis @@ -1,5 +1,5 @@ Name: tutorial -Version: 0.20.0 +Version: 0.21.0 OASISFormat: 0.3 Synopsis: OCaml Tutorial example Authors: Apache Thrift Developers From 875178c0ab11c9463936b95980397087530b8cb8 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Fri, 17 Nov 2023 12:36:31 -0800 Subject: [PATCH 002/430] THRIFT-5744: Switch to slog for go library Client: go --- .github/workflows/build.yml | 4 +- LANGUAGES.md | 2 +- go.mod | 2 +- lib/go/test/fuzz/go.mod | 2 +- lib/go/test/go.mod | 2 +- lib/go/thrift/debug_protocol.go | 329 +++++++++++++++++++++++++++----- lib/go/thrift/logger.go | 12 ++ lib/go/thrift/simple_server.go | 23 ++- test/go/go.mod | 4 +- test/go/go.sum | 2 - 10 files changed, 315 insertions(+), 67 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c0b5a976753..aeb1614134a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -82,8 +82,8 @@ jobs: strategy: matrix: go: - - '1.20' - '1.21' + - '1.22' fail-fast: false steps: - uses: actions/checkout@v4 @@ -127,7 +127,7 @@ jobs: run: make -C test/go precross - name: Upload go precross artifacts - if: matrix.go == '1.21' + if: matrix.go == '1.22' uses: actions/upload-artifact@v3 with: name: go-precross diff --git a/LANGUAGES.md b/LANGUAGES.md index 236007f9af8..4952ade158b 100644 --- a/LANGUAGES.md +++ b/LANGUAGES.md @@ -163,7 +163,7 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr Go 0.7.0 Yes -1.201.21 +1.211.22 YesYesYes YesYesYesYes diff --git a/go.mod b/go.mod index 7be425635ec..b435d78a368 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module github.com/apache/thrift -go 1.20 +go 1.21 diff --git a/lib/go/test/fuzz/go.mod b/lib/go/test/fuzz/go.mod index 4ff6c5d934e..b7ddd5fcc60 100644 --- a/lib/go/test/fuzz/go.mod +++ b/lib/go/test/fuzz/go.mod @@ -1,6 +1,6 @@ module github.com/apache/thrift/lib/go/test/fuzz -go 1.20 +go 1.21 require github.com/apache/thrift v0.0.0-00010101000000-000000000000 diff --git a/lib/go/test/go.mod b/lib/go/test/go.mod index 59535e6446d..0c032b70fe0 100644 --- a/lib/go/test/go.mod +++ b/lib/go/test/go.mod @@ -1,6 +1,6 @@ module github.com/apache/thrift/lib/go/test -go 1.20 +go 1.21 require ( github.com/apache/thrift v0.0.0-00010101000000-000000000000 diff --git a/lib/go/thrift/debug_protocol.go b/lib/go/thrift/debug_protocol.go index 83ccad94bff..d730411b4b6 100644 --- a/lib/go/thrift/debug_protocol.go +++ b/lib/go/thrift/debug_protocol.go @@ -21,7 +21,7 @@ package thrift import ( "context" - "fmt" + "log/slog" ) type TDebugProtocol struct { @@ -34,7 +34,11 @@ type TDebugProtocol struct { // If Logger is nil, StdLogger using stdlib log package with os.Stderr // will be used. If disable logging is desired, set Logger to NopLogger // explicitly instead of leaving it as nil/unset. - Logger Logger + // + // Deprecated: TDebugProtocol always use slog at debug level now. + // This field will be removed in a future version. + Logger Logger + LogPrefix string // Optional. An TProtocol to duplicate everything read/written from Delegate. @@ -86,13 +90,16 @@ func (t *TDebugProtocolFactory) GetProtocol(trans TTransport) TProtocol { } } -func (tdp *TDebugProtocol) logf(format string, v ...interface{}) { - fallbackLogger(tdp.Logger)(fmt.Sprintf(format, v...)) -} - func (tdp *TDebugProtocol) WriteMessageBegin(ctx context.Context, name string, typeId TMessageType, seqid int32) error { err := tdp.Delegate.WriteMessageBegin(ctx, name, typeId, seqid) - tdp.logf("%sWriteMessageBegin(name=%#v, typeId=%#v, seqid=%#v) => %#v", tdp.LogPrefix, name, typeId, seqid, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteMessageBegin", + "name", name, + "typeId", typeId, + "seqid", seqid, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteMessageBegin(ctx, name, typeId, seqid) } @@ -100,7 +107,11 @@ func (tdp *TDebugProtocol) WriteMessageBegin(ctx context.Context, name string, t } func (tdp *TDebugProtocol) WriteMessageEnd(ctx context.Context) error { err := tdp.Delegate.WriteMessageEnd(ctx) - tdp.logf("%sWriteMessageEnd() => %#v", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteMessageEnd", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteMessageEnd(ctx) } @@ -108,7 +119,12 @@ func (tdp *TDebugProtocol) WriteMessageEnd(ctx context.Context) error { } func (tdp *TDebugProtocol) WriteStructBegin(ctx context.Context, name string) error { err := tdp.Delegate.WriteStructBegin(ctx, name) - tdp.logf("%sWriteStructBegin(name=%#v) => %#v", tdp.LogPrefix, name, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteStructBegin", + "name", name, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteStructBegin(ctx, name) } @@ -116,7 +132,11 @@ func (tdp *TDebugProtocol) WriteStructBegin(ctx context.Context, name string) er } func (tdp *TDebugProtocol) WriteStructEnd(ctx context.Context) error { err := tdp.Delegate.WriteStructEnd(ctx) - tdp.logf("%sWriteStructEnd() => %#v", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteStructEnd", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteStructEnd(ctx) } @@ -124,7 +144,14 @@ func (tdp *TDebugProtocol) WriteStructEnd(ctx context.Context) error { } func (tdp *TDebugProtocol) WriteFieldBegin(ctx context.Context, name string, typeId TType, id int16) error { err := tdp.Delegate.WriteFieldBegin(ctx, name, typeId, id) - tdp.logf("%sWriteFieldBegin(name=%#v, typeId=%#v, id%#v) => %#v", tdp.LogPrefix, name, typeId, id, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteFieldBegin", + "name", name, + "typeId", typeId, + "id", id, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteFieldBegin(ctx, name, typeId, id) } @@ -132,7 +159,11 @@ func (tdp *TDebugProtocol) WriteFieldBegin(ctx context.Context, name string, typ } func (tdp *TDebugProtocol) WriteFieldEnd(ctx context.Context) error { err := tdp.Delegate.WriteFieldEnd(ctx) - tdp.logf("%sWriteFieldEnd() => %#v", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteFieldEnd", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteFieldEnd(ctx) } @@ -140,7 +171,11 @@ func (tdp *TDebugProtocol) WriteFieldEnd(ctx context.Context) error { } func (tdp *TDebugProtocol) WriteFieldStop(ctx context.Context) error { err := tdp.Delegate.WriteFieldStop(ctx) - tdp.logf("%sWriteFieldStop() => %#v", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteFieldStop", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteFieldStop(ctx) } @@ -148,7 +183,14 @@ func (tdp *TDebugProtocol) WriteFieldStop(ctx context.Context) error { } func (tdp *TDebugProtocol) WriteMapBegin(ctx context.Context, keyType TType, valueType TType, size int) error { err := tdp.Delegate.WriteMapBegin(ctx, keyType, valueType, size) - tdp.logf("%sWriteMapBegin(keyType=%#v, valueType=%#v, size=%#v) => %#v", tdp.LogPrefix, keyType, valueType, size, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteMapBegin", + "keyType", keyType, + "valueType", valueType, + "size", size, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteMapBegin(ctx, keyType, valueType, size) } @@ -156,7 +198,11 @@ func (tdp *TDebugProtocol) WriteMapBegin(ctx context.Context, keyType TType, val } func (tdp *TDebugProtocol) WriteMapEnd(ctx context.Context) error { err := tdp.Delegate.WriteMapEnd(ctx) - tdp.logf("%sWriteMapEnd() => %#v", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteMapEnd", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteMapEnd(ctx) } @@ -164,7 +210,13 @@ func (tdp *TDebugProtocol) WriteMapEnd(ctx context.Context) error { } func (tdp *TDebugProtocol) WriteListBegin(ctx context.Context, elemType TType, size int) error { err := tdp.Delegate.WriteListBegin(ctx, elemType, size) - tdp.logf("%sWriteListBegin(elemType=%#v, size=%#v) => %#v", tdp.LogPrefix, elemType, size, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteListBegin", + "elemType", elemType, + "size", size, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteListBegin(ctx, elemType, size) } @@ -172,7 +224,11 @@ func (tdp *TDebugProtocol) WriteListBegin(ctx context.Context, elemType TType, s } func (tdp *TDebugProtocol) WriteListEnd(ctx context.Context) error { err := tdp.Delegate.WriteListEnd(ctx) - tdp.logf("%sWriteListEnd() => %#v", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteListEnd", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteListEnd(ctx) } @@ -180,7 +236,13 @@ func (tdp *TDebugProtocol) WriteListEnd(ctx context.Context) error { } func (tdp *TDebugProtocol) WriteSetBegin(ctx context.Context, elemType TType, size int) error { err := tdp.Delegate.WriteSetBegin(ctx, elemType, size) - tdp.logf("%sWriteSetBegin(elemType=%#v, size=%#v) => %#v", tdp.LogPrefix, elemType, size, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteSetBegin", + "elemType", elemType, + "size", size, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteSetBegin(ctx, elemType, size) } @@ -188,7 +250,11 @@ func (tdp *TDebugProtocol) WriteSetBegin(ctx context.Context, elemType TType, si } func (tdp *TDebugProtocol) WriteSetEnd(ctx context.Context) error { err := tdp.Delegate.WriteSetEnd(ctx) - tdp.logf("%sWriteSetEnd() => %#v", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteSetEnd", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteSetEnd(ctx) } @@ -196,7 +262,12 @@ func (tdp *TDebugProtocol) WriteSetEnd(ctx context.Context) error { } func (tdp *TDebugProtocol) WriteBool(ctx context.Context, value bool) error { err := tdp.Delegate.WriteBool(ctx, value) - tdp.logf("%sWriteBool(value=%#v) => %#v", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteBool", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteBool(ctx, value) } @@ -204,7 +275,12 @@ func (tdp *TDebugProtocol) WriteBool(ctx context.Context, value bool) error { } func (tdp *TDebugProtocol) WriteByte(ctx context.Context, value int8) error { err := tdp.Delegate.WriteByte(ctx, value) - tdp.logf("%sWriteByte(value=%#v) => %#v", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteByte", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteByte(ctx, value) } @@ -212,7 +288,12 @@ func (tdp *TDebugProtocol) WriteByte(ctx context.Context, value int8) error { } func (tdp *TDebugProtocol) WriteI16(ctx context.Context, value int16) error { err := tdp.Delegate.WriteI16(ctx, value) - tdp.logf("%sWriteI16(value=%#v) => %#v", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteI16", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteI16(ctx, value) } @@ -220,7 +301,12 @@ func (tdp *TDebugProtocol) WriteI16(ctx context.Context, value int16) error { } func (tdp *TDebugProtocol) WriteI32(ctx context.Context, value int32) error { err := tdp.Delegate.WriteI32(ctx, value) - tdp.logf("%sWriteI32(value=%#v) => %#v", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteI32", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteI32(ctx, value) } @@ -228,7 +314,12 @@ func (tdp *TDebugProtocol) WriteI32(ctx context.Context, value int32) error { } func (tdp *TDebugProtocol) WriteI64(ctx context.Context, value int64) error { err := tdp.Delegate.WriteI64(ctx, value) - tdp.logf("%sWriteI64(value=%#v) => %#v", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteI64", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteI64(ctx, value) } @@ -236,7 +327,12 @@ func (tdp *TDebugProtocol) WriteI64(ctx context.Context, value int64) error { } func (tdp *TDebugProtocol) WriteDouble(ctx context.Context, value float64) error { err := tdp.Delegate.WriteDouble(ctx, value) - tdp.logf("%sWriteDouble(value=%#v) => %#v", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteDouble", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteDouble(ctx, value) } @@ -244,7 +340,12 @@ func (tdp *TDebugProtocol) WriteDouble(ctx context.Context, value float64) error } func (tdp *TDebugProtocol) WriteString(ctx context.Context, value string) error { err := tdp.Delegate.WriteString(ctx, value) - tdp.logf("%sWriteString(value=%#v) => %#v", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteString", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteString(ctx, value) } @@ -252,7 +353,12 @@ func (tdp *TDebugProtocol) WriteString(ctx context.Context, value string) error } func (tdp *TDebugProtocol) WriteBinary(ctx context.Context, value []byte) error { err := tdp.Delegate.WriteBinary(ctx, value) - tdp.logf("%sWriteBinary(value=%#v) => %#v", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteBinary", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteBinary(ctx, value) } @@ -260,7 +366,12 @@ func (tdp *TDebugProtocol) WriteBinary(ctx context.Context, value []byte) error } func (tdp *TDebugProtocol) WriteUUID(ctx context.Context, value Tuuid) error { err := tdp.Delegate.WriteUUID(ctx, value) - tdp.logf("%sWriteUUID(value=%#v) => %#v", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"WriteUUID", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteUUID(ctx, value) } @@ -269,7 +380,14 @@ func (tdp *TDebugProtocol) WriteUUID(ctx context.Context, value Tuuid) error { func (tdp *TDebugProtocol) ReadMessageBegin(ctx context.Context) (name string, typeId TMessageType, seqid int32, err error) { name, typeId, seqid, err = tdp.Delegate.ReadMessageBegin(ctx) - tdp.logf("%sReadMessageBegin() (name=%#v, typeId=%#v, seqid=%#v, err=%#v)", tdp.LogPrefix, name, typeId, seqid, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadMessageBegin", + "name", name, + "typeId", typeId, + "seqid", seqid, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteMessageBegin(ctx, name, typeId, seqid) } @@ -277,7 +395,11 @@ func (tdp *TDebugProtocol) ReadMessageBegin(ctx context.Context) (name string, t } func (tdp *TDebugProtocol) ReadMessageEnd(ctx context.Context) (err error) { err = tdp.Delegate.ReadMessageEnd(ctx) - tdp.logf("%sReadMessageEnd() err=%#v", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadMessageEnd", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteMessageEnd(ctx) } @@ -285,7 +407,12 @@ func (tdp *TDebugProtocol) ReadMessageEnd(ctx context.Context) (err error) { } func (tdp *TDebugProtocol) ReadStructBegin(ctx context.Context) (name string, err error) { name, err = tdp.Delegate.ReadStructBegin(ctx) - tdp.logf("%sReadStructBegin() (name%#v, err=%#v)", tdp.LogPrefix, name, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadStructBegin", + "name", name, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteStructBegin(ctx, name) } @@ -293,7 +420,11 @@ func (tdp *TDebugProtocol) ReadStructBegin(ctx context.Context) (name string, er } func (tdp *TDebugProtocol) ReadStructEnd(ctx context.Context) (err error) { err = tdp.Delegate.ReadStructEnd(ctx) - tdp.logf("%sReadStructEnd() err=%#v", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadStructEnd", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteStructEnd(ctx) } @@ -301,7 +432,14 @@ func (tdp *TDebugProtocol) ReadStructEnd(ctx context.Context) (err error) { } func (tdp *TDebugProtocol) ReadFieldBegin(ctx context.Context) (name string, typeId TType, id int16, err error) { name, typeId, id, err = tdp.Delegate.ReadFieldBegin(ctx) - tdp.logf("%sReadFieldBegin() (name=%#v, typeId=%#v, id=%#v, err=%#v)", tdp.LogPrefix, name, typeId, id, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadFieldBegin", + "name", name, + "typeId", typeId, + "id", id, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteFieldBegin(ctx, name, typeId, id) } @@ -309,7 +447,11 @@ func (tdp *TDebugProtocol) ReadFieldBegin(ctx context.Context) (name string, typ } func (tdp *TDebugProtocol) ReadFieldEnd(ctx context.Context) (err error) { err = tdp.Delegate.ReadFieldEnd(ctx) - tdp.logf("%sReadFieldEnd() err=%#v", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadFieldEnd", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteFieldEnd(ctx) } @@ -317,7 +459,14 @@ func (tdp *TDebugProtocol) ReadFieldEnd(ctx context.Context) (err error) { } func (tdp *TDebugProtocol) ReadMapBegin(ctx context.Context) (keyType TType, valueType TType, size int, err error) { keyType, valueType, size, err = tdp.Delegate.ReadMapBegin(ctx) - tdp.logf("%sReadMapBegin() (keyType=%#v, valueType=%#v, size=%#v, err=%#v)", tdp.LogPrefix, keyType, valueType, size, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadMapBegin", + "keyType", keyType, + "valueType", valueType, + "size", size, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteMapBegin(ctx, keyType, valueType, size) } @@ -325,7 +474,11 @@ func (tdp *TDebugProtocol) ReadMapBegin(ctx context.Context) (keyType TType, val } func (tdp *TDebugProtocol) ReadMapEnd(ctx context.Context) (err error) { err = tdp.Delegate.ReadMapEnd(ctx) - tdp.logf("%sReadMapEnd() err=%#v", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadMapEnd", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteMapEnd(ctx) } @@ -333,7 +486,13 @@ func (tdp *TDebugProtocol) ReadMapEnd(ctx context.Context) (err error) { } func (tdp *TDebugProtocol) ReadListBegin(ctx context.Context) (elemType TType, size int, err error) { elemType, size, err = tdp.Delegate.ReadListBegin(ctx) - tdp.logf("%sReadListBegin() (elemType=%#v, size=%#v, err=%#v)", tdp.LogPrefix, elemType, size, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadListBegin", + "elemType", elemType, + "size", size, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteListBegin(ctx, elemType, size) } @@ -341,7 +500,11 @@ func (tdp *TDebugProtocol) ReadListBegin(ctx context.Context) (elemType TType, s } func (tdp *TDebugProtocol) ReadListEnd(ctx context.Context) (err error) { err = tdp.Delegate.ReadListEnd(ctx) - tdp.logf("%sReadListEnd() err=%#v", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadListEnd", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteListEnd(ctx) } @@ -349,7 +512,13 @@ func (tdp *TDebugProtocol) ReadListEnd(ctx context.Context) (err error) { } func (tdp *TDebugProtocol) ReadSetBegin(ctx context.Context) (elemType TType, size int, err error) { elemType, size, err = tdp.Delegate.ReadSetBegin(ctx) - tdp.logf("%sReadSetBegin() (elemType=%#v, size=%#v, err=%#v)", tdp.LogPrefix, elemType, size, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadSetBegin", + "elemType", elemType, + "size", size, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteSetBegin(ctx, elemType, size) } @@ -357,7 +526,11 @@ func (tdp *TDebugProtocol) ReadSetBegin(ctx context.Context) (elemType TType, si } func (tdp *TDebugProtocol) ReadSetEnd(ctx context.Context) (err error) { err = tdp.Delegate.ReadSetEnd(ctx) - tdp.logf("%sReadSetEnd() err=%#v", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadSetEnd", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteSetEnd(ctx) } @@ -365,7 +538,12 @@ func (tdp *TDebugProtocol) ReadSetEnd(ctx context.Context) (err error) { } func (tdp *TDebugProtocol) ReadBool(ctx context.Context) (value bool, err error) { value, err = tdp.Delegate.ReadBool(ctx) - tdp.logf("%sReadBool() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadBool", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteBool(ctx, value) } @@ -373,7 +551,12 @@ func (tdp *TDebugProtocol) ReadBool(ctx context.Context) (value bool, err error) } func (tdp *TDebugProtocol) ReadByte(ctx context.Context) (value int8, err error) { value, err = tdp.Delegate.ReadByte(ctx) - tdp.logf("%sReadByte() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadByte", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteByte(ctx, value) } @@ -381,7 +564,12 @@ func (tdp *TDebugProtocol) ReadByte(ctx context.Context) (value int8, err error) } func (tdp *TDebugProtocol) ReadI16(ctx context.Context) (value int16, err error) { value, err = tdp.Delegate.ReadI16(ctx) - tdp.logf("%sReadI16() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadI16", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteI16(ctx, value) } @@ -389,7 +577,12 @@ func (tdp *TDebugProtocol) ReadI16(ctx context.Context) (value int16, err error) } func (tdp *TDebugProtocol) ReadI32(ctx context.Context) (value int32, err error) { value, err = tdp.Delegate.ReadI32(ctx) - tdp.logf("%sReadI32() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadI32", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteI32(ctx, value) } @@ -397,7 +590,12 @@ func (tdp *TDebugProtocol) ReadI32(ctx context.Context) (value int32, err error) } func (tdp *TDebugProtocol) ReadI64(ctx context.Context) (value int64, err error) { value, err = tdp.Delegate.ReadI64(ctx) - tdp.logf("%sReadI64() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadI64", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteI64(ctx, value) } @@ -405,7 +603,12 @@ func (tdp *TDebugProtocol) ReadI64(ctx context.Context) (value int64, err error) } func (tdp *TDebugProtocol) ReadDouble(ctx context.Context) (value float64, err error) { value, err = tdp.Delegate.ReadDouble(ctx) - tdp.logf("%sReadDouble() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadDouble", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteDouble(ctx, value) } @@ -413,7 +616,12 @@ func (tdp *TDebugProtocol) ReadDouble(ctx context.Context) (value float64, err e } func (tdp *TDebugProtocol) ReadString(ctx context.Context) (value string, err error) { value, err = tdp.Delegate.ReadString(ctx) - tdp.logf("%sReadString() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadString", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteString(ctx, value) } @@ -421,7 +629,12 @@ func (tdp *TDebugProtocol) ReadString(ctx context.Context) (value string, err er } func (tdp *TDebugProtocol) ReadBinary(ctx context.Context) (value []byte, err error) { value, err = tdp.Delegate.ReadBinary(ctx) - tdp.logf("%sReadBinary() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadBinary", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteBinary(ctx, value) } @@ -429,7 +642,12 @@ func (tdp *TDebugProtocol) ReadBinary(ctx context.Context) (value []byte, err er } func (tdp *TDebugProtocol) ReadUUID(ctx context.Context) (value Tuuid, err error) { value, err = tdp.Delegate.ReadUUID(ctx) - tdp.logf("%sReadUUID() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"ReadUUID", + "value", value, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.WriteUUID(ctx, value) } @@ -437,7 +655,12 @@ func (tdp *TDebugProtocol) ReadUUID(ctx context.Context) (value Tuuid, err error } func (tdp *TDebugProtocol) Skip(ctx context.Context, fieldType TType) (err error) { err = tdp.Delegate.Skip(ctx, fieldType) - tdp.logf("%sSkip(fieldType=%#v) (err=%#v)", tdp.LogPrefix, fieldType, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"Skip", + "fieldType", fieldType, + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.Skip(ctx, fieldType) } @@ -445,7 +668,11 @@ func (tdp *TDebugProtocol) Skip(ctx context.Context, fieldType TType) (err error } func (tdp *TDebugProtocol) Flush(ctx context.Context) (err error) { err = tdp.Delegate.Flush(ctx) - tdp.logf("%sFlush() (err=%#v)", tdp.LogPrefix, err) + slog.DebugContext( + ctx, + tdp.LogPrefix+"Flush", + "err", err, + ) if tdp.DuplicateTo != nil { tdp.DuplicateTo.Flush(ctx) } diff --git a/lib/go/thrift/logger.go b/lib/go/thrift/logger.go index c42aac998b7..4a0affe6229 100644 --- a/lib/go/thrift/logger.go +++ b/lib/go/thrift/logger.go @@ -35,14 +35,23 @@ import ( // // See https://issues.apache.org/jira/browse/THRIFT-4985 for the design // discussion behind it. +// +// Deprecated: This is no longer used by any thrift go library code, +// will be removed in the future version. type Logger func(msg string) // NopLogger is a Logger implementation that does nothing. +// +// Deprecated: This is no longer used by any thrift go library code, +// will be removed in the future version. func NopLogger(msg string) {} // StdLogger wraps stdlib log package into a Logger. // // If logger passed in is nil, it will fallback to use stderr and default flags. +// +// Deprecated: This is no longer used by any thrift go library code, +// will be removed in the future version. func StdLogger(logger *log.Logger) Logger { if logger == nil { logger = log.New(os.Stderr, "", log.LstdFlags) @@ -55,6 +64,9 @@ func StdLogger(logger *log.Logger) Logger { // TestLogger is a Logger implementation can be used in test codes. // // It fails the test when being called. +// +// Deprecated: This is no longer used by any thrift go library code, +// will be removed in the future version. func TestLogger(tb testing.TB) Logger { return func(msg string) { tb.Errorf("logger called with msg: %q", msg) diff --git a/lib/go/thrift/simple_server.go b/lib/go/thrift/simple_server.go index d4f555ccd51..a8634fc5f0e 100644 --- a/lib/go/thrift/simple_server.go +++ b/lib/go/thrift/simple_server.go @@ -22,8 +22,8 @@ package thrift import ( "context" "errors" - "fmt" "io" + "log/slog" "net" "sync" "sync/atomic" @@ -70,7 +70,7 @@ type TSimpleServer struct { // Headers to auto forward in THeaderProtocol forwardHeaders []string - logger Logger + logContext atomic.Pointer[context.Context] } func NewTSimpleServer2(processor TProcessor, serverTransport TServerTransport) *TSimpleServer { @@ -179,8 +179,18 @@ func (p *TSimpleServer) SetForwardHeaders(headers []string) { // // If no logger was set before Serve is called, a default logger using standard // log library will be used. -func (p *TSimpleServer) SetLogger(logger Logger) { - p.logger = logger +// +// Deprecated: The logging inside TSimpleServer is now done via slog on error +// level, this does nothing now. It will be removed in a future version. +func (p *TSimpleServer) SetLogger(_ Logger) {} + +// SetLogContext sets the context to be used when logging errors inside +// TSimpleServer. +// +// If this is not called before calling Serve, context.Background() will be +// used. +func (p *TSimpleServer) SetLogContext(ctx context.Context) { + p.logContext.Store(&ctx) } func (p *TSimpleServer) innerAccept() (int32, error) { @@ -202,7 +212,8 @@ func (p *TSimpleServer) innerAccept() (int32, error) { defer p.wg.Done() defer cancel() if err := p.processRequests(client); err != nil { - p.logger(fmt.Sprintf("error processing request: %v", err)) + ctx := p.logContext.Load() + slog.ErrorContext(*ctx, "error processing request", "err", err) } }() @@ -233,7 +244,7 @@ func (p *TSimpleServer) AcceptLoop() error { } func (p *TSimpleServer) Serve() error { - p.logger = fallbackLogger(p.logger) + p.logContext.CompareAndSwap(nil, Pointer(context.Background())) err := p.Listen() if err != nil { diff --git a/test/go/go.mod b/test/go/go.mod index 723069b7875..f69cdb4438e 100644 --- a/test/go/go.mod +++ b/test/go/go.mod @@ -1,6 +1,6 @@ module github.com/apache/thrift/test/go -go 1.20 +go 1.21 require ( github.com/apache/thrift v0.0.0-00010101000000-000000000000 @@ -9,7 +9,7 @@ require ( require ( golang.org/x/mod v0.4.2 // indirect - golang.org/x/sys v0.7.0 // indirect + golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect golang.org/x/tools v0.1.1 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect ) diff --git a/test/go/go.sum b/test/go/go.sum index b6ad5455ed0..6904b3efe74 100644 --- a/test/go/go.sum +++ b/test/go/go.sum @@ -16,8 +16,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= From 51e541eae3850889f9d698b14dc0cd8b5de1b6f0 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Tue, 21 Nov 2023 16:42:00 -0800 Subject: [PATCH 003/430] THRIFT-5745: Implement slog.LogValuer on go TStructs Client: go Implement slog.LogValuer for all TStruct and TException generated by the compiler for go code. Also add SlogTStructWrapper in the library so we don't have to repeat it in the compiler generated go code. --- .../cpp/src/thrift/generate/t_go_generator.cc | 64 +++++++-- .../test/tests/slog_tstruct_wrapper_test.go | 132 ++++++++++++++++++ lib/go/thrift/slog.go | 55 ++++++++ lib/go/thrift/slog_test.go | 37 +++++ 4 files changed, 275 insertions(+), 13 deletions(-) create mode 100644 lib/go/test/tests/slog_tstruct_wrapper_test.go create mode 100644 lib/go/thrift/slog.go create mode 100644 lib/go/thrift/slog_test.go diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc index 54422c82670..db30c8bae8c 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc @@ -706,6 +706,7 @@ string t_go_generator::go_imports_begin(bool consts) { } system_packages.push_back("errors"); system_packages.push_back("fmt"); + system_packages.push_back("log/slog"); system_packages.push_back("time"); // For the thrift import, always do rename import to make sure it's called thrift. system_packages.push_back("thrift \"" + gen_thrift_import_ + "\""); @@ -726,12 +727,13 @@ string t_go_generator::go_imports_end() { string import_end = string( ")\n\n" "// (needed to ensure safety because of naive import list construction.)\n" - "var _ = thrift.ZERO\n" - "var _ = fmt.Printf\n" - "var _ = errors.New\n" + "var _ = bytes.Equal\n" "var _ = context.Background\n" + "var _ = errors.New\n" + "var _ = fmt.Printf\n" + "var _ = slog.Log\n" "var _ = time.Now\n" - "var _ = bytes.Equal\n" + "var _ = thrift.ZERO\n" "// (needed by validator.)\n" "var _ = strings.Contains\n" "var _ = regexp.MatchString\n\n"); @@ -1308,8 +1310,10 @@ void t_go_generator::generate_go_struct_definition(ostream& out, indent_down(); out << indent() << "}" << endl << endl; out << indent() << "func New" << tstruct_name << "() *" << tstruct_name << " {" << endl; - out << indent() << " return &"; + indent_up(); + out << indent() << "return &"; generate_go_struct_initializer(out, tstruct, is_result || is_args); + indent_down(); out << indent() << "}" << endl << endl; // Default values for optional fields for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -1339,16 +1343,22 @@ void t_go_generator::generate_go_struct_definition(ostream& out, string maybepointer = goOptType != goType ? "*" : ""; out << indent() << "func (p *" << tstruct_name << ") Get" << publicized_name << "() " << goType << " {" << endl; - out << indent() << " if !p.IsSet" << publicized_name << "() {" << endl; - out << indent() << " return " << def_var_name << endl; - out << indent() << " }" << endl; + indent_up(); + out << indent() << "if !p.IsSet" << publicized_name << "() {" << endl; + indent_up(); + out << indent() << "return " << def_var_name << endl; + indent_down(); + out << indent() << "}" << endl; out << indent() << "return " << maybepointer << "p." << publicized_name << endl; + indent_down(); out << indent() << "}" << endl; } else { out << endl; out << indent() << "func (p *" << tstruct_name << ") Get" << publicized_name << "() " << goType << " {" << endl; - out << indent() << " return p." << publicized_name << endl; + indent_up(); + out << indent() << "return p." << publicized_name << endl; + indent_down(); out << indent() << "}" << endl; } } @@ -1365,11 +1375,15 @@ void t_go_generator::generate_go_struct_definition(ostream& out, } out << indent() << "func (p *" << tstruct_name << ") String() string {" << endl; - out << indent() << " if p == nil {" << endl; - out << indent() << " return \"\"" << endl; - out << indent() << " }" << endl; - out << indent() << " return fmt.Sprintf(\"" << escape_string(tstruct_name) << "(%+v)\", *p)" + indent_up(); + out << indent() << "if p == nil {" << endl; + indent_up(); + out << indent() << "return \"\"" << endl; + indent_down(); + out << indent() << "}" << endl; + out << indent() << "return fmt.Sprintf(\"" << escape_string(tstruct_name) << "(%+v)\", *p)" << endl; + indent_down(); out << indent() << "}" << endl << endl; if (is_exception) { @@ -1388,6 +1402,30 @@ void t_go_generator::generate_go_struct_definition(ostream& out, out << indent() << "var _ thrift.TException = (*" << tstruct_name << ")(nil)" << endl << endl; } + + if (!read_write_private_) { + // Generate the implementation of slog.LogValuer, + // see: https://issues.apache.org/jira/browse/THRIFT-5745 + out << indent() << "func (p *" << tstruct_name << ") LogValue() slog.Value {" << endl; + indent_up(); + out << indent() << "if p == nil {" << endl; + indent_up(); + out << indent() << "return slog.AnyValue(nil)" << endl; + indent_down(); + out << indent() << "}" << endl; + out << indent() << "v := thrift.SlogTStructWrapper{" << endl; + indent_up(); + out << indent() << "Type: \"*" << package_name_ << "." << tstruct_name << "\"," << endl; + out << indent() << "Value: p," << endl; + indent_down(); + out << indent() << "}" << endl; + out << indent() << "return slog.AnyValue(v)" << endl; + indent_down(); + out << indent() << "}" << endl << endl; + + out << indent() << "var _ slog.LogValuer = (*" << tstruct_name << ")(nil)" + << endl << endl; + } } /** diff --git a/lib/go/test/tests/slog_tstruct_wrapper_test.go b/lib/go/test/tests/slog_tstruct_wrapper_test.go new file mode 100644 index 00000000000..854c562092b --- /dev/null +++ b/lib/go/test/tests/slog_tstruct_wrapper_test.go @@ -0,0 +1,132 @@ +/* + * 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. + */ + +package tests + +import ( + "log/slog" + "strings" + "testing" + + "github.com/apache/thrift/lib/go/test/gopath/src/forwardtypetest" + "github.com/apache/thrift/lib/go/thrift" +) + +func dropTime(groups []string, a slog.Attr) slog.Attr { + if len(groups) == 0 && a.Key == slog.TimeKey { + return slog.Attr{} + } + return a +} + +func TestSlogTStructWrapperJSON(t *testing.T) { + for _, c := range []struct { + label string + value thrift.TStruct + want string + }{ + { + label: "struct", + value: &forwardtypetest.Struct{ + Foo: &forwardtypetest.Exc{ + Code: thrift.Int32Ptr(10), + }, + }, + want: `{"level":"INFO","msg":"bar","struct":{"type":"*forwardtypetest.Struct","value":{"foo":{"code":10}}}}`, + }, + { + label: "exception", + value: &forwardtypetest.Exc{ + Code: thrift.Int32Ptr(10), + }, + want: `{"level":"INFO","msg":"bar","struct":{"type":"*forwardtypetest.Exc","value":{"code":10}}}`, + }, + { + label: "nil-struct", + value: (*forwardtypetest.Struct)(nil), + want: `{"level":"INFO","msg":"bar","struct":null}`, + }, + { + label: "nil-exception", + value: (*forwardtypetest.Exc)(nil), + want: `{"level":"INFO","msg":"bar","struct":null}`, + }, + } { + t.Run(c.label, func(t *testing.T) { + var sb strings.Builder + logger := slog.New(slog.NewJSONHandler(&sb, &slog.HandlerOptions{ + AddSource: false, + ReplaceAttr: dropTime, + })) + + logger.Info("bar", "struct", c.value) + if got := strings.TrimSuffix(sb.String(), "\n"); got != c.want { + t.Errorf("got %q want %q", got, c.want) + } + }) + } +} + +func TestSlogTStructWrapperText(t *testing.T) { + for _, c := range []struct { + label string + value thrift.TStruct + want string + }{ + { + label: "struct", + value: &forwardtypetest.Struct{ + Foo: &forwardtypetest.Exc{ + Code: thrift.Int32Ptr(10), + }, + }, + want: `level=INFO msg=bar struct="*forwardtypetest.Struct{\"foo\":{\"code\":10}}"`, + }, + { + label: "exception", + value: &forwardtypetest.Exc{ + Code: thrift.Int32Ptr(10), + }, + want: `level=INFO msg=bar struct="*forwardtypetest.Exc{\"code\":10}"`, + }, + { + label: "nil-struct", + value: (*forwardtypetest.Struct)(nil), + want: `level=INFO msg=bar struct=`, + }, + { + label: "nil-exception", + value: (*forwardtypetest.Exc)(nil), + want: `level=INFO msg=bar struct=`, + }, + } { + t.Run(c.label, func(t *testing.T) { + var sb strings.Builder + logger := slog.New(slog.NewTextHandler(&sb, &slog.HandlerOptions{ + AddSource: false, + ReplaceAttr: dropTime, + })) + + logger.Info("bar", "struct", c.value) + if got := strings.TrimSuffix(sb.String(), "\n"); got != c.want { + t.Errorf("got %q want %q", got, c.want) + } + }) + } +} diff --git a/lib/go/thrift/slog.go b/lib/go/thrift/slog.go new file mode 100644 index 00000000000..22545d843d8 --- /dev/null +++ b/lib/go/thrift/slog.go @@ -0,0 +1,55 @@ +/* + * 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. + */ + +package thrift + +import ( + "encoding/json" + "fmt" + "strings" +) + +// SlogTStructWrapper is a wrapper used by the compiler to wrap TStruct and +// TException to be better logged by slog. +type SlogTStructWrapper struct { + Type string `json:"type"` + Value TStruct `json:"value"` +} + +var ( + _ fmt.Stringer = SlogTStructWrapper{} + _ json.Marshaler = SlogTStructWrapper{} +) + +func (w SlogTStructWrapper) MarshalJSON() ([]byte, error) { + // Use an alias to avoid infinite recursion + type alias SlogTStructWrapper + return json.Marshal(alias(w)) +} + +func (w SlogTStructWrapper) String() string { + var sb strings.Builder + sb.WriteString(w.Type) + if err := json.NewEncoder(&sb).Encode(w.Value); err != nil { + // Should not happen, but just in case + return fmt.Sprintf("%s: %v", w.Type, w.Value) + } + // json encoder will write an additional \n at the end, get rid of it + return strings.TrimSuffix(sb.String(), "\n") +} diff --git a/lib/go/thrift/slog_test.go b/lib/go/thrift/slog_test.go new file mode 100644 index 00000000000..f4155d4e002 --- /dev/null +++ b/lib/go/thrift/slog_test.go @@ -0,0 +1,37 @@ +/* + * 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. + */ + +package thrift + +import ( + "encoding/json" + "strings" + "testing" +) + +func TestSlogTStructWrapperJSON(t *testing.T) { + // This test just ensures that we don't have infinite recursion when + // json encoding it. More comprehensive tests are under lib/go/test. + v := SlogTStructWrapper{Type: "foo"} + var sb strings.Builder + if err := json.NewEncoder(&sb).Encode(v); err != nil { + t.Fatal(err) + } + t.Log(strings.TrimSuffix(sb.String(), "\n")) +} From 84b35ff8288c3b9f239eca4c6f7e453d60af206d Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Wed, 7 Feb 2024 17:42:39 -0800 Subject: [PATCH 004/430] THRIFT-5688: Add PyPI publishing github actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is tested with https://github.com/apache/thrift/pull/2927, which published to https://test.pypi.org/project/thrift-test/. I tested locally with: (venv) fishy@penguin:~/work/test$ pip install -i https://test.pypi.org/simple/ thrift-test Looking in indexes: https://test.pypi.org/simple/ Collecting thrift-test Downloading https://test-files.pythonhosted.org/packages/e6/02/5885ea1406f560d0a23351f68acc2892d7f6495b16bfc2eeee8de4649777/thrift-test-0.21.0.tar.gz (62 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.3/62.3 kB 1.4 MB/s eta 0:00:00 Preparing metadata (setup.py) ... done Collecting six>=1.7.2 (from thrift-test) Downloading https://test-files.pythonhosted.org/packages/b3/b2/238e2590826bfdd113244a40d9d3eb26918bd798fc187e2360a8367068db/six-1.10.0.tar.gz (29 kB) Preparing metadata (setup.py) ... done Building wheels for collected packages: thrift-test, six Building wheel for thrift-test (setup.py) ... done Created wheel for thrift-test: filename=thrift_test-0.21.0-cp311-cp311-linux_x86_64.whl size=416914 sha256=3a972bc562be7ed19cb37399e444ed0d373cde5319023974080b625e550901d4 Stored in directory: /home/fishy/.cache/pip/wheels/45/20/1f/d3e1b869ac068d63ca2b2c13a2f4e33a80b360fae7091c8a9b Building wheel for six (setup.py) ... done Created wheel for six: filename=six-1.10.0-py2.py3-none-any.whl size=9942 sha256=74014380446ccf331366316cec0b1aaf40e0162e70307622b493e38e8451115f Stored in directory: /home/fishy/.cache/pip/wheels/e4/18/d0/e02474c90dcf14c511c0f52145d7e72e41ff3fb80b330ba58e Successfully built thrift-test six Installing collected packages: six, thrift-test Successfully installed six-1.10.0 thrift-test-0.21.0 (venv) fishy@penguin:~/work/test$ python3 Python 3.11.7 (main, Dec 8 2023, 14:22:46) [GCC 13.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from thrift.transport import TSocket >>> transport = TSocket.TSocket('localhost', 9090) >>> transport >>> transport.open() Could not connect to any of [('::1', 9090, 0, 0), ('127.0.0.1', 9090)] Traceback (most recent call last): File "", line 1, in File "/home/fishy/work/test/venv/lib/python3.11/site-packages/thrift/transport/TSocket.py", line 149, in open raise TTransportException(type=TTransportException.NOT_OPEN, message=msg) thrift.transport.TTransport.TTransportException: Could not connect to any of [('::1', 9090, 0, 0), ('127.0.0.1', 9090)] >>> from thrift.protocol import fastbinary >>> fastbinary >>> fastbinary.decode_compact >>> If we want to merge this version, I'll enable pending publishing with `pypi.yml` from this repo on pypi [1]. [1]: https://pypi.org/manage/account/publishing/ --- .github/workflows/pypi.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/pypi.yml diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml new file mode 100644 index 00000000000..ad089f0e6dc --- /dev/null +++ b/.github/workflows/pypi.yml @@ -0,0 +1,32 @@ +name: "PyPI publishing" + +on: + release: + types: [published] + +jobs: + pypi-publish: + name: Publish release to PyPI + runs-on: ubuntu-latest + # Specifying a GitHub environment is optional, but strongly encouraged + environment: release + permissions: + # IMPORTANT: this permission is mandatory for trusted publishing + id-token: write + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.8" + + - name: Build + run: | + cd lib/py + python setup.py sdist + + - name: Publish package distributions to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + packages-dir: lib/py/dist/ From 8e828c03d475670c7c53e703a6e27bca71d32388 Mon Sep 17 00:00:00 2001 From: Volodymyr Panivko Date: Mon, 19 Feb 2024 11:34:48 +0100 Subject: [PATCH 005/430] THRIFT-5756 Run php tests in github actions --- .github/workflows/build.yml | 56 +++++++++++++++++++ .gitignore | 5 +- build/docker/ubuntu-bionic/Dockerfile | 5 ++ composer.json | 6 +- lib/php/README.apache.md | 3 +- lib/php/phpunit.xml | 24 ++++++++ lib/php/test/{ => Fixtures}/Fixtures.php | 2 +- .../TJSONProtocolFixtures.php | 2 +- .../TSimpleJSONProtocolFixtures.php | 2 +- lib/php/test/Makefile.am | 37 +++++------- .../ThriftTest.thrift} | 2 +- .../{Validator => Unit}/BaseValidatorTest.php | 16 +++++- .../BinarySerializerTest.php | 23 +++----- .../JsonSerializeTest.php | 21 ++++--- .../{Protocol => Unit}/TJSONProtocolTest.php | 30 +++++----- .../TSimpleJSONProtocolTest.php | 27 ++++----- .../{Validator => Unit}/ValidatorTest.php | 22 ++++---- .../{Validator => Unit}/ValidatorTestOop.php | 22 ++++---- 18 files changed, 188 insertions(+), 117 deletions(-) create mode 100644 lib/php/phpunit.xml rename lib/php/test/{ => Fixtures}/Fixtures.php (99%) rename lib/php/test/{Protocol => Fixtures}/TJSONProtocolFixtures.php (99%) rename lib/php/test/{Protocol => Fixtures}/TSimpleJSONProtocolFixtures.php (99%) rename lib/php/test/{TestValidators.thrift => Resources/ThriftTest.thrift} (95%) rename lib/php/test/{Validator => Unit}/BaseValidatorTest.php (90%) rename lib/php/test/{Protocol => Unit}/BinarySerializerTest.php (72%) rename lib/php/test/{JsonSerialize => Unit}/JsonSerializeTest.php (87%) rename lib/php/test/{Protocol => Unit}/TJSONProtocolTest.php (95%) rename lib/php/test/{Protocol => Unit}/TSimpleJSONProtocolTest.php (92%) rename lib/php/test/{Validator => Unit}/ValidatorTest.php (57%) rename lib/php/test/{Validator => Unit}/ValidatorTestOop.php (57%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aeb1614134a..aca1a37f12f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -76,6 +76,62 @@ jobs: path: compiler/cpp/thrift retention-days: 3 + lib-php: + needs: compiler + runs-on: ubuntu-20.04 + strategy: + matrix: + php-version: [5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2, 8.3] + fail-fast: false + steps: + - uses: actions/checkout@v4 + + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + extensions: mbstring, intl, xml + + - name: Install Dependencies + run: composer install + + - name: Backward compatibility for unit test in php greater then 7.1 + if: matrix.php-version > 7.0 + run: | + sed -i 's/setUp()/setUp():void/' lib/php/test/Unit/*Test.php + sed -i 's/setUpBeforeClass()/setUpBeforeClass():void/' lib/php/test/Unit/*Test.php + + - name: Run bootstrap + run: ./bootstrap.sh + + - name: Run configure + run: | + ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-php/with-php/' | sed 's/without-php_extension/with-php_extension/' ) + + - uses: actions/download-artifact@v3 + with: + name: thrift-compiler + path: compiler/cpp + + - name: Run thrift-compiler + run: | + chmod a+x compiler/cpp/thrift + compiler/cpp/thrift -version + + - name: Build Thrift Classes + run: | + mkdir -p ./lib/php/test/Resources/packages/php + mkdir -p ./lib/php/test/Resources/packages/phpv + mkdir -p ./lib/php/test/Resources/packages/phpvo + mkdir -p ./lib/php/test/Resources/packages/phpjs + compiler/cpp/thrift --gen php -r --out ./lib/php/test/Resources/packages/php lib/php/test/Resources/ThriftTest.thrift + compiler/cpp/thrift --gen php:validate -r --out ./lib/php/test/Resources/packages/phpv lib/php/test/Resources/ThriftTest.thrift + compiler/cpp/thrift --gen php:validate,oop -r --out ./lib/php/test/Resources/packages/phpvo lib/php/test/Resources/ThriftTest.thrift + compiler/cpp/thrift --gen php:json -r --out ./lib/php/test/Resources/packages/phpjs lib/php/test/Resources/ThriftTest.thrift + + - name: Run Tests + run: vendor/bin/phpunit -c lib/php/phpunit.xml + lib-go: needs: compiler runs-on: ubuntu-20.04 diff --git a/.gitignore b/.gitignore index cb8029c9888..0ed47297d13 100644 --- a/.gitignore +++ b/.gitignore @@ -279,9 +279,8 @@ project.lock.json /lib/php/src/ext/thrift_protocol/run-tests.php /lib/php/src/ext/thrift_protocol/thrift_protocol.la /lib/php/src/ext/thrift_protocol/tmp-php.ini -/lib/php/src/packages/ -/lib/php/test/TEST-*.xml -/lib/php/test/packages/ +/lib/php/tests/Resources/packages/ +/lib/php/test/test-log-junit.xml /lib/py/dist/ /lib/erl/logs/ /lib/go/pkg diff --git a/build/docker/ubuntu-bionic/Dockerfile b/build/docker/ubuntu-bionic/Dockerfile index 350921ae50a..5ece6e10d1c 100644 --- a/build/docker/ubuntu-bionic/Dockerfile +++ b/build/docker/ubuntu-bionic/Dockerfile @@ -216,9 +216,14 @@ RUN apt-get install -y --no-install-recommends \ php-dev \ php-json \ php-pear \ + php-mbstring \ + php-xml \ re2c \ composer +RUN pecl install xdebug-3.1.1 && \ + echo "zend_extension=xdebug.so" > /etc/php/7.2/cli/conf.d/20-xdebug.ini + RUN apt-get install -y --no-install-recommends \ `# Python dependencies` \ python-all \ diff --git a/composer.json b/composer.json index 454beeaa9fa..d882a97f724 100644 --- a/composer.json +++ b/composer.json @@ -21,8 +21,10 @@ "php": "^5.5 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "~4.8.36", - "squizlabs/php_codesniffer": "3.*" + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.5 || ^9.3", + "squizlabs/php_codesniffer": "3.*", + "ext-json": "*", + "ext-xml": "*" }, "autoload": { "psr-4": {"Thrift\\": "lib/php/lib/"} diff --git a/lib/php/README.apache.md b/lib/php/README.apache.md index 5e925897596..2fae257afb5 100644 --- a/lib/php/README.apache.md +++ b/lib/php/README.apache.md @@ -29,7 +29,7 @@ you must use a THttpClient transport. Sample Code =========== - +```php open(); $processor->process($protocol, $protocol); $transport->close(); +``` diff --git a/lib/php/phpunit.xml b/lib/php/phpunit.xml new file mode 100644 index 00000000000..a5d287f282d --- /dev/null +++ b/lib/php/phpunit.xml @@ -0,0 +1,24 @@ + + + + + ./src + ./lib + + + + + ./test/Unit + + + diff --git a/lib/php/test/Fixtures.php b/lib/php/test/Fixtures/Fixtures.php similarity index 99% rename from lib/php/test/Fixtures.php rename to lib/php/test/Fixtures/Fixtures.php index fd57d831c5e..eb348fc7101 100644 --- a/lib/php/test/Fixtures.php +++ b/lib/php/test/Fixtures/Fixtures.php @@ -21,7 +21,7 @@ * @package thrift.test */ -namespace Test\Thrift; +namespace Test\Thrift\Fixtures; use ThriftTest\Xtruct; use ThriftTest\Xtruct2; diff --git a/lib/php/test/Protocol/TJSONProtocolFixtures.php b/lib/php/test/Fixtures/TJSONProtocolFixtures.php similarity index 99% rename from lib/php/test/Protocol/TJSONProtocolFixtures.php rename to lib/php/test/Fixtures/TJSONProtocolFixtures.php index dd9039fcac0..81ada779638 100644 --- a/lib/php/test/Protocol/TJSONProtocolFixtures.php +++ b/lib/php/test/Fixtures/TJSONProtocolFixtures.php @@ -21,7 +21,7 @@ * @package thrift.test */ -namespace Test\Thrift\Protocol; +namespace Test\Thrift\Fixtures; class TJSONProtocolFixtures { diff --git a/lib/php/test/Protocol/TSimpleJSONProtocolFixtures.php b/lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php similarity index 99% rename from lib/php/test/Protocol/TSimpleJSONProtocolFixtures.php rename to lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php index 547fd86623d..448eb61261b 100644 --- a/lib/php/test/Protocol/TSimpleJSONProtocolFixtures.php +++ b/lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php @@ -21,7 +21,7 @@ * @package thrift.test */ -namespace test\Thrift\Protocol; +namespace Test\Thrift\Fixtures; class TSimpleJSONProtocolFixtures { diff --git a/lib/php/test/Makefile.am b/lib/php/test/Makefile.am index 30765c34460..c2de405277a 100644 --- a/lib/php/test/Makefile.am +++ b/lib/php/test/Makefile.am @@ -19,37 +19,26 @@ PHPUNIT=php $(top_srcdir)/vendor/bin/phpunit -stubs: ../../../test/v0.16/ThriftTest.thrift TestValidators.thrift - mkdir -p ./packages/php - $(THRIFT) --gen php -r --out ./packages/php ../../../test/v0.16/ThriftTest.thrift - mkdir -p ./packages/phpv - mkdir -p ./packages/phpvo - mkdir -p ./packages/phpjs - $(THRIFT) --gen php:validate -r --out ./packages/phpv TestValidators.thrift - $(THRIFT) --gen php:validate,oop -r --out ./packages/phpvo TestValidators.thrift - $(THRIFT) --gen php:json -r --out ./packages/phpjs TestValidators.thrift +stubs: Resources/ThriftTest.thrift + mkdir -p ./Resources/packages/php + mkdir -p ./Resources/packages/phpv + mkdir -p ./Resources/packages/phpvo + mkdir -p ./Resources/packages/phpjs + $(THRIFT) --gen php -r --out ./Resources/packages/php Resources/ThriftTest.thrift + $(THRIFT) --gen php:validate -r --out ./Resources/packages/phpv Resources/ThriftTest.thrift + $(THRIFT) --gen php:validate,oop -r --out ./Resources/packages/phpvo Resources/ThriftTest.thrift + $(THRIFT) --gen php:json -r --out ./Resources/packages/phpjs Resources/ThriftTest.thrift deps: $(top_srcdir)/composer.json composer install --working-dir=$(top_srcdir) all-local: deps -check-json-serializer: deps stubs - $(PHPUNIT) --log-junit=TEST-log-json-serializer.xml JsonSerialize/ - -check-validator: deps stubs - $(PHPUNIT) --log-junit=TEST-log-validator.xml Validator/ - -check-protocol: deps stubs - $(PHPUNIT) --log-junit=TEST-log-protocol.xml Protocol/ - -check: deps stubs \ - check-protocol \ - check-validator \ - check-json-serializer +check: deps stubs + $(PHPUNIT) --log-junit=test-log-junit.xml -c phpunit.xml / distclean-local: clean-local: - $(RM) -r ./packages - $(RM) TEST-*.xml + $(RM) -r ./Resources/packages + $(RM) test-log-junit.xml diff --git a/lib/php/test/TestValidators.thrift b/lib/php/test/Resources/ThriftTest.thrift similarity index 95% rename from lib/php/test/TestValidators.thrift rename to lib/php/test/Resources/ThriftTest.thrift index a9804704ccc..07ca6e49203 100644 --- a/lib/php/test/TestValidators.thrift +++ b/lib/php/test/Resources/ThriftTest.thrift @@ -19,7 +19,7 @@ namespace php TestValidators -include "../../../test/v0.16/ThriftTest.thrift" +include "../../../../test/v0.16/ThriftTest.thrift" union UnionOfStrings { 1: string aa; diff --git a/lib/php/test/Validator/BaseValidatorTest.php b/lib/php/test/Unit/BaseValidatorTest.php similarity index 90% rename from lib/php/test/Validator/BaseValidatorTest.php rename to lib/php/test/Unit/BaseValidatorTest.php index 60290830e06..4404e72ce98 100644 --- a/lib/php/test/Validator/BaseValidatorTest.php +++ b/lib/php/test/Unit/BaseValidatorTest.php @@ -1,4 +1,5 @@ read($protocol); + $this->assertTrue(true); } public function testWriteEmpty() @@ -73,6 +75,8 @@ public function testWriteEmpty() $bonk->write($protocol); $this->fail('Bonk was able to write an empty object'); } catch (TProtocolException $e) { + $this->expectExceptionMessage('Required field Bonk.message is unset!'); + throw $e; } } @@ -87,6 +91,8 @@ public function testWriteWithMissingRequired() $structa->write($protocol); $this->fail('StructA was able to write an empty object'); } catch (TProtocolException $e) { + $this->expectExceptionMessage('Required field StructA.s is unset!'); + throw $e; } } @@ -114,6 +120,8 @@ protected static function assertHasReadValidator($class) { if (!static::hasReadValidator($class)) { static::fail($class . ' class should have a read validator'); + } else { + static::assertTrue(true); } } @@ -121,6 +129,8 @@ protected static function assertNoReadValidator($class) { if (static::hasReadValidator($class)) { static::fail($class . ' class should not have a write validator'); + } else { + static::assertTrue(true); } } @@ -128,6 +138,8 @@ protected static function assertHasWriteValidator($class) { if (!static::hasWriteValidator($class)) { static::fail($class . ' class should have a write validator'); + } else { + static::assertTrue(true); } } @@ -135,6 +147,8 @@ protected static function assertNoWriteValidator($class) { if (static::hasWriteValidator($class)) { static::fail($class . ' class should not have a write validator'); + } else { + static::assertTrue(true); } } diff --git a/lib/php/test/Protocol/BinarySerializerTest.php b/lib/php/test/Unit/BinarySerializerTest.php similarity index 72% rename from lib/php/test/Protocol/BinarySerializerTest.php rename to lib/php/test/Unit/BinarySerializerTest.php index 71b0bb5066a..b97da74ddcb 100644 --- a/lib/php/test/Protocol/BinarySerializerTest.php +++ b/lib/php/test/Unit/BinarySerializerTest.php @@ -17,33 +17,26 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * @package thrift.test */ -namespace Test\Thrift\Protocol; +namespace Test\Thrift\Unit; use PHPUnit\Framework\TestCase; +use Thrift\ClassLoader\ThriftClassLoader; use Thrift\Serializer\TBinarySerializer; -require __DIR__ . '/../../../../vendor/autoload.php'; - /*** - * This test suite depends on running the compiler against the - * standard ThriftTest.thrift file: - * - * lib/php/test$ ../../../compiler/cpp/thrift --gen php -r \ - * --out ./packages ../../../test/ThriftTest.thrift - * - * @runTestsInSeparateProcesses + * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file: + * lib/php/test$ ../../../compiler/cpp/thrift --gen php -r --out ./Resources/packages/php ./Resources/ThriftTest.thrift */ class BinarySerializerTest extends TestCase { public function setUp() { - /** @var \Composer\Autoload\ClassLoader $loader */ - $loader = require __DIR__ . '/../../../../vendor/autoload.php'; - $loader->addPsr4('', __DIR__ . '/../packages/php'); + $loader = new ThriftClassLoader(); + $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/php'); + $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/php'); + $loader->register(); } /** diff --git a/lib/php/test/JsonSerialize/JsonSerializeTest.php b/lib/php/test/Unit/JsonSerializeTest.php similarity index 87% rename from lib/php/test/JsonSerialize/JsonSerializeTest.php rename to lib/php/test/Unit/JsonSerializeTest.php index c6686525fac..9fdc3f3cf48 100644 --- a/lib/php/test/JsonSerialize/JsonSerializeTest.php +++ b/lib/php/test/Unit/JsonSerializeTest.php @@ -1,4 +1,5 @@ markTestSkipped('Requires PHP 5.4 or newer!'); - } - /** @var \Composer\Autoload\ClassLoader $loader */ - $loader = require __DIR__ . '/../../../../vendor/autoload.php'; - $loader->addPsr4('', __DIR__ . '/../packages/phpjs'); + $loader = new ThriftClassLoader(); + $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/phpjs'); + $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/phpjs'); + $loader->register(); } public function testEmptyStruct() diff --git a/lib/php/test/Protocol/TJSONProtocolTest.php b/lib/php/test/Unit/TJSONProtocolTest.php similarity index 95% rename from lib/php/test/Protocol/TJSONProtocolTest.php rename to lib/php/test/Unit/TJSONProtocolTest.php index bf0ecce4293..178d63bb172 100644 --- a/lib/php/test/Protocol/TJSONProtocolTest.php +++ b/lib/php/test/Unit/TJSONProtocolTest.php @@ -17,27 +17,20 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * @package thrift.test */ -namespace Test\Thrift\Protocol; +namespace Test\Thrift\Unit; use PHPUnit\Framework\TestCase; -use Test\Thrift\Fixtures; +use Test\Thrift\Fixtures\Fixtures; +use Test\Thrift\Fixtures\TJSONProtocolFixtures; +use Thrift\ClassLoader\ThriftClassLoader; use Thrift\Protocol\TJSONProtocol; use Thrift\Transport\TMemoryBuffer; -require __DIR__ . '/../../../../vendor/autoload.php'; - /*** - * This test suite depends on running the compiler against the - * standard ThriftTest.thrift file: - * - * lib/php/test$ ../../../compiler/cpp/thrift --gen php -r \ - * --out ./packages ../../../test/ThriftTest.thrift - * - * @runTestsInSeparateProcesses + * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file: + * lib/php/test$ ../../../compiler/cpp/thrift --gen php -r --out ./Resources/packages/php ./Resources/ThriftTest.thrift */ class TJSONProtocolTest extends TestCase { @@ -46,9 +39,10 @@ class TJSONProtocolTest extends TestCase public static function setUpBeforeClass() { - /** @var \Composer\Autoload\ClassLoader $loader */ - $loader = require __DIR__ . '/../../../../vendor/autoload.php'; - $loader->addPsr4('', __DIR__ . '/../packages/php'); + $loader = new ThriftClassLoader(); + $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/php'); + $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/php'); + $loader->register(); Fixtures::populateTestArgs(); TJSONProtocolFixtures::populateTestArgsJSON(); @@ -265,7 +259,9 @@ public function testVoidRead() TJSONProtocolFixtures::$testArgsJSON['testVoid'] ); $args = new \ThriftTest\ThriftTest_testVoid_args(); - $args->read($this->protocol); + $result = $args->read($this->protocol); + + $this->assertEquals(0, $result); } public function testString1Read() diff --git a/lib/php/test/Protocol/TSimpleJSONProtocolTest.php b/lib/php/test/Unit/TSimpleJSONProtocolTest.php similarity index 92% rename from lib/php/test/Protocol/TSimpleJSONProtocolTest.php rename to lib/php/test/Unit/TSimpleJSONProtocolTest.php index e4a13736ed7..3189d9931e4 100644 --- a/lib/php/test/Protocol/TSimpleJSONProtocolTest.php +++ b/lib/php/test/Unit/TSimpleJSONProtocolTest.php @@ -17,27 +17,20 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * @package thrift.test */ -namespace Test\Thrift\Protocol; +namespace Test\Thrift\Unit; use PHPUnit\Framework\TestCase; -use Test\Thrift\Fixtures; +use Test\Thrift\Fixtures\Fixtures; +use Test\Thrift\Fixtures\TSimpleJSONProtocolFixtures; +use Thrift\ClassLoader\ThriftClassLoader; use Thrift\Protocol\TSimpleJSONProtocol; use Thrift\Transport\TMemoryBuffer; -require __DIR__ . '/../../../../vendor/autoload.php'; - /*** - * This test suite depends on running the compiler against the - * standard ThriftTest.thrift file: - * - * lib/php/test$ ../../../compiler/cpp/thrift --gen php -r \ - * --out ./packages ../../../test/ThriftTest.thrift - * - * @runTestsInSeparateProcesses + * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file: + * lib/php/test$ ../../../compiler/cpp/thrift --gen php -r --out ./Resources/packages/php ./Resources/ThriftTest.thrift */ class TSimpleJSONProtocolTest extends TestCase { @@ -46,10 +39,10 @@ class TSimpleJSONProtocolTest extends TestCase public static function setUpBeforeClass() { - - /** @var \Composer\Autoload\ClassLoader $loader */ - $loader = require __DIR__ . '/../../../../vendor/autoload.php'; - $loader->addPsr4('', __DIR__ . '/../packages/php'); + $loader = new ThriftClassLoader(); + $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/php'); + $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/php'); + $loader->register(); Fixtures::populateTestArgs(); TSimpleJSONProtocolFixtures::populateTestArgsSimpleJSON(); diff --git a/lib/php/test/Validator/ValidatorTest.php b/lib/php/test/Unit/ValidatorTest.php similarity index 57% rename from lib/php/test/Validator/ValidatorTest.php rename to lib/php/test/Unit/ValidatorTest.php index fa6c7a9f7e0..06f6e5502f9 100644 --- a/lib/php/test/Validator/ValidatorTest.php +++ b/lib/php/test/Unit/ValidatorTest.php @@ -1,4 +1,5 @@ addPsr4('', __DIR__ . '/../packages/phpv'); + $loader = new ThriftClassLoader(); + $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/phpv'); + $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/phpv'); + $loader->registerNamespace('TestValidators', __DIR__ . '/../Resources/packages/phpv'); + $loader->registerDefinition('TestValidators', __DIR__ . '/../Resources/packages/phpv'); + $loader->register(); } } diff --git a/lib/php/test/Validator/ValidatorTestOop.php b/lib/php/test/Unit/ValidatorTestOop.php similarity index 57% rename from lib/php/test/Validator/ValidatorTestOop.php rename to lib/php/test/Unit/ValidatorTestOop.php index 93bca4d0cbc..79da11e0390 100644 --- a/lib/php/test/Validator/ValidatorTestOop.php +++ b/lib/php/test/Unit/ValidatorTestOop.php @@ -1,4 +1,5 @@ addPsr4('', __DIR__ . '/../packages/phpvo'); + $loader = new ThriftClassLoader(); + $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/phpvo'); + $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/phpvo'); + $loader->registerNamespace('TestValidators', __DIR__ . '/../Resources/packages/phpvo'); + $loader->registerDefinition('TestValidators', __DIR__ . '/../Resources/packages/phpvo'); + $loader->register(); } } From 09fa37b0e11f91edf20d393567592df036f623e7 Mon Sep 17 00:00:00 2001 From: Volodymyr Panivko Date: Wed, 21 Feb 2024 09:07:46 +0100 Subject: [PATCH 006/430] add ASF Header --- lib/php/phpunit.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/php/phpunit.xml b/lib/php/phpunit.xml index a5d287f282d..53b3f351a9f 100644 --- a/lib/php/phpunit.xml +++ b/lib/php/phpunit.xml @@ -1,4 +1,22 @@ + Date: Mon, 19 Feb 2024 14:24:51 -0800 Subject: [PATCH 007/430] Add license header to pypi workflow file --- .github/workflows/pypi.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index ad089f0e6dc..4fc292dc79c 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -1,3 +1,22 @@ +# +# 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. +# + name: "PyPI publishing" on: From f6927020dd0af68d9db8f2e1f4d656abcf860d8d Mon Sep 17 00:00:00 2001 From: "vladimir.panivko" Date: Sat, 24 Feb 2024 17:12:10 +0100 Subject: [PATCH 008/430] [THRIFT-5760] Update minimal version of php --- .github/workflows/build.yml | 8 +------- composer.json | 4 ++-- doc/install/README.md | 2 +- lib/php/README.md | 2 +- lib/php/test/Unit/BinarySerializerTest.php | 2 +- lib/php/test/Unit/JsonSerializeTest.php | 2 +- lib/php/test/Unit/TJSONProtocolTest.php | 4 ++-- lib/php/test/Unit/TSimpleJSONProtocolTest.php | 4 ++-- lib/php/test/Unit/ValidatorTest.php | 2 +- lib/php/test/Unit/ValidatorTestOop.php | 2 +- 10 files changed, 13 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aca1a37f12f..4ed83389ae2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -81,7 +81,7 @@ jobs: runs-on: ubuntu-20.04 strategy: matrix: - php-version: [5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2, 8.3] + php-version: [7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2, 8.3] fail-fast: false steps: - uses: actions/checkout@v4 @@ -95,12 +95,6 @@ jobs: - name: Install Dependencies run: composer install - - name: Backward compatibility for unit test in php greater then 7.1 - if: matrix.php-version > 7.0 - run: | - sed -i 's/setUp()/setUp():void/' lib/php/test/Unit/*Test.php - sed -i 's/setUpBeforeClass()/setUpBeforeClass():void/' lib/php/test/Unit/*Test.php - - name: Run bootstrap run: ./bootstrap.sh diff --git a/composer.json b/composer.json index d882a97f724..77248a9329e 100644 --- a/composer.json +++ b/composer.json @@ -18,10 +18,10 @@ "issues": "https://issues.apache.org/jira/browse/THRIFT" }, "require": { - "php": "^5.5 || ^7.0 || ^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.5 || ^9.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "squizlabs/php_codesniffer": "3.*", "ext-json": "*", "ext-xml": "*" diff --git a/doc/install/README.md b/doc/install/README.md index d073e918dcf..0ebe77c7110 100644 --- a/doc/install/README.md +++ b/doc/install/README.md @@ -32,7 +32,7 @@ These are only required if you choose to build the libraries for the given langu * Gradle 8.4 * C#: Mono 1.2.4 (and pkg-config to detect it) or Visual Studio 2005+ * Python 2.6 (including header files for extension modules) -* PHP 5.0 (optionally including header files for extension modules) +* PHP 7.1 (optionally including header files for extension modules) * Ruby 1.8 * bundler gem * Erlang R12 (R11 works but not recommended) diff --git a/lib/php/README.md b/lib/php/README.md index e7144fe444e..4bbc9675559 100644 --- a/lib/php/README.md +++ b/lib/php/README.md @@ -21,7 +21,7 @@ under the License. # Using Thrift with PHP -Thrift requires PHP 5. Thrift makes as few assumptions about your PHP +Thrift requires PHP 7.1 Thrift makes as few assumptions about your PHP environment as possible while trying to make some more advanced PHP features (i.e. APCu cacheing using asbolute path URLs) as simple as possible. diff --git a/lib/php/test/Unit/BinarySerializerTest.php b/lib/php/test/Unit/BinarySerializerTest.php index b97da74ddcb..744ca7ad130 100644 --- a/lib/php/test/Unit/BinarySerializerTest.php +++ b/lib/php/test/Unit/BinarySerializerTest.php @@ -31,7 +31,7 @@ */ class BinarySerializerTest extends TestCase { - public function setUp() + public function setUp(): void { $loader = new ThriftClassLoader(); $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/php'); diff --git a/lib/php/test/Unit/JsonSerializeTest.php b/lib/php/test/Unit/JsonSerializeTest.php index 9fdc3f3cf48..66e4d5e376f 100644 --- a/lib/php/test/Unit/JsonSerializeTest.php +++ b/lib/php/test/Unit/JsonSerializeTest.php @@ -31,7 +31,7 @@ */ class JsonSerializeTest extends TestCase { - protected function setUp() + protected function setUp(): void { $loader = new ThriftClassLoader(); $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/phpjs'); diff --git a/lib/php/test/Unit/TJSONProtocolTest.php b/lib/php/test/Unit/TJSONProtocolTest.php index 178d63bb172..9837803708b 100644 --- a/lib/php/test/Unit/TJSONProtocolTest.php +++ b/lib/php/test/Unit/TJSONProtocolTest.php @@ -37,7 +37,7 @@ class TJSONProtocolTest extends TestCase private $transport; private $protocol; - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { $loader = new ThriftClassLoader(); $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/php'); @@ -48,7 +48,7 @@ public static function setUpBeforeClass() TJSONProtocolFixtures::populateTestArgsJSON(); } - public function setUp() + public function setUp(): void { $this->transport = new TMemoryBuffer(); $this->protocol = new TJSONProtocol($this->transport); diff --git a/lib/php/test/Unit/TSimpleJSONProtocolTest.php b/lib/php/test/Unit/TSimpleJSONProtocolTest.php index 3189d9931e4..8e6a6d91743 100644 --- a/lib/php/test/Unit/TSimpleJSONProtocolTest.php +++ b/lib/php/test/Unit/TSimpleJSONProtocolTest.php @@ -37,7 +37,7 @@ class TSimpleJSONProtocolTest extends TestCase private $transport; private $protocol; - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { $loader = new ThriftClassLoader(); $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/php'); @@ -48,7 +48,7 @@ public static function setUpBeforeClass() TSimpleJSONProtocolFixtures::populateTestArgsSimpleJSON(); } - public function setUp() + public function setUp(): void { $this->transport = new TMemoryBuffer(); $this->protocol = new TSimpleJSONProtocol($this->transport); diff --git a/lib/php/test/Unit/ValidatorTest.php b/lib/php/test/Unit/ValidatorTest.php index 06f6e5502f9..b125424c15e 100644 --- a/lib/php/test/Unit/ValidatorTest.php +++ b/lib/php/test/Unit/ValidatorTest.php @@ -29,7 +29,7 @@ */ class ValidatorTest extends BaseValidatorTest { - public function setUp() + public function setUp(): void { $loader = new ThriftClassLoader(); $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/phpv'); diff --git a/lib/php/test/Unit/ValidatorTestOop.php b/lib/php/test/Unit/ValidatorTestOop.php index 79da11e0390..95581825e0c 100644 --- a/lib/php/test/Unit/ValidatorTestOop.php +++ b/lib/php/test/Unit/ValidatorTestOop.php @@ -29,7 +29,7 @@ */ class ValidatorTestOop extends BaseValidatorTest { - public function setUp() + public function setUp(): void { $loader = new ThriftClassLoader(); $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/phpvo'); From ac52d8dac15425f65f6e7ad4ecf776bfea1a3b18 Mon Sep 17 00:00:00 2001 From: Volodymyr Panivko Date: Thu, 22 Feb 2024 22:09:00 +0100 Subject: [PATCH 009/430] [THRIFT-5758] PHP 8.2 Deprecate dynamic properties --- .github/workflows/build.yml | 1 + lib/php/lib/Base/TBase.php | 1 + lib/php/lib/Exception/TException.php | 1 + lib/php/src/Thrift.php | 2 + .../Unit/Lib/Exception/TExceptionTest.php | 60 +++++++++++++++++++ 5 files changed, 65 insertions(+) create mode 100644 lib/php/test/Unit/Lib/Exception/TExceptionTest.php diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4ed83389ae2..b9afd502da1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -91,6 +91,7 @@ jobs: with: php-version: ${{ matrix.php-version }} extensions: mbstring, intl, xml + ini-values: "error_reporting=E_ALL" - name: Install Dependencies run: composer install diff --git a/lib/php/lib/Base/TBase.php b/lib/php/lib/Base/TBase.php index c61b631af60..d946665ecdc 100644 --- a/lib/php/lib/Base/TBase.php +++ b/lib/php/lib/Base/TBase.php @@ -31,6 +31,7 @@ * of PHP. Note that code is intentionally duplicated in here to avoid making * function calls for every field or member of a container.. */ +#[\AllowDynamicProperties] abstract class TBase { public static $tmethod = array( diff --git a/lib/php/lib/Exception/TException.php b/lib/php/lib/Exception/TException.php index 228d761e960..168688c665c 100644 --- a/lib/php/lib/Exception/TException.php +++ b/lib/php/lib/Exception/TException.php @@ -38,6 +38,7 @@ * @param mixed $p1 Message (string) or type-spec (array) * @param mixed $p2 Code (integer) or values (array) */ +#[\AllowDynamicProperties] class TException extends \Exception { public function __construct($p1 = null, $p2 = 0) diff --git a/lib/php/src/Thrift.php b/lib/php/src/Thrift.php index 0364c90812f..1dbf64b0049 100644 --- a/lib/php/src/Thrift.php +++ b/lib/php/src/Thrift.php @@ -68,6 +68,7 @@ class TMessageType * @param mixed $p1 Message (string) or type-spec (array) * @param mixed $p2 Code (integer) or values (array) */ +#[\AllowDynamicProperties] class TException extends Exception { public function __construct($p1=null, $p2=0) @@ -419,6 +420,7 @@ protected function _write($class, $spec, $output) * of PHP. Note that code is intentionally duplicated in here to avoid making * function calls for every field or member of a container.. */ +#[\AllowDynamicProperties] abstract class TBase { static $tmethod = array(TType::BOOL => 'Bool', diff --git a/lib/php/test/Unit/Lib/Exception/TExceptionTest.php b/lib/php/test/Unit/Lib/Exception/TExceptionTest.php new file mode 100644 index 00000000000..add8803b0ea --- /dev/null +++ b/lib/php/test/Unit/Lib/Exception/TExceptionTest.php @@ -0,0 +1,60 @@ +assertInstanceOf(TException::class, $exception); + $this->assertSame($message, $exception->getMessage()); + $this->assertSame($code, $exception->getCode()); + } + + public function testExceptionWithSpecAndVals() + { + $spec = [ + ['var' => 'string'], + ['var' => 'int'], + ['var' => 'bool'], + ]; + + $vals = [ + 'string' => 'Test value', + 'int' => 123456, + 'bool' => true, + ]; + $exception = new TException($spec, $vals); + + $this->assertEquals('Test value', $exception->string); + $this->assertEquals(123456, $exception->int); + $this->assertEquals(true, $exception->bool); + } +} From 58000ccb185d504a03375ebac10a69bf2789440f Mon Sep 17 00:00:00 2001 From: bwangelme Date: Mon, 6 Nov 2023 12:21:38 +0800 Subject: [PATCH 010/430] Fix: fix readMessageBegin name type error Client: ["python"] --- lib/py/src/protocol/TBinaryProtocol.py | 3 ++- lib/py/test/thrift_TBinaryProtocol.py | 28 +++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/lib/py/src/protocol/TBinaryProtocol.py b/lib/py/src/protocol/TBinaryProtocol.py index 6b2facc4f72..e59e0dcbdb6 100644 --- a/lib/py/src/protocol/TBinaryProtocol.py +++ b/lib/py/src/protocol/TBinaryProtocol.py @@ -18,6 +18,7 @@ # from .TProtocol import TType, TProtocolBase, TProtocolException, TProtocolFactory +from ..compat import binary_to_str from struct import pack, unpack @@ -145,7 +146,7 @@ def readMessageBegin(self): if self.strictRead: raise TProtocolException(type=TProtocolException.BAD_VERSION, message='No protocol version header') - name = self.trans.readAll(sz) + name = binary_to_str(self.trans.readAll(sz)) type = self.readByte() seqid = self.readI32() return (name, type, seqid) diff --git a/lib/py/test/thrift_TBinaryProtocol.py b/lib/py/test/thrift_TBinaryProtocol.py index f7d05ff975d..b257626b1f8 100644 --- a/lib/py/test/thrift_TBinaryProtocol.py +++ b/lib/py/test/thrift_TBinaryProtocol.py @@ -152,15 +152,19 @@ def testField(type, data): protocol.readStructEnd() -def testMessage(data): +def testMessage(data, strict=True): message = {} message['name'] = data[0] message['type'] = data[1] message['seqid'] = data[2] + strictRead, strictWrite = True, True + if not strict: + strictRead, strictWrite = False, False + buf = TTransport.TMemoryBuffer() transport = TTransport.TBufferedTransportFactory().getTransport(buf) - protocol = TBinaryProtocol(transport) + protocol = TBinaryProtocol(transport, strictRead=strictRead, strictWrite=strictWrite) protocol.writeMessageBegin(message['name'], message['type'], message['seqid']) protocol.writeMessageEnd() @@ -169,7 +173,7 @@ def testMessage(data): buf = TTransport.TMemoryBuffer(data_r) transport = TTransport.TBufferedTransportFactory().getTransport(buf) - protocol = TBinaryProtocol(transport) + protocol = TBinaryProtocol(transport, strictRead=strictRead, strictWrite=strictWrite) result = protocol.readMessageBegin() protocol.readMessageEnd() return result @@ -259,6 +263,24 @@ def test_TBinaryProtocol_write_read(self): print("Assertion fail") raise e + def test_TBinaryProtocol_no_strict_write_read(self): + TMessageType = {"T_CALL": 1, "T_REPLY": 2, "T_EXCEPTION": 3, "T_ONEWAY": 4} + test_data = [("short message name", TMessageType['T_CALL'], 0), + ("1", TMessageType['T_REPLY'], 12345), + ("loooooooooooooooooooooooooooooooooong", TMessageType['T_EXCEPTION'], 1 << 16), + ("one way push", TMessageType['T_ONEWAY'], 12), + ("Janky", TMessageType['T_CALL'], 0)] + + try: + for dt in test_data: + result = testMessage(dt, strict=False) + self.assertEqual(result[0], dt[0]) + self.assertEqual(result[1], dt[1]) + self.assertEqual(result[2], dt[2]) + except Exception as e: + print("Assertion fail") + raise e + if __name__ == '__main__': unittest.main() From d0bd39ce72af555b9d0e00a581652eae766a7c09 Mon Sep 17 00:00:00 2001 From: Thomas Date: Sun, 25 Feb 2024 23:37:35 +0900 Subject: [PATCH 011/430] THRIFT-5761 Lib/json tests fail Fix the test to expect `typeId` and `class` inside the `type` object instead of on the root level. This is the way the compiler generates is. Old output: ```json "constants": [ { "name": "myNumberz", "typeId": "enum", "type": { "typeId": "enum", "class": "Numberz" }, "value": 1 } ], ``` New output: ``` "constants": [ { "name": "myNumberz", "typeId": "enum", "class": "Numberz", "value": 1 } ], ``` --- lib/json/schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/json/schema.json b/lib/json/schema.json index f7b10dff437..e2b997745c9 100644 --- a/lib/json/schema.json +++ b/lib/json/schema.json @@ -64,7 +64,7 @@ "required": [ "typeId", "keyTypeId", "valueTypeId" ] }, "struct-type": { - "title": "Struct, union and exception schema", + "title": "Struct, union, enum and exception schema", "type": "object", "properties": { "typeId": { @@ -145,9 +145,9 @@ "type": "object", "allOf": [ { "$ref": "#/definitions/name-and-doc" }, - { "$ref": "#/definitions/type-desc" }, { "properties": { + "type": { "$ref": "#/definitions/type-desc" }, "value": { "oneOf": [ { "type": "string" }, From 14fc2be20c9a17c34b2a6d3c10770f9741a3ca8f Mon Sep 17 00:00:00 2001 From: Volodymyr Panivko Date: Thu, 22 Feb 2024 18:17:40 +0100 Subject: [PATCH 012/430] [THRIFT-5757] Unit tests for php lib --- .github/workflows/build.yml | 10 +- lib/php/lib/ClassLoader/ThriftClassLoader.php | 14 +- .../lib/Factory/TBinaryProtocolFactory.php | 16 ++ .../lib/Factory/TCompactProtocolFactory.php | 10 +- lib/php/lib/Factory/TJSONProtocolFactory.php | 10 +- lib/php/lib/Factory/TProtocolFactory.php | 4 +- lib/php/lib/Factory/TStringFuncFactory.php | 1 + lib/php/lib/StringFunc/Core.php | 11 + lib/php/lib/StringFunc/Mbstring.php | 11 + lib/php/lib/StringFunc/TStringFunc.php | 12 + lib/php/test/Makefile.am | 10 +- .../Lib/ClassLoader/Fixtures/A/TestClass.php | 35 +++ .../Lib/ClassLoader/Fixtures/B/TestClass.php | 35 +++ .../Lib/ClassLoader/Fixtures/C/TestClass.php | 35 +++ .../Lib/ClassLoader/Fixtures/D/TestClass.php | 35 +++ .../Lib/ClassLoader/Fixtures/E/TestClass.php | 35 +++ .../Lib/ClassLoader/ThriftClassLoaderTest.php | 223 ++++++++++++++++++ .../Factory/TBinaryProtocolFactoryTest.php | 81 +++++++ .../Factory/TCompactProtocolFactoryTest.php | 50 ++++ .../Factory/TFramedTransportFactoryTest.php | 56 +++++ .../Lib/Factory/TJSONProtocolFactoryTest.php | 50 ++++ .../Lib/Factory/TStringFuncFactoryTest.php | 74 ++++++ .../Lib/Factory/TTransportFactoryTest.php | 43 ++++ lib/php/test/Unit/Lib/StringFunc/CoreTest.php | 215 +++++++++++++++++ .../test/Unit/Lib/StringFunc/MbStringTest.php | 215 +++++++++++++++++ 25 files changed, 1269 insertions(+), 22 deletions(-) create mode 100644 lib/php/test/Unit/Lib/ClassLoader/Fixtures/A/TestClass.php create mode 100644 lib/php/test/Unit/Lib/ClassLoader/Fixtures/B/TestClass.php create mode 100644 lib/php/test/Unit/Lib/ClassLoader/Fixtures/C/TestClass.php create mode 100644 lib/php/test/Unit/Lib/ClassLoader/Fixtures/D/TestClass.php create mode 100644 lib/php/test/Unit/Lib/ClassLoader/Fixtures/E/TestClass.php create mode 100644 lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php create mode 100644 lib/php/test/Unit/Lib/Factory/TBinaryProtocolFactoryTest.php create mode 100644 lib/php/test/Unit/Lib/Factory/TCompactProtocolFactoryTest.php create mode 100644 lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php create mode 100644 lib/php/test/Unit/Lib/Factory/TJSONProtocolFactoryTest.php create mode 100644 lib/php/test/Unit/Lib/Factory/TStringFuncFactoryTest.php create mode 100644 lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php create mode 100644 lib/php/test/Unit/Lib/StringFunc/CoreTest.php create mode 100644 lib/php/test/Unit/Lib/StringFunc/MbStringTest.php diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b9afd502da1..f003db241c7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -119,10 +119,12 @@ jobs: mkdir -p ./lib/php/test/Resources/packages/phpv mkdir -p ./lib/php/test/Resources/packages/phpvo mkdir -p ./lib/php/test/Resources/packages/phpjs - compiler/cpp/thrift --gen php -r --out ./lib/php/test/Resources/packages/php lib/php/test/Resources/ThriftTest.thrift - compiler/cpp/thrift --gen php:validate -r --out ./lib/php/test/Resources/packages/phpv lib/php/test/Resources/ThriftTest.thrift - compiler/cpp/thrift --gen php:validate,oop -r --out ./lib/php/test/Resources/packages/phpvo lib/php/test/Resources/ThriftTest.thrift - compiler/cpp/thrift --gen php:json -r --out ./lib/php/test/Resources/packages/phpjs lib/php/test/Resources/ThriftTest.thrift + mkdir -p ./lib/php/test/Resources/packages/phpcm + compiler/cpp/thrift --gen php -r --out ./lib/php/test/Resources/packages/php lib/php/test/Resources/ThriftTest.thrift + compiler/cpp/thrift --gen php:validate -r --out ./lib/php/test/Resources/packages/phpv lib/php/test/Resources/ThriftTest.thrift + compiler/cpp/thrift --gen php:validate,oop -r --out ./lib/php/test/Resources/packages/phpvo lib/php/test/Resources/ThriftTest.thrift + compiler/cpp/thrift --gen php:json -r --out ./lib/php/test/Resources/packages/phpjs lib/php/test/Resources/ThriftTest.thrift + compiler/cpp/thrift --gen php:classmap,server,rest -r --out ./lib/php/test/Resources/packages/phpcm lib/php/test/Resources/ThriftTest.thrift - name: Run Tests run: vendor/bin/phpunit -c lib/php/phpunit.xml diff --git a/lib/php/lib/ClassLoader/ThriftClassLoader.php b/lib/php/lib/ClassLoader/ThriftClassLoader.php index e4b4a17c0c4..c1da4cb732b 100644 --- a/lib/php/lib/ClassLoader/ThriftClassLoader.php +++ b/lib/php/lib/ClassLoader/ThriftClassLoader.php @@ -1,4 +1,5 @@ apcu && ($file = $this->findFileInApcu($class))) or - ($file = $this->findFile($class)) + if ( + (true === $this->apcu && ($file = $this->findFileInApcu($class))) + || ($file = $this->findFile($class)) ) { require_once $file; } @@ -166,6 +168,7 @@ public function findFile($class) // Ignore wrong call if (count($m) <= 1) { + #HOW TO TEST THIS? HOW TEST CASE SHOULD LOOK LIKE? return; } @@ -183,8 +186,9 @@ public function findFile($class) * Available in service: Interface, Client, Processor, Rest * And every service methods (_.+) */ - if (0 === preg_match('#(.+)(if|client|processor|rest)$#i', $class, $n) and - 0 === preg_match('#(.+)_[a-z0-9]+_(args|result)$#i', $class, $n) + if ( + 0 === preg_match('#(.+)(if|client|processor|rest)$#i', $class, $n) + && 0 === preg_match('#(.+)_[a-z0-9]+_(args|result)$#i', $class, $n) ) { $className = 'Types'; } else { diff --git a/lib/php/lib/Factory/TBinaryProtocolFactory.php b/lib/php/lib/Factory/TBinaryProtocolFactory.php index 2519183df22..fc02d7169aa 100644 --- a/lib/php/lib/Factory/TBinaryProtocolFactory.php +++ b/lib/php/lib/Factory/TBinaryProtocolFactory.php @@ -1,4 +1,5 @@ strictRead_ = $strictRead; $this->strictWrite_ = $strictWrite; } + /** + * @param TTransport $trans + * @return TBinaryProtocol + */ public function getProtocol($trans) { return new TBinaryProtocol($trans, $this->strictRead_, $this->strictWrite_); diff --git a/lib/php/lib/Factory/TCompactProtocolFactory.php b/lib/php/lib/Factory/TCompactProtocolFactory.php index 11fb8ff3369..9171f7b6f02 100644 --- a/lib/php/lib/Factory/TCompactProtocolFactory.php +++ b/lib/php/lib/Factory/TCompactProtocolFactory.php @@ -1,4 +1,5 @@ $paths) { + $loader->registerNamespace($namespace, $paths); + } + $loader->register(); + $loader->loadClass($class); + if ($isClassExist) { + $this->assertTrue(class_exists($class, false), "->loadClass() loads '$class'"); + } else { + $this->assertFalse(class_exists($class, false), "->loadClass() loads '$class'"); + } + } + + public function registerNamespaceDataProvider() + { + yield 'default' => [ + 'namespaces' => [ + 'A' => __DIR__ . '/Fixtures', + ], + 'class' => 'A\TestClass', + ]; + yield 'missedClass' => [ + 'namespaces' => [ + 'A' => __DIR__ . '/Fixtures', + ], + 'class' => 'A\MissedClass', + 'isClassExist' => false, + ]; + yield 'pathAsArray' => [ + 'namespaces' => [ + 'B' => [__DIR__ . '/Fixtures'], + ], + 'class' => 'B\TestClass', + ]; + yield 'loadClassWithSlash' => [ + 'namespaces' => [ + 'C' => __DIR__ . '/Fixtures', + ], + 'class' => '\C\TestClass', + ]; + yield 'severalNamespaces' => [ + 'namespaces' => [ + 'D' => __DIR__ . '/Fixtures', + 'E' => __DIR__ . '/Fixtures', + ], + 'class' => '\E\TestClass', + ]; + yield 'useApcu' => [ + 'namespaces' => [ + 'D' => __DIR__ . '/Fixtures', + 'E' => __DIR__ . '/Fixtures', + ], + 'class' => '\E\TestClass', + 'isClassExist' => true, + 'useApcu' => true, + 'apcuPrefix' => self::APCU_PREFIX, + ]; + } + + /** + * @dataProvider registerDefinitionDataProvider + */ + public function testRegisterDefinition( + $definitions, + $class, + $checkInterfaceExist = false, + $useApcu = false, + $apcuPrefix = null + ) { + $loader = new ThriftClassLoader($useApcu, $apcuPrefix); + foreach ($definitions as $namespace => $paths) { + $loader->registerDefinition($namespace, $paths); + } + $loader->register(); + + $loader->loadClass($class); + if ($checkInterfaceExist) { + $this->assertTrue(interface_exists($class, false), "->loadClass() loads '$class'"); + } else { + $this->assertTrue(class_exists($class, false), "->loadClass() loads '$class'"); + } + } + + public function registerDefinitionDataProvider() + { + yield 'loadType' => [ + 'definitions' => [ + 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => 'ThriftTest\Xtruct', + ]; + yield 'loadInterface' => [ + 'definitions' => [ + 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => '\ThriftTest\ThriftTestIf', + 'checkInterfaceExist' => true, + ]; + yield 'loadClient' => [ + 'definitions' => [ + 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => '\ThriftTest\ThriftTestClient', + ]; + yield 'loadProcessor' => [ + 'definitions' => [ + 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => '\ThriftTest\ThriftTestProcessor', + ]; + yield 'loadRest' => [ + 'definitions' => [ + 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => '\ThriftTest\ThriftTestRest', + ]; + yield 'load_args' => [ + 'definitions' => [ + 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => '\ThriftTest\ThriftTest_testVoid_args', + ]; + yield 'load_result' => [ + 'definitions' => [ + 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => '\ThriftTest\ThriftTest_testVoid_result', + ]; + yield 'pathAsArray' => [ + 'definitions' => [ + 'ThriftTest' => [__DIR__ . '/../../../Resources/packages/phpcm'], + ], + 'class' => 'ThriftTest\Xtruct', + ]; + yield 'severalDefinitions' => [ + 'definitions' => [ + 'ThriftTest' => [__DIR__ . '/../../../Resources/packages/phpcm'], + 'TestValidators' => [__DIR__ . '/../../../Resources/packages/phpcm'], + ], + 'class' => '\TestValidators\TestServiceClient', + ]; + yield 'useApcu' => [ + 'definitions' => [ + 'ThriftTest' => [__DIR__ . '/../../../Resources/packages/phpcm'], + 'TestValidators' => [__DIR__ . '/../../../Resources/packages/phpcm'], + ], + 'class' => '\TestValidators\TestServiceClient', + 'checkInterfaceExist' => false, + 'useApcu' => true, + 'apcuPrefix' => self::APCU_PREFIX, + ]; + } +} + +namespace Thrift\ClassLoader; + +use Test\Thrift\Unit\Lib\ClassLoader\ThriftClassLoaderTest; + +if (!function_exists('apcu_fetch')) { + { + function apcu_fetch($key, &$success = null) + { + if (strpos($key, ThriftClassLoaderTest::APCU_PREFIX) === false) { + throw new \Exception('apcu_fetch error, invalid key'); + } + + return false; + } + + function apcu_store($key, $var, $ttl = 0) + { + if (strpos($key, ThriftClassLoaderTest::APCU_PREFIX) === false) { + throw new \Exception('apcu_store error, invalid key'); + } + + return false; + } + }; +} diff --git a/lib/php/test/Unit/Lib/Factory/TBinaryProtocolFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TBinaryProtocolFactoryTest.php new file mode 100644 index 00000000000..5f7c2a25287 --- /dev/null +++ b/lib/php/test/Unit/Lib/Factory/TBinaryProtocolFactoryTest.php @@ -0,0 +1,81 @@ +createMock(TTransport::class); + $factory = new TBinaryProtocolFactory($strictRead, $strictWrite); + $protocol = $factory->getProtocol($transport); + + $this->assertInstanceOf(TBinaryProtocol::class, $protocol); + + $ref = new \ReflectionClass($protocol); + $refStrictRead = $ref->getProperty('strictRead_'); + $refStrictRead->setAccessible(true); + $refStrictWrite = $ref->getProperty('strictWrite_'); + $refStrictWrite->setAccessible(true); + $refTrans = $ref->getProperty('trans_'); + $refTrans->setAccessible(true); + + $this->assertEquals($strictRead, $refStrictRead->getValue($protocol)); + $this->assertEquals($strictWrite, $refStrictWrite->getValue($protocol)); + $this->assertSame($transport, $refTrans->getValue($protocol)); + } + + public function getProtocolDataProvider() + { + yield 'allTrue' => [ + 'strictRead' => true, + 'strictWrite' => true, + ]; + yield 'allFalse' => [ + 'strictRead' => false, + 'strictWrite' => false, + ]; + yield 'strictReadTrue' => [ + 'strictRead' => true, + 'strictWrite' => false, + ]; + yield 'strictWriteTrue' => [ + 'strictRead' => false, + 'strictWrite' => true, + ]; + } +} diff --git a/lib/php/test/Unit/Lib/Factory/TCompactProtocolFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TCompactProtocolFactoryTest.php new file mode 100644 index 00000000000..f81e789b4c5 --- /dev/null +++ b/lib/php/test/Unit/Lib/Factory/TCompactProtocolFactoryTest.php @@ -0,0 +1,50 @@ +createMock(TTransport::class); + $factory = new TCompactProtocolFactory(); + $protocol = $factory->getProtocol($transport); + + $this->assertInstanceOf(TCompactProtocol::class, $protocol); + + $ref = new \ReflectionClass($protocol); + $refTrans = $ref->getProperty('trans_'); + $refTrans->setAccessible(true); + + $this->assertSame($transport, $refTrans->getValue($protocol)); + } +} diff --git a/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php new file mode 100644 index 00000000000..2cb32d8d3b9 --- /dev/null +++ b/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php @@ -0,0 +1,56 @@ +createMock(TTransport::class); + $factory = new TFramedTransportFactory(); + $framedTransport = $factory::getTransport($transport); + + $this->assertInstanceOf(TFramedTransport::class, $framedTransport); + + $ref = new \ReflectionClass($framedTransport); + $refRead = $ref->getProperty('read_'); + $refRead->setAccessible(true); + $refWrite = $ref->getProperty('write_'); + $refWrite->setAccessible(true); + $refTrans = $ref->getProperty('transport_'); + $refTrans->setAccessible(true); + + $this->assertTrue($refRead->getValue($framedTransport)); + $this->assertTrue($refWrite->getValue($framedTransport)); + $this->assertSame($transport, $refTrans->getValue($framedTransport)); + } +} diff --git a/lib/php/test/Unit/Lib/Factory/TJSONProtocolFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TJSONProtocolFactoryTest.php new file mode 100644 index 00000000000..0685af79707 --- /dev/null +++ b/lib/php/test/Unit/Lib/Factory/TJSONProtocolFactoryTest.php @@ -0,0 +1,50 @@ +createMock(TTransport::class); + $factory = new TJSONProtocolFactory(); + $protocol = $factory->getProtocol($transport); + + $this->assertInstanceOf(TJSONProtocol::class, $protocol); + + $ref = new \ReflectionClass($protocol); + $refTrans = $ref->getProperty('trans_'); + $refTrans->setAccessible(true); + + $this->assertSame($transport, $refTrans->getValue($protocol)); + } +} diff --git a/lib/php/test/Unit/Lib/Factory/TStringFuncFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TStringFuncFactoryTest.php new file mode 100644 index 00000000000..eb4df44d045 --- /dev/null +++ b/lib/php/test/Unit/Lib/Factory/TStringFuncFactoryTest.php @@ -0,0 +1,74 @@ +assertInstanceOf(TStringFunc::class, $stringFunc); + $this->assertInstanceOf(Mbstring::class, $stringFunc); + + /** + * it is a hack to nullable the instance of TStringFuncFactory, and get a new instance based on the new ini_get value + */ + $ref = new \ReflectionClass($factory); + $refInstance = $ref->getProperty('_instance'); + $refInstance->setAccessible(true); + $refInstance->setValue($factory, null); + + $stringFunc = $factory::create(); + $this->assertInstanceOf(TStringFunc::class, $stringFunc); + $this->assertInstanceOf(Core::class, $stringFunc); + } +} + + +namespace Thrift\Factory; + +function ini_get($key) +{ + static $count = 0; + if ($key === 'mbstring.func_overload') { + if ($count === 0) { + $count++; + return 2; + } else { + return 0; + } + } else { + return \ini_get($key); + } +} diff --git a/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php new file mode 100644 index 00000000000..da91b64b355 --- /dev/null +++ b/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php @@ -0,0 +1,43 @@ +createMock(TTransport::class); + $factory = new TTransportFactory(); + $result = $factory::getTransport($transport); + + $this->assertSame($transport, $result); + } +} diff --git a/lib/php/test/Unit/Lib/StringFunc/CoreTest.php b/lib/php/test/Unit/Lib/StringFunc/CoreTest.php new file mode 100644 index 00000000000..73ebbfde306 --- /dev/null +++ b/lib/php/test/Unit/Lib/StringFunc/CoreTest.php @@ -0,0 +1,215 @@ +assertEquals($expected, $core->substr($str, $start, $length)); + } + + /** + * @dataProvider strlenDataProvider + */ + public function testStrlen( + $expectedLength, + $str + ) { + $core = new Core(); + $this->assertEquals($expectedLength, $core->strlen($str)); + } + + public function substrDataProvider() + { + yield 'Afrikaans' => [ + 'expected' => 'Afrikaans', + 'str' => 'Afrikaans', + ]; + yield 'Alemannisch' => [ + 'expected' => 'Alemannisch', + 'str' => 'Alemannisch', + ]; + yield 'Aragonés' => [ + 'expected' => 'Aragonés', + 'str' => 'Aragonés', + ]; + yield 'العربية' => [ + 'expected' => 'العربية', + 'str' => 'العربية', + ]; + yield 'مصرى' => [ + 'expected' => 'مصرى', + 'str' => 'مصرى', + ]; + yield 'മലയാളം' => [ + 'expected' => 'മലയാളം', + 'str' => 'മലയാളം', + ]; + yield 'Slovenščina' => [ + 'expected' => 'Slovenščina', + 'str' => 'Slovenščina', + ]; + yield 'Українська' => [ + 'expected' => 'Українська', + 'str' => 'Українська', + ]; + yield 'اردو' => [ + 'expected' => 'اردو', + 'str' => 'اردو', + ]; + yield '中文' => [ + 'expected' => '中文', + 'str' => '中文', + ]; + yield '粵語' => [ + 'expected' => '粵語', + 'str' => '粵語', + ]; + yield 'Afrikaans_SUB' => [ + 'expected' => 'rikaan', + 'str' => 'Afrikaans', + 'start' => 2, + 'length' => 6, + ]; + yield 'Alemannisch_SUB' => [ + 'expected' => 'emanni', + 'str' => 'Alemannisch', + 'start' => 2, + 'length' => 6, + ]; + yield 'Aragonés_SUB' => [ + 'expected' => 'agoné', + 'str' => 'Aragonés', + 'start' => 2, + 'length' => 6, + ]; + yield 'العربية_SUB' => [ + 'expected' => 'لعر', + 'str' => 'العربية', + 'start' => 2, + 'length' => 6, + ]; + yield 'مصرى_SUB' => [ + 'expected' => 'صرى', + 'str' => 'مصرى', + 'start' => 2, + 'length' => 6, + ]; + yield 'മലയാളം_SUB' => [ + 'expected' => 'ലയ', + 'str' => 'മലയാളം', + 'start' => 3, + 'length' => 6, + ]; + yield 'Slovenščina_SUB' => [ + 'expected' => 'ovenš', + 'str' => 'Slovenščina', + 'start' => 2, + 'length' => 6, + ]; + yield 'Українська_SUB' => [ + 'expected' => 'кра', + 'str' => 'Українська', + 'start' => 2, + 'length' => 6, + ]; + yield 'اردو_SUB' => [ + 'expected' => 'ردو', + 'str' => 'اردو', + 'start' => 2, + 'length' => 6, + ]; + yield '中文_SUB' => [ + 'expected' => '文', + 'str' => '中文', + 'start' => 3, + 'length' => 3, + ]; + yield '粵語_SUB' => [ + 'expected' => '語', + 'str' => '粵語', + 'start' => 3, + 'length' => 3, + ]; + } + + public function strlenDataProvider() + { + yield 'Afrikaans' => [ + 'expectedLength' => 9, + 'str' => 'Afrikaans', + ]; + yield 'Alemannisch' => [ + 'expectedLength' => 11, + 'str' => 'Alemannisch', + ]; + yield 'Aragonés' => [ + 'expectedLength' => 9, + 'str' => 'Aragonés', + ]; + yield 'العربية' => [ + 'expectedLength' => 14, + 'str' => 'العربية', + ]; + yield 'مصرى' => [ + 'expectedLength' => 8, + 'str' => 'مصرى', + ]; + yield 'മലയാളം' => [ + 'expectedLength' => 18, + 'str' => 'മലയാളം', + ]; + yield 'Slovenščina' => [ + 'expectedLength' => 13, + 'str' => 'Slovenščina', + ]; + yield 'Українська' => [ + 'expectedLength' => 20, + 'str' => 'Українська', + ]; + yield 'اردو' => [ + 'expectedLength' => 8, + 'str' => 'اردو', + ]; + yield '中文' => [ + 'expectedLength' => 6, + 'str' => '中文', + ]; + yield '粵語' => [ + 'expectedLength' => 6, + 'str' => '粵語', + ]; + } +} diff --git a/lib/php/test/Unit/Lib/StringFunc/MbStringTest.php b/lib/php/test/Unit/Lib/StringFunc/MbStringTest.php new file mode 100644 index 00000000000..5827f919eac --- /dev/null +++ b/lib/php/test/Unit/Lib/StringFunc/MbStringTest.php @@ -0,0 +1,215 @@ +assertEquals($expected, $core->substr($str, $start, $length)); + } + + /** + * @dataProvider strlenDataProvider + */ + public function testStrlen( + $expectedLength, + $str + ) { + $core = new Mbstring(); + $this->assertEquals($expectedLength, $core->strlen($str)); + } + + public function substrDataProvider() + { + yield 'Afrikaans' => [ + 'expected' => 'Afrikaans', + 'str' => 'Afrikaans', + ]; + yield 'Alemannisch' => [ + 'expected' => 'Alemannisch', + 'str' => 'Alemannisch', + ]; + yield 'Aragonés' => [ + 'expected' => 'Aragonés', + 'str' => 'Aragonés', + ]; + yield 'العربية' => [ + 'expected' => 'العربية', + 'str' => 'العربية', + ]; + yield 'مصرى' => [ + 'expected' => 'مصرى', + 'str' => 'مصرى', + ]; + yield 'മലയാളം' => [ + 'expected' => 'മലയാളം', + 'str' => 'മലയാളം', + ]; + yield 'Slovenščina' => [ + 'expected' => 'Slovenščina', + 'str' => 'Slovenščina', + ]; + yield 'Українська' => [ + 'expected' => 'Українська', + 'str' => 'Українська', + ]; + yield 'اردو' => [ + 'expected' => 'اردو', + 'str' => 'اردو', + ]; + yield '中文' => [ + 'expected' => '中文', + 'str' => '中文', + ]; + yield '粵語' => [ + 'expected' => '粵語', + 'str' => '粵語', + ]; + yield 'Afrikaans_SUB' => [ + 'expected' => 'rikaan', + 'str' => 'Afrikaans', + 'start' => 2, + 'length' => 6, + ]; + yield 'Alemannisch_SUB' => [ + 'expected' => 'emanni', + 'str' => 'Alemannisch', + 'start' => 2, + 'length' => 6, + ]; + yield 'Aragonés_SUB' => [ + 'expected' => 'agoné', + 'str' => 'Aragonés', + 'start' => 2, + 'length' => 6, + ]; + yield 'العربية_SUB' => [ + 'expected' => 'لعر', + 'str' => 'العربية', + 'start' => 2, + 'length' => 6, + ]; + yield 'مصرى_SUB' => [ + 'expected' => 'صرى', + 'str' => 'مصرى', + 'start' => 2, + 'length' => 6, + ]; + yield 'മലയാളം_SUB' => [ + 'expected' => 'ലയ', + 'str' => 'മലയാളം', + 'start' => 3, + 'length' => 6, + ]; + yield 'Slovenščina_SUB' => [ + 'expected' => 'ovenš', + 'str' => 'Slovenščina', + 'start' => 2, + 'length' => 6, + ]; + yield 'Українська_SUB' => [ + 'expected' => 'кра', + 'str' => 'Українська', + 'start' => 2, + 'length' => 6, + ]; + yield 'اردو_SUB' => [ + 'expected' => 'ردو', + 'str' => 'اردو', + 'start' => 2, + 'length' => 6, + ]; + yield '中文_SUB' => [ + 'expected' => '文', + 'str' => '中文', + 'start' => 3, + 'length' => 3, + ]; + yield '粵語_SUB' => [ + 'expected' => '語', + 'str' => '粵語', + 'start' => 3, + 'length' => 3, + ]; + } + + public function strlenDataProvider() + { + yield 'Afrikaans' => [ + 'expectedLength' => 9, + 'str' => 'Afrikaans', + ]; + yield 'Alemannisch' => [ + 'expectedLength' => 11, + 'str' => 'Alemannisch', + ]; + yield 'Aragonés' => [ + 'expectedLength' => 9, + 'str' => 'Aragonés', + ]; + yield 'العربية' => [ + 'expectedLength' => 14, + 'str' => 'العربية', + ]; + yield 'مصرى' => [ + 'expectedLength' => 8, + 'str' => 'مصرى', + ]; + yield 'മലയാളം' => [ + 'expectedLength' => 18, + 'str' => 'മലയാളം', + ]; + yield 'Slovenščina' => [ + 'expectedLength' => 13, + 'str' => 'Slovenščina', + ]; + yield 'Українська' => [ + 'expectedLength' => 20, + 'str' => 'Українська', + ]; + yield 'اردو' => [ + 'expectedLength' => 8, + 'str' => 'اردو', + ]; + yield '中文' => [ + 'expectedLength' => 6, + 'str' => '中文', + ]; + yield '粵語' => [ + 'expectedLength' => 6, + 'str' => '粵語', + ]; + } +} From 3a6ee00d6f4580ae8713121dcb7352c728965a17 Mon Sep 17 00:00:00 2001 From: Volodymyr Panivko Date: Fri, 23 Feb 2024 20:04:20 +0100 Subject: [PATCH 013/430] Update lib/php/test/Unit/Lib/StringFunc/MbStringTest.php Co-authored-by: Pavel Kvach --- lib/php/test/Unit/Lib/StringFunc/MbStringTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/php/test/Unit/Lib/StringFunc/MbStringTest.php b/lib/php/test/Unit/Lib/StringFunc/MbStringTest.php index 5827f919eac..5670219955e 100644 --- a/lib/php/test/Unit/Lib/StringFunc/MbStringTest.php +++ b/lib/php/test/Unit/Lib/StringFunc/MbStringTest.php @@ -20,7 +20,7 @@ * */ -namespace Unit\Lib\StringFunc; +namespace Test\Thrift\Unit\Lib\StringFunc; use PHPUnit\Framework\TestCase; use Thrift\StringFunc\Mbstring; From d1a4fee5df0a4b375bfef2a33783b4f5035904df Mon Sep 17 00:00:00 2001 From: Volodymyr Panivko Date: Fri, 23 Feb 2024 20:04:29 +0100 Subject: [PATCH 014/430] Update lib/php/test/Unit/Lib/StringFunc/CoreTest.php Co-authored-by: Pavel Kvach --- lib/php/test/Unit/Lib/StringFunc/CoreTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/php/test/Unit/Lib/StringFunc/CoreTest.php b/lib/php/test/Unit/Lib/StringFunc/CoreTest.php index 73ebbfde306..b2eaac23d29 100644 --- a/lib/php/test/Unit/Lib/StringFunc/CoreTest.php +++ b/lib/php/test/Unit/Lib/StringFunc/CoreTest.php @@ -20,7 +20,7 @@ * */ -namespace Unit\Lib\StringFunc; +namespace Test\Thrift\Unit\Lib\StringFunc; use PHPUnit\Framework\TestCase; use Thrift\StringFunc\Core; From da2ef3486ba5c0f27e470f010590b14d330f799a Mon Sep 17 00:00:00 2001 From: Volodymyr Panivko Date: Fri, 23 Feb 2024 22:51:59 +0100 Subject: [PATCH 015/430] Update lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php Co-authored-by: Pavel Kvach --- lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php b/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php index 2fa05c2cbd0..1180211243c 100644 --- a/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php +++ b/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php @@ -219,5 +219,5 @@ function apcu_store($key, $var, $ttl = 0) return false; } - }; + } } From 8148f2ff9740c11417b7e2d2800c07129be2092d Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 26 Feb 2024 21:45:05 +0900 Subject: [PATCH 016/430] THRIFT-5706: lib/cpp Fix the Security tests on openssl 1.1 and 3.0 This PR fixes the Security tests to build on a clean install of ubuntu 20.04 and ubuntu 22.04 without modifications to the systems openssl configuration. * Enable TLS 1.0 and TLS 1.1 on OpenSSL 1.1 with the seclevel=0 flag * Disable TLS 1.0 and TLS 1.1 on OpenSSL 3.0 While its technically possible to enable it on OpenSSL 3 I think because of all the issues with these old TLS versions dropping support for it is better. This PR builds forth on the work done here: https://github.com/apache/thrift/pull/2811 Tested with the ubuntu 20.04 (OpenSSL 1.1) and 22.04 (OpenSSL 3.0) docker containers. All lib/cpp tests succeed in both. --- lib/cpp/test/SecurityFromBufferTest.cpp | 21 ++++++++++++++++----- lib/cpp/test/SecurityTest.cpp | 21 ++++++++++++++++----- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/cpp/test/SecurityFromBufferTest.cpp b/lib/cpp/test/SecurityFromBufferTest.cpp index 65ec8b6a26a..c4f5c8ed020 100644 --- a/lib/cpp/test/SecurityFromBufferTest.cpp +++ b/lib/cpp/test/SecurityFromBufferTest.cpp @@ -109,7 +109,13 @@ struct SecurityFromBufferFixture { shared_ptr pServerSocket; pServerSocketFactory.reset(new TSSLSocketFactory(static_cast(protocol))); - pServerSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); + #if OPENSSL_VERSION_NUMBER >= 0x10100000L && OPENSSL_VERSION_NUMBER < 0x30000000L + // OpenSSL 1.1.0 introduced @SECLEVEL. Modern distributions limit TLS 1.0/1.1 + // to @SECLEVEL=0 or 1, so specify it to test all combinations. + pServerSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@SECLEVEL=0"); + #else + pServerSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); + #endif pServerSocketFactory->loadCertificateFromBuffer(certString("server.crt").c_str()); pServerSocketFactory->loadPrivateKeyFromBuffer(certString("server.key").c_str()); pServerSocketFactory->server(true); @@ -155,6 +161,11 @@ struct SecurityFromBufferFixture { try { pClientSocketFactory.reset(new TSSLSocketFactory(static_cast(protocol))); pClientSocketFactory->authenticate(true); + #if OPENSSL_VERSION_NUMBER >= 0x10100000L && OPENSSL_VERSION_NUMBER < 0x30000000L + // OpenSSL 1.1.0 introduced @SECLEVEL. Modern distributions limit TLS 1.0/1.1 + // to @SECLEVEL=0 or 1, so specify it to test all combinations. + pClientSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@SECLEVEL=0"); + #endif pClientSocketFactory->loadCertificateFromBuffer(certString("client.crt").c_str()); pClientSocketFactory->loadPrivateKeyFromBuffer(certString("client.key").c_str()); pClientSocketFactory->loadTrustedCertificatesFromBuffer(certString("CA.pem").c_str()); @@ -199,16 +210,16 @@ BOOST_AUTO_TEST_CASE(ssl_security_matrix) { try { // matrix of connection success between client and server with different SSLProtocol selections static_assert(apache::thrift::transport::LATEST == 5, "Mismatch in assumed number of ssl protocols"); - bool ossl1 = (OPENSSL_VERSION_NUMBER < 0x30000000L); + bool ossl1x = (OPENSSL_VERSION_NUMBER < 0x30000000L); bool matrix[apache::thrift::transport::LATEST + 1][apache::thrift::transport::LATEST + 1] = { // server = SSLTLS SSLv2 SSLv3 TLSv1_0 TLSv1_1 TLSv1_2 // client - /* SSLTLS */ { true, false, false, ossl1, ossl1, true }, + /* SSLTLS */ { true, false, false, ossl1x, ossl1x, true }, /* SSLv2 */ { false, false, false, false, false, false }, /* SSLv3 */ { false, false, true, false, false, false }, - /* TLSv1_0 */ { ossl1, false, false, ossl1, false, false }, - /* TLSv1_1 */ { ossl1, false, false, false, ossl1, false }, + /* TLSv1_0 */ { ossl1x, false, false, ossl1x, false, false }, + /* TLSv1_1 */ { ossl1x, false, false, false, ossl1x, false }, /* TLSv1_2 */ { true, false, false, false, false, true } }; diff --git a/lib/cpp/test/SecurityTest.cpp b/lib/cpp/test/SecurityTest.cpp index 06ee8fe57aa..4c6c732671f 100644 --- a/lib/cpp/test/SecurityTest.cpp +++ b/lib/cpp/test/SecurityTest.cpp @@ -108,7 +108,13 @@ struct SecurityFixture shared_ptr pServerSocket; pServerSocketFactory.reset(new TSSLSocketFactory(static_cast(protocol))); - pServerSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); + #if OPENSSL_VERSION_NUMBER >= 0x10100000L && OPENSSL_VERSION_NUMBER < 0x30000000L + // OpenSSL 1.1.0 introduced @SECLEVEL. Modern distributions limit TLS 1.0/1.1 + // to @SECLEVEL=0 or 1, so specify it to test all combinations. + pServerSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@SECLEVEL=0:@STRENGTH"); + #else + pServerSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); + #endif pServerSocketFactory->loadCertificate(certFile("server.crt").string().c_str()); pServerSocketFactory->loadPrivateKey(certFile("server.key").string().c_str()); pServerSocketFactory->server(true); @@ -162,6 +168,11 @@ struct SecurityFixture { pClientSocketFactory.reset(new TSSLSocketFactory(static_cast(protocol))); pClientSocketFactory->authenticate(true); + #if OPENSSL_VERSION_NUMBER >= 0x10100000L && OPENSSL_VERSION_NUMBER < 0x30000000L + // OpenSSL 1.1.0 introduced @SECLEVEL. Modern distributions limit TLS 1.0/1.1 + // to @SECLEVEL=0 or 1, so specify it to test all combinations. + pClientSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@SECLEVEL=0"); + #endif pClientSocketFactory->loadCertificate(certFile("client.crt").string().c_str()); pClientSocketFactory->loadPrivateKey(certFile("client.key").string().c_str()); pClientSocketFactory->loadTrustedCertificates(certFile("CA.pem").string().c_str()); @@ -221,16 +232,16 @@ BOOST_AUTO_TEST_CASE(ssl_security_matrix) { // matrix of connection success between client and server with different SSLProtocol selections static_assert(apache::thrift::transport::LATEST == 5, "Mismatch in assumed number of ssl protocols"); - bool ossl1 = (OPENSSL_VERSION_NUMBER < 0x30000000L); + bool ossl1x = (OPENSSL_VERSION_NUMBER < 0x30000000L); bool matrix[apache::thrift::transport::LATEST + 1][apache::thrift::transport::LATEST + 1] = { // server = SSLTLS SSLv2 SSLv3 TLSv1_0 TLSv1_1 TLSv1_2 // client - /* SSLTLS */ { true, false, false, ossl1, ossl1, true }, + /* SSLTLS */ { true, false, false, ossl1x, ossl1x, true }, /* SSLv2 */ { false, false, false, false, false, false }, /* SSLv3 */ { false, false, true, false, false, false }, - /* TLSv1_0 */ { ossl1, false, false, ossl1, false, false }, - /* TLSv1_1 */ { ossl1, false, false, false, ossl1, false }, + /* TLSv1_0 */ { ossl1x, false, false, ossl1x, false, false }, + /* TLSv1_1 */ { ossl1x, false, false, false, ossl1x, false }, /* TLSv1_2 */ { true, false, false, false, false, true } }; From 3ea763e068fbedf7b7b33b73ca294952543e7930 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 5 Mar 2024 21:30:29 +0900 Subject: [PATCH 017/430] Enable all tests on opensslv3 --- lib/cpp/test/SecurityFromBufferTest.cpp | 11 +++++------ lib/cpp/test/SecurityTest.cpp | 11 +++++------ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/cpp/test/SecurityFromBufferTest.cpp b/lib/cpp/test/SecurityFromBufferTest.cpp index c4f5c8ed020..32f2378d38b 100644 --- a/lib/cpp/test/SecurityFromBufferTest.cpp +++ b/lib/cpp/test/SecurityFromBufferTest.cpp @@ -109,7 +109,7 @@ struct SecurityFromBufferFixture { shared_ptr pServerSocket; pServerSocketFactory.reset(new TSSLSocketFactory(static_cast(protocol))); - #if OPENSSL_VERSION_NUMBER >= 0x10100000L && OPENSSL_VERSION_NUMBER < 0x30000000L + #if OPENSSL_VERSION_NUMBER >= 0x10100000L // OpenSSL 1.1.0 introduced @SECLEVEL. Modern distributions limit TLS 1.0/1.1 // to @SECLEVEL=0 or 1, so specify it to test all combinations. pServerSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@SECLEVEL=0"); @@ -161,7 +161,7 @@ struct SecurityFromBufferFixture { try { pClientSocketFactory.reset(new TSSLSocketFactory(static_cast(protocol))); pClientSocketFactory->authenticate(true); - #if OPENSSL_VERSION_NUMBER >= 0x10100000L && OPENSSL_VERSION_NUMBER < 0x30000000L + #if OPENSSL_VERSION_NUMBER >= 0x10100000L // OpenSSL 1.1.0 introduced @SECLEVEL. Modern distributions limit TLS 1.0/1.1 // to @SECLEVEL=0 or 1, so specify it to test all combinations. pClientSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@SECLEVEL=0"); @@ -210,16 +210,15 @@ BOOST_AUTO_TEST_CASE(ssl_security_matrix) { try { // matrix of connection success between client and server with different SSLProtocol selections static_assert(apache::thrift::transport::LATEST == 5, "Mismatch in assumed number of ssl protocols"); - bool ossl1x = (OPENSSL_VERSION_NUMBER < 0x30000000L); bool matrix[apache::thrift::transport::LATEST + 1][apache::thrift::transport::LATEST + 1] = { // server = SSLTLS SSLv2 SSLv3 TLSv1_0 TLSv1_1 TLSv1_2 // client - /* SSLTLS */ { true, false, false, ossl1x, ossl1x, true }, + /* SSLTLS */ { true, false, false, true, true, true }, /* SSLv2 */ { false, false, false, false, false, false }, /* SSLv3 */ { false, false, true, false, false, false }, - /* TLSv1_0 */ { ossl1x, false, false, ossl1x, false, false }, - /* TLSv1_1 */ { ossl1x, false, false, false, ossl1x, false }, + /* TLSv1_0 */ { true, false, false, true, false, false }, + /* TLSv1_1 */ { true, false, false, false, true, false }, /* TLSv1_2 */ { true, false, false, false, false, true } }; diff --git a/lib/cpp/test/SecurityTest.cpp b/lib/cpp/test/SecurityTest.cpp index 4c6c732671f..cc71f04793d 100644 --- a/lib/cpp/test/SecurityTest.cpp +++ b/lib/cpp/test/SecurityTest.cpp @@ -108,7 +108,7 @@ struct SecurityFixture shared_ptr pServerSocket; pServerSocketFactory.reset(new TSSLSocketFactory(static_cast(protocol))); - #if OPENSSL_VERSION_NUMBER >= 0x10100000L && OPENSSL_VERSION_NUMBER < 0x30000000L + #if OPENSSL_VERSION_NUMBER >= 0x10100000L // OpenSSL 1.1.0 introduced @SECLEVEL. Modern distributions limit TLS 1.0/1.1 // to @SECLEVEL=0 or 1, so specify it to test all combinations. pServerSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@SECLEVEL=0:@STRENGTH"); @@ -168,7 +168,7 @@ struct SecurityFixture { pClientSocketFactory.reset(new TSSLSocketFactory(static_cast(protocol))); pClientSocketFactory->authenticate(true); - #if OPENSSL_VERSION_NUMBER >= 0x10100000L && OPENSSL_VERSION_NUMBER < 0x30000000L + #if OPENSSL_VERSION_NUMBER >= 0x10100000L // OpenSSL 1.1.0 introduced @SECLEVEL. Modern distributions limit TLS 1.0/1.1 // to @SECLEVEL=0 or 1, so specify it to test all combinations. pClientSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@SECLEVEL=0"); @@ -232,16 +232,15 @@ BOOST_AUTO_TEST_CASE(ssl_security_matrix) { // matrix of connection success between client and server with different SSLProtocol selections static_assert(apache::thrift::transport::LATEST == 5, "Mismatch in assumed number of ssl protocols"); - bool ossl1x = (OPENSSL_VERSION_NUMBER < 0x30000000L); bool matrix[apache::thrift::transport::LATEST + 1][apache::thrift::transport::LATEST + 1] = { // server = SSLTLS SSLv2 SSLv3 TLSv1_0 TLSv1_1 TLSv1_2 // client - /* SSLTLS */ { true, false, false, ossl1x, ossl1x, true }, + /* SSLTLS */ { true, false, false, true, true, true }, /* SSLv2 */ { false, false, false, false, false, false }, /* SSLv3 */ { false, false, true, false, false, false }, - /* TLSv1_0 */ { ossl1x, false, false, ossl1x, false, false }, - /* TLSv1_1 */ { ossl1x, false, false, false, ossl1x, false }, + /* TLSv1_0 */ { true, false, false, true, false, false }, + /* TLSv1_1 */ { true, false, false, false, true, false }, /* TLSv1_2 */ { true, false, false, false, false, true } }; From b6cf04941f29ecb4c44ab10ba1c4df3e8bccbaec Mon Sep 17 00:00:00 2001 From: Thomas Date: Sun, 25 Feb 2024 18:05:38 +0900 Subject: [PATCH 018/430] THRIFT-5762 Expose service result objects in Java Some libraries want to bypass the TServer class and handle the full service startup manually. For example when building a service that hosts multiple thrift services where the IFace type is unknown when handling a request. For example when you host multiple services on top of netty and through an HTTP path you want to route to the correct thrift service. In this situation you treat can treat an IFace as an Object and use the `getProcessMapView()` method to parse a byte array into a thrift message and pass let the `AsyncProcessFunction` handle the invocation. To return a correct thrift response it's necessary to write the `{service_name}_result` that contains the response args. While it is possible to get an incoming args object from the (Async)ProcessFunction its unfortunately not possible to get a result object without using reflection. This PR extends the (Async)ProcessFunction by adding a `getEmptyResultInstance` method that returns a new generic `A` (answer) that matches the `{service_name}_result` object. This allows thrift users to write the following processing code: ```java void handleRequest( TProtocol in, TProtocol out, TBaseAsyncProcessor processor, I asyncIface ) throws TException { final Map, TBase, TBase>> processMap = (Map) processor.getProcessMapView(); final var msg = in.readMessageBegin(); final var fn = processMap.get(msg.name); final var args = fn.getEmptyArgsInstance(); args.read(in); in.readMessageEnd(); if (fn.isOneway()) { return; } fn.start(asyncIface, args, new AsyncMethodCallback<>() { @Override public void onComplete(TBase o) { try { out.writeMessageBegin(new TMessage(fn.getMethodName(), TMessageType.REPLY, msg.getSeqid())); final var response_result = fn.getEmptyResultInstance(); final var success_field = response_result.fieldForId(SUCCESS_ID); ((TBase) response_result).setFieldValue(success_field, o); response_result.write(out); out.writeMessageEnd(); out.getTransport().flush(); } catch (TException e) { throw new RuntimeException(e); } } @Override public void onError(Exception e) { try { out.writeMessageBegin(new TMessage(fn.getMethodName(), TMessageType.EXCEPTION, msg.getSeqid())); ((TApplicationException) e).write(out); out.writeMessageEnd(); out.getTransport().flush(); } catch (TException ex) { throw new RuntimeException(ex); } } }); } ``` The above example code doesn't need any reference to the original types and can dynamically create the correct objects to return a correct response. --- .../src/thrift/generate/t_java_generator.cc | 51 +++++-- .../apache/thrift/AsyncProcessFunction.java | 6 +- .../org/apache/thrift/ProcessFunction.java | 141 +++++++++--------- .../apache/thrift/TBaseAsyncProcessor.java | 6 +- .../org/apache/thrift/TBaseProcessor.java | 6 +- .../thrift/server/TSaslNonblockingServer.java | 2 +- 6 files changed, 120 insertions(+), 92 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_java_generator.cc b/compiler/cpp/src/thrift/generate/t_java_generator.cc index d7e0b65939c..1985a3d8494 100644 --- a/compiler/cpp/src/thrift/generate/t_java_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_java_generator.cc @@ -3635,22 +3635,23 @@ void t_java_generator::generate_service_server(t_service* tservice) { indent(f_service_) << "public Processor(I iface) {" << endl; indent(f_service_) << " super(iface, getProcessMap(new java.util.HashMap>()));" + "org.apache.thrift.TBase, ? extends org.apache.thrift.TBase>>()));" << endl; indent(f_service_) << "}" << endl << endl; indent(f_service_) << "protected Processor(I iface, java.util.Map> " - "processMap) {" + "org.apache.thrift.ProcessFunction> processMap) {" << endl; indent(f_service_) << " super(iface, getProcessMap(processMap));" << endl; indent(f_service_) << "}" << endl << endl; - indent(f_service_) << "private static java.util.Map> " + indent(f_service_) << "private static java.util.Map> " "getProcessMap(java.util.Map> processMap) {" + " org.apache.thrift.TBase, ? extends org.apache.thrift.TBase>> processMap) {" << endl; indent_up(); for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -3702,13 +3703,13 @@ void t_java_generator::generate_service_async_server(t_service* tservice) { indent(f_service_) << "public AsyncProcessor(I iface) {" << endl; indent(f_service_) << " super(iface, getProcessMap(new java.util.HashMap>()));" + "org.apache.thrift.TBase, ?, ? extends org.apache.thrift.TBase>>()));" << endl; indent(f_service_) << "}" << endl << endl; indent(f_service_) << "protected AsyncProcessor(I iface, java.util.Map> processMap) {" + "org.apache.thrift.TBase, ?, ? extends org.apache.thrift.TBase>> processMap) {" << endl; indent(f_service_) << " super(iface, getProcessMap(processMap));" << endl; indent(f_service_) << "}" << endl << endl; @@ -3716,9 +3717,9 @@ void t_java_generator::generate_service_async_server(t_service* tservice) { indent(f_service_) << "private static java.util.Map> getProcessMap(java.util.Map> getProcessMap(java.util.Map> processMap) {" + "org.apache.thrift.TBase, ?, ? extends org.apache.thrift.TBase>> processMap) {" << endl; indent_up(); for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -3783,13 +3784,23 @@ void t_java_generator::generate_process_async_function(t_service* tservice, t_fu // Open class indent(f_service_) << "public static class " << make_valid_java_identifier(tfunction->get_name()) << " extends org.apache.thrift.AsyncProcessFunction {" << endl; + << argsname << ", " << resulttype << ", " << resultname << "> {" << endl; indent_up(); indent(f_service_) << "public " << make_valid_java_identifier(tfunction->get_name()) << "() {" << endl; indent(f_service_) << " super(\"" << tfunction->get_name() << "\");" << endl; indent(f_service_) << "}" << endl << endl; + indent(f_service_) << java_override_annotation() << endl; + indent(f_service_) << "public " << resultname << " getEmptyResultInstance() {" << endl; + if (tfunction->is_oneway()) { + indent(f_service_) << " return null;" << endl; + } + else { + indent(f_service_) << " return new " << resultname << "();" << endl; + } + indent(f_service_) << "}" << endl << endl; + indent(f_service_) << java_override_annotation() << endl; indent(f_service_) << "public " << argsname << " getEmptyArgsInstance() {" << endl; indent(f_service_) << " return new " << argsname << "();" << endl; @@ -3931,7 +3942,7 @@ void t_java_generator::generate_process_async_function(t_service* tservice, t_fu indent(f_service_) << "}" << endl << endl; indent(f_service_) << java_override_annotation() << endl; - indent(f_service_) << "protected boolean isOneway() {" << endl; + indent(f_service_) << "public boolean isOneway() {" << endl; indent(f_service_) << " return " << ((tfunction->is_oneway()) ? "true" : "false") << ";" << endl; indent(f_service_) << "}" << endl << endl; @@ -3989,7 +4000,7 @@ void t_java_generator::generate_process_function(t_service* tservice, t_function // Open class indent(f_service_) << "public static class " << make_valid_java_identifier(tfunction->get_name()) << " extends org.apache.thrift.ProcessFunction {" << endl; + << argsname << ", " << resultname << "> {" << endl; indent_up(); indent(f_service_) << "public " << make_valid_java_identifier(tfunction->get_name()) << "() {" << endl; @@ -4002,7 +4013,7 @@ void t_java_generator::generate_process_function(t_service* tservice, t_function indent(f_service_) << "}" << endl << endl; indent(f_service_) << java_override_annotation() << endl; - indent(f_service_) << "protected boolean isOneway() {" << endl; + indent(f_service_) << "public boolean isOneway() {" << endl; indent(f_service_) << " return " << ((tfunction->is_oneway()) ? "true" : "false") << ";" << endl; indent(f_service_) << "}" << endl << endl; @@ -4012,12 +4023,22 @@ void t_java_generator::generate_process_function(t_service* tservice, t_function << endl; indent(f_service_) << "}" << endl << endl; + indent(f_service_) << java_override_annotation() << endl; + indent(f_service_) << "public " << resultname << " getEmptyResultInstance() {" << endl; + if (tfunction->is_oneway()) { + indent(f_service_) << " return null;" << endl; + } + else { + indent(f_service_) << " return new " << resultname << "();" << endl; + } + indent(f_service_) << "}" << endl << endl; + indent(f_service_) << java_override_annotation() << endl; indent(f_service_) << "public " << resultname << " getResult(I iface, " << argsname << " args) throws org.apache.thrift.TException {" << endl; indent_up(); if (!tfunction->is_oneway()) { - indent(f_service_) << resultname << " result = new " << resultname << "();" << endl; + indent(f_service_) << resultname << " result = getEmptyResultInstance();" << endl; } t_struct* xs = tfunction->get_xceptions(); diff --git a/lib/java/src/main/java/org/apache/thrift/AsyncProcessFunction.java b/lib/java/src/main/java/org/apache/thrift/AsyncProcessFunction.java index c7c4be3036d..4e65ae66e17 100644 --- a/lib/java/src/main/java/org/apache/thrift/AsyncProcessFunction.java +++ b/lib/java/src/main/java/org/apache/thrift/AsyncProcessFunction.java @@ -23,20 +23,22 @@ import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.server.AbstractNonblockingServer; -public abstract class AsyncProcessFunction { +public abstract class AsyncProcessFunction { final String methodName; public AsyncProcessFunction(String methodName) { this.methodName = methodName; } - protected abstract boolean isOneway(); + public abstract boolean isOneway(); public abstract void start(I iface, T args, AsyncMethodCallback resultHandler) throws TException; public abstract T getEmptyArgsInstance(); + public abstract A getEmptyResultInstance(); + public abstract AsyncMethodCallback getResultHandler( final AbstractNonblockingServer.AsyncFrameBuffer fb, int seqid); diff --git a/lib/java/src/main/java/org/apache/thrift/ProcessFunction.java b/lib/java/src/main/java/org/apache/thrift/ProcessFunction.java index 7399342a217..8552863aaef 100644 --- a/lib/java/src/main/java/org/apache/thrift/ProcessFunction.java +++ b/lib/java/src/main/java/org/apache/thrift/ProcessFunction.java @@ -8,86 +8,91 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class ProcessFunction { - private final String methodName; +public abstract class ProcessFunction { + private final String methodName; - private static final Logger LOGGER = LoggerFactory.getLogger(ProcessFunction.class.getName()); + private static final Logger LOGGER = LoggerFactory.getLogger(ProcessFunction.class.getName()); - public ProcessFunction(String methodName) { - this.methodName = methodName; - } - - public final void process(int seqid, TProtocol iprot, TProtocol oprot, I iface) - throws TException { - T args = getEmptyArgsInstance(); - try { - args.read(iprot); - } catch (TProtocolException e) { - iprot.readMessageEnd(); - TApplicationException x = - new TApplicationException(TApplicationException.PROTOCOL_ERROR, e.getMessage()); - oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.EXCEPTION, seqid)); - x.write(oprot); - oprot.writeMessageEnd(); - oprot.getTransport().flush(); - return; + public ProcessFunction(String methodName) { + this.methodName = methodName; } - iprot.readMessageEnd(); - TSerializable result = null; - byte msgType = TMessageType.REPLY; - try { - result = getResult(iface, args); - } catch (TTransportException ex) { - LOGGER.error("Transport error while processing " + getMethodName(), ex); - throw ex; - } catch (TApplicationException ex) { - LOGGER.error("Internal application error processing " + getMethodName(), ex); - result = ex; - msgType = TMessageType.EXCEPTION; - } catch (Exception ex) { - LOGGER.error("Internal error processing " + getMethodName(), ex); - if (rethrowUnhandledExceptions()) throw new RuntimeException(ex.getMessage(), ex); - if (!isOneway()) { - result = - new TApplicationException( - TApplicationException.INTERNAL_ERROR, - "Internal error processing " + getMethodName()); - msgType = TMessageType.EXCEPTION; - } + public final void process(int seqid, TProtocol iprot, TProtocol oprot, I iface) + throws TException { + T args = getEmptyArgsInstance(); + try { + args.read(iprot); + } catch (TProtocolException e) { + iprot.readMessageEnd(); + TApplicationException x = + new TApplicationException(TApplicationException.PROTOCOL_ERROR, e.getMessage()); + oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.EXCEPTION, seqid)); + x.write(oprot); + oprot.writeMessageEnd(); + oprot.getTransport().flush(); + return; + } + iprot.readMessageEnd(); + TSerializable result = null; + byte msgType = TMessageType.REPLY; + + try { + result = getResult(iface, args); + } catch (TTransportException ex) { + LOGGER.error("Transport error while processing " + getMethodName(), ex); + throw ex; + } catch (TApplicationException ex) { + LOGGER.error("Internal application error processing " + getMethodName(), ex); + result = ex; + msgType = TMessageType.EXCEPTION; + } catch (Exception ex) { + LOGGER.error("Internal error processing " + getMethodName(), ex); + if (rethrowUnhandledExceptions()) throw new RuntimeException(ex.getMessage(), ex); + if (!isOneway()) { + result = + new TApplicationException( + TApplicationException.INTERNAL_ERROR, + "Internal error processing " + getMethodName()); + msgType = TMessageType.EXCEPTION; + } + } + + if (!isOneway()) { + oprot.writeMessageBegin(new TMessage(getMethodName(), msgType, seqid)); + result.write(oprot); + oprot.writeMessageEnd(); + oprot.getTransport().flush(); + } } - if (!isOneway()) { - oprot.writeMessageBegin(new TMessage(getMethodName(), msgType, seqid)); - result.write(oprot); - oprot.writeMessageEnd(); - oprot.getTransport().flush(); + private void handleException(int seqid, TProtocol oprot) throws TException { + if (!isOneway()) { + TApplicationException x = + new TApplicationException( + TApplicationException.INTERNAL_ERROR, "Internal error processing " + getMethodName()); + oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.EXCEPTION, seqid)); + x.write(oprot); + oprot.writeMessageEnd(); + oprot.getTransport().flush(); + } } - } - private void handleException(int seqid, TProtocol oprot) throws TException { - if (!isOneway()) { - TApplicationException x = - new TApplicationException( - TApplicationException.INTERNAL_ERROR, "Internal error processing " + getMethodName()); - oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.EXCEPTION, seqid)); - x.write(oprot); - oprot.writeMessageEnd(); - oprot.getTransport().flush(); + protected boolean rethrowUnhandledExceptions() { + return false; } - } - protected boolean rethrowUnhandledExceptions() { - return false; - } + public abstract boolean isOneway(); - protected abstract boolean isOneway(); + public abstract TBase getResult(I iface, T args) throws TException; - public abstract TBase getResult(I iface, T args) throws TException; + public abstract T getEmptyArgsInstance(); - public abstract T getEmptyArgsInstance(); + /** + * Returns null when this is a oneWay function. + */ + public abstract A getEmptyResultInstance(); - public String getMethodName() { - return methodName; - } + public String getMethodName() { + return methodName; + } } diff --git a/lib/java/src/main/java/org/apache/thrift/TBaseAsyncProcessor.java b/lib/java/src/main/java/org/apache/thrift/TBaseAsyncProcessor.java index 266f0c0ceec..0a583c05a6a 100644 --- a/lib/java/src/main/java/org/apache/thrift/TBaseAsyncProcessor.java +++ b/lib/java/src/main/java/org/apache/thrift/TBaseAsyncProcessor.java @@ -30,15 +30,15 @@ public class TBaseAsyncProcessor implements TAsyncProcessor, TProcessor { protected final Logger LOGGER = LoggerFactory.getLogger(getClass().getName()); final I iface; - final Map> processMap; + final Map> processMap; public TBaseAsyncProcessor( - I iface, Map> processMap) { + I iface, Map> processMap) { this.iface = iface; this.processMap = processMap; } - public Map> getProcessMapView() { + public Map> getProcessMapView() { return Collections.unmodifiableMap(processMap); } diff --git a/lib/java/src/main/java/org/apache/thrift/TBaseProcessor.java b/lib/java/src/main/java/org/apache/thrift/TBaseProcessor.java index 05cd7b8ccda..ff1ccfcc9c0 100644 --- a/lib/java/src/main/java/org/apache/thrift/TBaseProcessor.java +++ b/lib/java/src/main/java/org/apache/thrift/TBaseProcessor.java @@ -10,15 +10,15 @@ public abstract class TBaseProcessor implements TProcessor { private final I iface; - private final Map> processMap; + private final Map> processMap; protected TBaseProcessor( - I iface, Map> processFunctionMap) { + I iface, Map> processFunctionMap) { this.iface = iface; this.processMap = processFunctionMap; } - public Map> getProcessMapView() { + public Map> getProcessMapView() { return Collections.unmodifiableMap(processMap); } diff --git a/lib/java/src/main/java/org/apache/thrift/server/TSaslNonblockingServer.java b/lib/java/src/main/java/org/apache/thrift/server/TSaslNonblockingServer.java index 6f22d8bb454..8c899d56cdb 100644 --- a/lib/java/src/main/java/org/apache/thrift/server/TSaslNonblockingServer.java +++ b/lib/java/src/main/java/org/apache/thrift/server/TSaslNonblockingServer.java @@ -255,7 +255,7 @@ private void handleIO() { } else if (selected.isWritable()) { saslHandler.handleWrite(); } else { - LOGGER.error("Invalid intrest op " + selected.interestOps()); + LOGGER.error("Invalid interest op " + selected.interestOps()); closeChannel(selected); continue; } From 16819268870b20e0d761426a49a14d81fccb9b8c Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 7 Mar 2024 23:01:20 +0100 Subject: [PATCH 019/430] THRIFT-5764 Extra CTOR for TThriftBytesImpl Client: Delphi Patch: Jens Geyer --- lib/delphi/src/Thrift.Protocol.pas | 9 +++++++++ .../test/serializer/TestSerializer.Tests.pas | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/lib/delphi/src/Thrift.Protocol.pas b/lib/delphi/src/Thrift.Protocol.pas index f5cb454d4c1..4c02d3ff317 100644 --- a/lib/delphi/src/Thrift.Protocol.pas +++ b/lib/delphi/src/Thrift.Protocol.pas @@ -28,6 +28,7 @@ interface Classes, SysUtils, Contnrs, + Math, Thrift.Exception, Thrift.Stream, Thrift.Utils, @@ -388,6 +389,7 @@ TThriftBytesImpl = class( TInterfacedObject, IThriftBytes, ISupportsToString) constructor Create; overload; constructor Create( const bytes : TBytes); overload; constructor Create( var bytes : TBytes; const aTakeOwnership : Boolean = FALSE); overload; + constructor Create( const pData : Pointer; const nCount : Integer); overload; function ToString : string; override; end; @@ -802,6 +804,13 @@ constructor TThriftBytesImpl.Create( var bytes : TBytes; const aTakeOwnership : end; +constructor TThriftBytesImpl.Create( const pData : Pointer; const nCount : Integer); +begin + SetLength(FData, Max(nCount,0)); + if Length(FData) > 0 then Move( pData^, FData[0], Length(FData)); +end; + + function TThriftBytesImpl.ToString : string; var sb : TThriftStringBuilder; begin diff --git a/lib/delphi/test/serializer/TestSerializer.Tests.pas b/lib/delphi/test/serializer/TestSerializer.Tests.pas index 6ed1a48a2c5..91ced8a1707 100644 --- a/lib/delphi/test/serializer/TestSerializer.Tests.pas +++ b/lib/delphi/test/serializer/TestSerializer.Tests.pas @@ -81,6 +81,7 @@ TTestSerializer = class //extends TestCase { procedure Test_Serializer_Deserializer; procedure Test_COM_Types; + procedure Test_ThriftBytesCTORs; procedure Test_OneOfEach( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream); procedure Test_CompactStruct( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream); @@ -325,11 +326,28 @@ procedure TTestSerializer.Test_COM_Types; end; +procedure TTestSerializer.Test_ThriftBytesCTORs; +var one, two : IThriftBytes; + bytes : TBytes; + sAscii : AnsiString; +begin + sAscii := 'ABC/xzy'; + bytes := TEncoding.ASCII.GetBytes(sAscii); + + one := TThriftBytesImpl.Create( PAnsiChar(sAscii), Length(sAscii)); + two := TThriftBytesImpl.Create( bytes, TRUE); + + ASSERT( one.Count = two.Count); + ASSERT( CompareMem( one.QueryRawDataPtr, two.QueryRawDataPtr, one.Count)); +end; + + procedure TTestSerializer.RunTests; begin try Test_Serializer_Deserializer; Test_COM_Types; + Test_ThriftBytesCTORs; except on e:Exception do begin Writeln( e.ClassName+': '+ e.Message); From b53fa8e14b352431036a1902d6cebbc06de97244 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 8 Mar 2024 00:33:22 +0100 Subject: [PATCH 020/430] THRIFT-5765 Extra override for WriteBinary() to avoid unnecessary memory allocations when using COM types Client: Delphi Patch: JensG --- lib/delphi/src/Thrift.Protocol.Compact.pas | 9 +++++++++ lib/delphi/src/Thrift.Protocol.pas | 18 ++++++++++++++++++ .../test/serializer/TestSerializer.Tests.pas | 2 +- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/delphi/src/Thrift.Protocol.Compact.pas b/lib/delphi/src/Thrift.Protocol.Compact.pas index 80f1ce58abd..a8ad53a4192 100644 --- a/lib/delphi/src/Thrift.Protocol.Compact.pas +++ b/lib/delphi/src/Thrift.Protocol.Compact.pas @@ -176,6 +176,7 @@ TFactory = class( TInterfacedObject, IProtocolFactory) procedure WriteI64( const i64: Int64); override; procedure WriteDouble( const dub: Double); override; procedure WriteBinary( const b: TBytes); overload; override; + procedure WriteBinary( const bytes : IThriftBytes); overload; override; procedure WriteUuid( const uuid: TGuid); override; private // unit visible stuff @@ -542,6 +543,14 @@ procedure TCompactProtocolImpl.WriteBinary( const b: TBytes); Transport.Write( b); end; + +procedure TCompactProtocolImpl.WriteBinary( const bytes : IThriftBytes); +begin + WriteVarint32( Cardinal(bytes.Count)); + Transport.Write( bytes.QueryRawDataPtr, 0, bytes.Count); +end; + + procedure TCompactProtocolImpl.WriteUuid( const uuid: TGuid); var network : TGuid; // in network order (Big Endian) begin diff --git a/lib/delphi/src/Thrift.Protocol.pas b/lib/delphi/src/Thrift.Protocol.pas index 4c02d3ff317..fd92da9b73b 100644 --- a/lib/delphi/src/Thrift.Protocol.pas +++ b/lib/delphi/src/Thrift.Protocol.pas @@ -443,6 +443,7 @@ TFactory = class( TInterfacedObject, IProtocolFactory) procedure WriteI64( const i64: Int64); override; procedure WriteDouble( const d: Double); override; procedure WriteBinary( const b: TBytes); override; + procedure WriteBinary( const bytes : IThriftBytes); overload; override; procedure WriteUuid( const uuid: TGuid); override; function ReadMessageBegin: TThriftMessage; override; @@ -509,6 +510,7 @@ TProtocolDecorator = class( TProtocolImpl) procedure WriteString( const s: string ); override; procedure WriteAnsiString( const s: AnsiString); override; procedure WriteBinary( const b: TBytes); override; + procedure WriteBinary( const bytes : IThriftBytes); overload; override; procedure WriteUuid( const uuid: TGuid); override; function ReadMessageBegin: TThriftMessage; override; @@ -749,6 +751,8 @@ procedure TProtocolImpl.CheckReadBytesAvailable( const value : TThriftMap); procedure TProtocolImpl.WriteBinary( const bytes : IThriftBytes); +// This implementation works, but is rather inefficient due to the extra memory allocation +// Consider overwriting this for your transport implementation var tmp : TBytes; begin SetLength( tmp, bytes.Count); @@ -1114,6 +1118,14 @@ procedure TBinaryProtocolImpl.WriteBinary( const b: TBytes); if iLen > 0 then FTrans.Write(b, 0, iLen); end; +procedure TBinaryProtocolImpl.WriteBinary( const bytes : IThriftBytes); +var iLen : Integer; +begin + iLen := bytes.Count; + WriteI32( iLen); + if iLen > 0 then FTrans.Write( bytes.QueryRawDataPtr, 0, iLen); +end; + procedure TBinaryProtocolImpl.WriteUuid( const uuid: TGuid); var network : TGuid; // in network order (Big Endian) begin @@ -1518,6 +1530,12 @@ procedure TProtocolDecorator.WriteBinary( const b: TBytes); end; +procedure TProtocolDecorator.WriteBinary( const bytes : IThriftBytes); +begin + FWrappedProtocol.WriteBinary( bytes); +end; + + procedure TProtocolDecorator.WriteUuid( const uuid: TGuid); begin FWrappedProtocol.WriteUuid( uuid); diff --git a/lib/delphi/test/serializer/TestSerializer.Tests.pas b/lib/delphi/test/serializer/TestSerializer.Tests.pas index 91ced8a1707..e6a309e6861 100644 --- a/lib/delphi/test/serializer/TestSerializer.Tests.pas +++ b/lib/delphi/test/serializer/TestSerializer.Tests.pas @@ -332,7 +332,7 @@ procedure TTestSerializer.Test_ThriftBytesCTORs; sAscii : AnsiString; begin sAscii := 'ABC/xzy'; - bytes := TEncoding.ASCII.GetBytes(sAscii); + bytes := TEncoding.ASCII.GetBytes(string(sAscii)); one := TThriftBytesImpl.Create( PAnsiChar(sAscii), Length(sAscii)); two := TThriftBytesImpl.Create( bytes, TRUE); From f02ac2fb573bed72e9a2d1875807c6ff7ac19ec8 Mon Sep 17 00:00:00 2001 From: Lukas Barth Date: Wed, 8 Feb 2023 09:33:03 +0100 Subject: [PATCH 021/430] Move default constructor and operator== implementation to CPP file Both the default constructor and operator== implementations reference certain member functions of the class' members. As an example, the default constructor references (i.e., "uses") the default constructors of its members. If a class contains a std::vector, and Foo has only been *forward*- declared (which happens often in Thrift-generated code), this creates undefined behavior: The std::vector specification states that as long as Foo is an incomplete type, it is fine to reference std::vector, but not any members (such as its default constructor). Thus, we must defer our default constructor's implementation (which references the default constructor of std::vector) to a point where Foo is a complete type. That is the case in the .cpp file. The same holds for operator==. --- .../src/thrift/generate/t_cpp_generator.cc | 187 +++++++++++------- 1 file changed, 121 insertions(+), 66 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc index 9724fae80a6..fecfa4bb564 100644 --- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc @@ -146,11 +146,13 @@ class t_cpp_generator : public t_oop_generator { bool is_user_struct = false); void generate_copy_constructor(std::ostream& out, t_struct* tstruct, bool is_exception); void generate_move_constructor(std::ostream& out, t_struct* tstruct, bool is_exception); + void generate_default_constructor(std::ostream& out, t_struct* tstruct, bool is_exception); void generate_constructor_helper(std::ostream& out, t_struct* tstruct, bool is_excpetion, bool is_move); void generate_assignment_operator(std::ostream& out, t_struct* tstruct); + void generate_equality_operator(std::ostream& out, t_struct* tstruct); void generate_move_assignment_operator(std::ostream& out, t_struct* tstruct); void generate_assignment_helper(std::ostream& out, t_struct* tstruct, bool is_move); void generate_struct_reader(std::ostream& out, t_struct* tstruct, bool pointers = false); @@ -914,6 +916,10 @@ void t_cpp_generator::generate_cpp_struct(t_struct* tstruct, bool is_exception) generate_struct_reader(out, tstruct); generate_struct_writer(out, tstruct); generate_struct_swap(f_types_impl_, tstruct); + if (!gen_no_default_operators_) { + generate_equality_operator(f_types_impl_, tstruct); + } + generate_default_constructor(f_types_impl_, tstruct, is_exception); generate_copy_constructor(f_types_impl_, tstruct, is_exception); if (gen_moveable_) { generate_move_constructor(f_types_impl_, tstruct, is_exception); @@ -934,6 +940,117 @@ void t_cpp_generator::generate_cpp_struct(t_struct* tstruct, bool is_exception) has_members_ = true; } +void t_cpp_generator::generate_equality_operator(std::ostream& out, t_struct* tstruct) { + // Get members + vector::const_iterator m_iter; + const vector& members = tstruct->get_members(); + + out << indent() << "bool " << tstruct->get_name() + << "::operator==(const " << tstruct->get_name() << " & " + << (members.size() > 0 ? "rhs" : "/* rhs */") << ") const" << endl; + scope_up(out); + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + // Most existing Thrift code does not use isset or optional/required, + // so we treat "default" fields as required. + if ((*m_iter)->get_req() != t_field::T_OPTIONAL) { + out << indent() << "if (!(" << (*m_iter)->get_name() << " == rhs." + << (*m_iter)->get_name() << "))" << endl << indent() << " return false;" << endl; + } else { + out << indent() << "if (__isset." << (*m_iter)->get_name() << " != rhs.__isset." + << (*m_iter)->get_name() << ")" << endl << indent() << " return false;" << endl + << indent() << "else if (__isset." << (*m_iter)->get_name() << " && !(" + << (*m_iter)->get_name() << " == rhs." << (*m_iter)->get_name() << "))" << endl + << indent() << " return false;" << endl; + } + } + indent(out) << "return true;" << endl; + scope_down(out); + out << "\n"; +} + +void t_cpp_generator::generate_default_constructor(ostream& out, + t_struct* tstruct, + bool is_exception) { + // Get members + vector::const_iterator m_iter; + const vector& members = tstruct->get_members(); + + // TODO(barth) this is duplicated from generate_struct_declaration + bool has_default_value = false; + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + t_type* t = get_true_type((*m_iter)->get_type()); + if (is_reference(*m_iter) || t->is_string()) { + t_const_value* cv = (*m_iter)->get_value(); + if (cv != nullptr) { + has_default_value = true; + break; + } + } + } + + std::string clsname_ctor = tstruct->get_name() + "::" + tstruct->get_name() + "()"; + indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept"); + + if (has_default_value || is_exception) { + // We need an initializer block + + bool init_ctor = false; + std::string args_indent(" "); + + // Default-initialize TException, if it is our base type + if (is_exception) + { + out << "\n"; + indent(out) << " : "; + out << "TException()"; + init_ctor = true; + } + + // Default-initialize all members that should be initialized in + // the initializer block + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + t_type* t = get_true_type((*m_iter)->get_type()); + if (t->is_base_type() || t->is_enum() || is_reference(*m_iter)) { + string dval; + t_const_value* cv = (*m_iter)->get_value(); + if (cv != nullptr) { + dval += render_const_value(out, (*m_iter)->get_name(), t, cv); + } else if (t->is_enum()) { + dval += "static_cast<" + type_name(t) + ">(0)"; + } else { + dval += (t->is_string() || is_reference(*m_iter)) ? "" : "0"; + } + if (!init_ctor) { + out << "\n"; + indent(out) << " : "; + init_ctor = true; + } else { + out << ",\n"; + indent(out) << args_indent; + } + + out << (*m_iter)->get_name() << "(" << dval << ")"; + } + } + out << " {" << endl; + indent_up(); + // TODO(dreiss): When everything else in Thrift is perfect, + // do more of these in the initializer list. + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + t_type* t = get_true_type((*m_iter)->get_type()); + if (!t->is_base_type() && !t->is_enum() && !is_reference(*m_iter)) { + t_const_value* cv = (*m_iter)->get_value(); + if (cv != nullptr) { + print_const_value(out, (*m_iter)->get_name(), t, cv); + } + } + } + scope_down(out); + } else { + out << " {}\n"; + } +} + void t_cpp_generator::generate_copy_constructor(ostream& out, t_struct* tstruct, bool is_exception) { @@ -1168,52 +1285,7 @@ void t_cpp_generator::generate_struct_declaration(ostream& out, // Default constructor std::string clsname_ctor = tstruct->get_name() + "()"; - indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept"); - - bool init_ctor = false; - std::string args_indent( - indent().size() + clsname_ctor.size() + (has_default_value ? 3 : -1), ' '); - - for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - t_type* t = get_true_type((*m_iter)->get_type()); - if (t->is_base_type() || t->is_enum() || is_reference(*m_iter)) { - string dval; - t_const_value* cv = (*m_iter)->get_value(); - if (cv != nullptr) { - dval += render_const_value(out, (*m_iter)->get_name(), t, cv); - } else if (t->is_enum()) { - dval += "static_cast<" + type_name(t) + ">(0)"; - } else { - dval += (t->is_string() || is_reference(*m_iter)) ? "" : "0"; - } - if (!init_ctor) { - init_ctor = true; - if(has_default_value) { - out << " : "; - } else { - out << '\n' << args_indent << ": "; - args_indent.append(" "); - } - } else { - out << ",\n" << args_indent; - } - out << (*m_iter)->get_name() << "(" << dval << ")"; - } - } - out << " {" << endl; - indent_up(); - // TODO(dreiss): When everything else in Thrift is perfect, - // do more of these in the initializer list. - for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - t_type* t = get_true_type((*m_iter)->get_type()); - if (!t->is_base_type() && !t->is_enum() && !is_reference(*m_iter)) { - t_const_value* cv = (*m_iter)->get_value(); - if (cv != nullptr) { - print_const_value(out, (*m_iter)->get_name(), t, cv); - } - } - } - scope_down(out); + indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept") << ";" << endl; } if (tstruct->annotations_.find("final") == tstruct->annotations_.end()) { @@ -1254,27 +1326,10 @@ void t_cpp_generator::generate_struct_declaration(ostream& out, if (!pointers) { // Should we generate default operators? if (!gen_no_default_operators_) { - // Generate an equality testing operator. Make it inline since the compiler - // will do a better job than we would when deciding whether to inline it. + // Generate an equality testing operator. out << indent() << "bool operator == (const " << tstruct->get_name() << " & " - << (members.size() > 0 ? "rhs" : "/* rhs */") << ") const" << endl; - scope_up(out); - for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - // Most existing Thrift code does not use isset or optional/required, - // so we treat "default" fields as required. - if ((*m_iter)->get_req() != t_field::T_OPTIONAL) { - out << indent() << "if (!(" << (*m_iter)->get_name() << " == rhs." - << (*m_iter)->get_name() << "))" << endl << indent() << " return false;" << endl; - } else { - out << indent() << "if (__isset." << (*m_iter)->get_name() << " != rhs.__isset." - << (*m_iter)->get_name() << ")" << endl << indent() << " return false;" << endl - << indent() << "else if (__isset." << (*m_iter)->get_name() << " && !(" - << (*m_iter)->get_name() << " == rhs." << (*m_iter)->get_name() << "))" << endl - << indent() << " return false;" << endl; - } - } - indent(out) << "return true;" << endl; - scope_down(out); + << (members.size() > 0 ? "rhs" : "/* rhs */") << ") const;" << endl; + out << indent() << "bool operator != (const " << tstruct->get_name() << " &rhs) const {" << endl << indent() << " return !(*this == rhs);" << endl << indent() << "}" << endl << endl; From cedcd0e6424a08dd6feeb2533810054c9aca2a9e Mon Sep 17 00:00:00 2001 From: Lukas Barth Date: Wed, 8 Feb 2023 10:11:48 +0100 Subject: [PATCH 022/430] Factor out duplicated code into helper function --- .../src/thrift/generate/t_cpp_generator.cc | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc index fecfa4bb564..a77982f6192 100644 --- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc @@ -302,6 +302,12 @@ class t_cpp_generator : public t_oop_generator { */ bool is_struct_storage_not_throwing(t_struct* tstruct) const; + /** + * Helper function to determine whether any of the members of our struct + * has a default value. + */ + bool has_field_with_default_value(t_struct* tstruct); + private: /** * Returns the include prefix to use for a file generated by program, or the @@ -968,26 +974,33 @@ void t_cpp_generator::generate_equality_operator(std::ostream& out, t_struct* ts out << "\n"; } -void t_cpp_generator::generate_default_constructor(ostream& out, - t_struct* tstruct, - bool is_exception) { - // Get members +bool t_cpp_generator::has_field_with_default_value(t_struct* tstruct) +{ vector::const_iterator m_iter; const vector& members = tstruct->get_members(); - // TODO(barth) this is duplicated from generate_struct_declaration - bool has_default_value = false; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_type* t = get_true_type((*m_iter)->get_type()); if (is_reference(*m_iter) || t->is_string()) { t_const_value* cv = (*m_iter)->get_value(); if (cv != nullptr) { - has_default_value = true; - break; + return true; } } } + return false; +} + +void t_cpp_generator::generate_default_constructor(ostream& out, + t_struct* tstruct, + bool is_exception) { + // Get members + vector::const_iterator m_iter; + const vector& members = tstruct->get_members(); + + bool has_default_value = has_field_with_default_value(tstruct); + std::string clsname_ctor = tstruct->get_name() + "::" + tstruct->get_name() + "()"; indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept"); @@ -1271,18 +1284,8 @@ void t_cpp_generator::generate_struct_declaration(ostream& out, << endl; } - bool has_default_value = false; - for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - t_type* t = get_true_type((*m_iter)->get_type()); - if (is_reference(*m_iter) || t->is_string()) { - t_const_value* cv = (*m_iter)->get_value(); - if (cv != nullptr) { - has_default_value = true; - break; - } - } - } - + bool has_default_value = has_field_with_default_value(tstruct); + // Default constructor std::string clsname_ctor = tstruct->get_name() + "()"; indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept") << ";" << endl; From 16105fa1a1bb9ae633b805fcb7af3c7757beb6e0 Mon Sep 17 00:00:00 2001 From: Lukas Barth Date: Fri, 24 Feb 2023 13:46:58 +0100 Subject: [PATCH 023/430] Move generate_default_constructor call into generate_struct_definition This makes sure that helper structs like _args and _result also have their default constructors defined. --- .../src/thrift/generate/t_cpp_generator.cc | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc index a77982f6192..ccb79bc4868 100644 --- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc @@ -143,7 +143,8 @@ class t_cpp_generator : public t_oop_generator { std::ostream& force_cpp_out, t_struct* tstruct, bool setters = true, - bool is_user_struct = false); + bool is_user_struct = false, + bool pointers = false); void generate_copy_constructor(std::ostream& out, t_struct* tstruct, bool is_exception); void generate_move_constructor(std::ostream& out, t_struct* tstruct, bool is_exception); void generate_default_constructor(std::ostream& out, t_struct* tstruct, bool is_exception); @@ -916,7 +917,7 @@ void t_cpp_generator::generate_forward_declaration(t_struct* tstruct) { */ void t_cpp_generator::generate_cpp_struct(t_struct* tstruct, bool is_exception) { generate_struct_declaration(f_types_, tstruct, is_exception, false, true, true, true, true); - generate_struct_definition(f_types_impl_, f_types_impl_, tstruct, true, true); + generate_struct_definition(f_types_impl_, f_types_impl_, tstruct, true, true, false); std::ostream& out = (gen_templates_ ? f_types_tcc_ : f_types_impl_); generate_struct_reader(out, tstruct); @@ -925,7 +926,6 @@ void t_cpp_generator::generate_cpp_struct(t_struct* tstruct, bool is_exception) if (!gen_no_default_operators_) { generate_equality_operator(f_types_impl_, tstruct); } - generate_default_constructor(f_types_impl_, tstruct, is_exception); generate_copy_constructor(f_types_impl_, tstruct, is_exception); if (gen_moveable_) { generate_move_constructor(f_types_impl_, tstruct, is_exception); @@ -1408,7 +1408,8 @@ void t_cpp_generator::generate_struct_definition(ostream& out, ostream& force_cpp_out, t_struct* tstruct, bool setters, - bool is_user_struct) { + bool is_user_struct, + bool pointers) { // Get members vector::const_iterator m_iter; const vector& members = tstruct->get_members(); @@ -1423,6 +1424,11 @@ void t_cpp_generator::generate_struct_definition(ostream& out, force_cpp_out << indent() << "}" << endl << endl; } + if (!pointers) + { + generate_default_constructor(out, tstruct, false); + } + // Create a setter function for each field if (setters) { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -2058,9 +2064,10 @@ void t_cpp_generator::generate_service_helpers(t_service* tservice) { generate_struct_definition(out, f_service_, ts, false); generate_struct_reader(out, ts); generate_struct_writer(out, ts); + ts->set_name(tservice->get_name() + "_" + (*f_iter)->get_name() + "_pargs"); generate_struct_declaration(f_header_, ts, false, true, false, true); - generate_struct_definition(out, f_service_, ts, false); + generate_struct_definition(out, f_service_, ts, false, false, true); generate_struct_writer(out, ts, true); ts->set_name(name_orig); @@ -3508,7 +3515,7 @@ void t_cpp_generator::generate_function_helpers(t_service* tservice, t_function* result.set_name(tservice->get_name() + "_" + tfunction->get_name() + "_presult"); generate_struct_declaration(f_header_, &result, false, true, true, gen_cob_style_); - generate_struct_definition(out, f_service_, &result, false); + generate_struct_definition(out, f_service_, &result, false, false, true); generate_struct_reader(out, &result, true); if (gen_cob_style_) { generate_struct_writer(out, &result, true); From 4f56007baf46d4aa87eb7f8e5e34b773235c729a Mon Sep 17 00:00:00 2001 From: Lukas Barth Date: Mon, 6 Mar 2023 11:37:09 +0100 Subject: [PATCH 024/430] Always generate an initializer list --- .../src/thrift/generate/t_cpp_generator.cc | 106 +++++++++--------- 1 file changed, 56 insertions(+), 50 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc index ccb79bc4868..2a65bfb9679 100644 --- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc @@ -1004,64 +1004,70 @@ void t_cpp_generator::generate_default_constructor(ostream& out, std::string clsname_ctor = tstruct->get_name() + "::" + tstruct->get_name() + "()"; indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept"); - if (has_default_value || is_exception) { - // We need an initializer block - - bool init_ctor = false; - std::string args_indent(" "); - - // Default-initialize TException, if it is our base type - if (is_exception) - { - out << "\n"; - indent(out) << " : "; - out << "TException()"; - init_ctor = true; - } + // + // Start generating initializer list + // - // Default-initialize all members that should be initialized in - // the initializer block - for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - t_type* t = get_true_type((*m_iter)->get_type()); - if (t->is_base_type() || t->is_enum() || is_reference(*m_iter)) { - string dval; - t_const_value* cv = (*m_iter)->get_value(); - if (cv != nullptr) { - dval += render_const_value(out, (*m_iter)->get_name(), t, cv); - } else if (t->is_enum()) { - dval += "static_cast<" + type_name(t) + ">(0)"; - } else { - dval += (t->is_string() || is_reference(*m_iter)) ? "" : "0"; - } - if (!init_ctor) { - out << "\n"; - indent(out) << " : "; - init_ctor = true; + bool init_ctor = false; + std::string args_indent(" "); + + // Default-initialize TException, if it is our base type + if (is_exception) + { + out << "\n"; + indent(out) << " : "; + out << "TException()"; + init_ctor = true; + } + + // Default-initialize all members that should be initialized in + // the initializer block + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + t_type* t = get_true_type((*m_iter)->get_type()); + if (t->is_base_type() || t->is_enum() || is_reference(*m_iter)) { + string dval; + t_const_value* cv = (*m_iter)->get_value(); + if (cv != nullptr) { + dval += render_const_value(out, (*m_iter)->get_name(), t, cv); + } else if (t->is_enum()) { + dval += "static_cast<" + type_name(t) + ">(0)"; + } else { + dval += (t->is_string() || is_reference(*m_iter)) ? "" : "0"; + } + if (!init_ctor) { + init_ctor = true; + if(has_default_value) { + out << " : "; } else { - out << ",\n"; - indent(out) << args_indent; + out << '\n' << args_indent << ": "; + args_indent.append(" "); } - - out << (*m_iter)->get_name() << "(" << dval << ")"; + } else { + out << ",\n" << args_indent; } + + out << (*m_iter)->get_name() << "(" << dval << ")"; } - out << " {" << endl; - indent_up(); - // TODO(dreiss): When everything else in Thrift is perfect, - // do more of these in the initializer list. - for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - t_type* t = get_true_type((*m_iter)->get_type()); - if (!t->is_base_type() && !t->is_enum() && !is_reference(*m_iter)) { - t_const_value* cv = (*m_iter)->get_value(); - if (cv != nullptr) { - print_const_value(out, (*m_iter)->get_name(), t, cv); - } + } + + // + // Start generating body + // + + out << " {" << endl; + indent_up(); + // TODO(dreiss): When everything else in Thrift is perfect, + // do more of these in the initializer list. + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + t_type* t = get_true_type((*m_iter)->get_type()); + if (!t->is_base_type() && !t->is_enum() && !is_reference(*m_iter)) { + t_const_value* cv = (*m_iter)->get_value(); + if (cv != nullptr) { + print_const_value(out, (*m_iter)->get_name(), t, cv); } } - scope_down(out); - } else { - out << " {}\n"; } + scope_down(out); } void t_cpp_generator::generate_copy_constructor(ostream& out, From 9bd8f1e1acb23cb3ef134291e56b2605a7356b04 Mon Sep 17 00:00:00 2001 From: Lukas Barth Date: Tue, 4 Apr 2023 16:25:06 +0200 Subject: [PATCH 025/430] Fix ODR violations in cases where templates are involved --- compiler/cpp/src/thrift/generate/t_cpp_generator.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc index 2a65bfb9679..a085ada0e7b 100644 --- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc @@ -1432,7 +1432,10 @@ void t_cpp_generator::generate_struct_definition(ostream& out, if (!pointers) { - generate_default_constructor(out, tstruct, false); + // 'force_cpp_out' always goes into the .cpp file, and never into a .tcc + // file in case templates are involved. Since the constructor is not templated, + // putting it into the (later included) .tcc file would cause ODR violations. + generate_default_constructor(force_cpp_out, tstruct, false); } // Create a setter function for each field From 58c2785d7cef9d70b6a78c872f51fba5152cf77d Mon Sep 17 00:00:00 2001 From: Tobias Weihs Date: Fri, 9 Sep 2022 11:21:45 +0200 Subject: [PATCH 026/430] expose qt5 targets if available --- build/cmake/ThriftConfig.cmake.in | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build/cmake/ThriftConfig.cmake.in b/build/cmake/ThriftConfig.cmake.in index 2f2003bb438..f132fe11f54 100644 --- a/build/cmake/ThriftConfig.cmake.in +++ b/build/cmake/ThriftConfig.cmake.in @@ -40,6 +40,13 @@ if(@ZLIB_FOUND@ AND @WITH_ZLIB@) set(THRIFT_LIBRARIES thriftz::thriftz) endif() +if(@Qt5_FOUND@ AND @WITH_QT5@) + if (NOT TARGET thriftqt5::thriftqt5) + include("${THRIFT_CMAKE_DIR}/thriftqt5Targets.cmake") + endif() + set(THRIFT_LIBRARIES thriftqt5::thriftqt5) +endif() + if ("${THRIFT_LIBRARIES}" STREQUAL "") message(FATAL_ERROR "thrift libraries were not found") endif() From 99130046c424a19d244314103e2500963c192563 Mon Sep 17 00:00:00 2001 From: Volodymyr Panivko Date: Sat, 2 Mar 2024 21:41:01 +0100 Subject: [PATCH 027/430] [THRIFT-5757] Unit tests for php lib --- .github/workflows/build.yml | 2 +- composer.json | 4 +- lib/php/lib/Transport/TBufferedTransport.php | 1 + lib/php/lib/Transport/TCurlClient.php | 11 +- lib/php/lib/Transport/THttpClient.php | 14 +- lib/php/lib/Transport/TMemoryBuffer.php | 5 +- lib/php/lib/Transport/TPhpStream.php | 5 +- lib/php/lib/Transport/TSSLSocket.php | 9 +- lib/php/lib/Transport/TSocket.php | 6 +- lib/php/lib/Transport/TSocketPool.php | 61 +- lib/php/phpunit.xml | 9 +- lib/php/test/Fixtures/Fixtures.php | 2 - .../test/Fixtures/TJSONProtocolFixtures.php | 2 - .../Fixtures/TSimpleJSONProtocolFixtures.php | 2 - .../Lib/ClassLoader/Fixtures/A/TestClass.php | 5 - .../Lib/ClassLoader/Fixtures/B/TestClass.php | 5 - .../Lib/ClassLoader/Fixtures/C/TestClass.php | 5 - .../Lib/ClassLoader/Fixtures/D/TestClass.php | 5 - .../Lib/ClassLoader/Fixtures/E/TestClass.php | 5 - .../Lib/ClassLoader/ThriftClassLoaderTest.php | 53 +- .../Factory/TBinaryProtocolFactoryTest.php | 2 - .../Factory/TCompactProtocolFactoryTest.php | 2 - .../Factory/TFramedTransportFactoryTest.php | 2 - .../Lib/Factory/TJSONProtocolFactoryTest.php | 2 - .../Lib/Factory/TStringFuncFactoryTest.php | 50 +- .../Lib/Factory/TTransportFactoryTest.php | 2 - .../Lib/Transport/TBufferedTransportTest.php | 286 ++++++++ .../Unit/Lib/Transport/TCurlClientTest.php | 423 +++++++++++ .../Lib/Transport/TFramedTransportTest.php | 240 +++++++ .../Unit/Lib/Transport/THttpClientTest.php | 332 +++++++++ .../Unit/Lib/Transport/TMemoryBufferTest.php | 143 ++++ .../Unit/Lib/Transport/TNullTransportTest.php | 62 ++ .../Unit/Lib/Transport/TPhpStreamTest.php | 296 ++++++++ .../Unit/Lib/Transport/TSSLSocketTest.php | 247 +++++++ .../Unit/Lib/Transport/TSocketPoolTest.php | 541 ++++++++++++++ .../test/Unit/Lib/Transport/TSocketTest.php | 669 ++++++++++++++++++ 36 files changed, 3366 insertions(+), 144 deletions(-) create mode 100644 lib/php/test/Unit/Lib/Transport/TBufferedTransportTest.php create mode 100644 lib/php/test/Unit/Lib/Transport/TCurlClientTest.php create mode 100644 lib/php/test/Unit/Lib/Transport/TFramedTransportTest.php create mode 100644 lib/php/test/Unit/Lib/Transport/THttpClientTest.php create mode 100644 lib/php/test/Unit/Lib/Transport/TMemoryBufferTest.php create mode 100644 lib/php/test/Unit/Lib/Transport/TNullTransportTest.php create mode 100644 lib/php/test/Unit/Lib/Transport/TPhpStreamTest.php create mode 100644 lib/php/test/Unit/Lib/Transport/TSSLSocketTest.php create mode 100644 lib/php/test/Unit/Lib/Transport/TSocketPoolTest.php create mode 100644 lib/php/test/Unit/Lib/Transport/TSocketTest.php diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f003db241c7..0b29ddb906e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -90,7 +90,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-version }} - extensions: mbstring, intl, xml + extensions: mbstring, intl, xml, curl ini-values: "error_reporting=E_ALL" - name: Install Dependencies diff --git a/composer.json b/composer.json index 77248a9329e..900fb2854e7 100644 --- a/composer.json +++ b/composer.json @@ -23,8 +23,10 @@ "require-dev": { "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "squizlabs/php_codesniffer": "3.*", + "php-mock/php-mock-phpunit": "^2.10", "ext-json": "*", - "ext-xml": "*" + "ext-xml": "*", + "ext-curl": "*" }, "autoload": { "psr-4": {"Thrift\\": "lib/php/lib/"} diff --git a/lib/php/lib/Transport/TBufferedTransport.php b/lib/php/lib/Transport/TBufferedTransport.php index 253c5acfb47..e3a40a435cf 100644 --- a/lib/php/lib/Transport/TBufferedTransport.php +++ b/lib/php/lib/Transport/TBufferedTransport.php @@ -1,4 +1,5 @@ scheme_ . "://" . $host . $this->uri_; $headers = array(); - $defaultHeaders = array('Accept' => 'application/x-thrift', + $defaultHeaders = array( + 'Accept' => 'application/x-thrift', 'Content-Type' => 'application/x-thrift', - 'Content-Length' => TStringFuncFactory::create()->strlen($this->request_)); + 'Content-Length' => TStringFuncFactory::create()->strlen($this->request_) + ); foreach (array_merge($defaultHeaders, $this->headers_) as $key => $value) { $headers[] = "$key: $value"; } @@ -292,10 +294,11 @@ public static function closeCurlHandle() { try { if (self::$curlHandle) { - curl_close(self::$curlHandle); + curl_close(self::$curlHandle); #This function has no effect. Prior to PHP 8.0.0, this function was used to close the resource. self::$curlHandle = null; } } catch (\Exception $x) { + #it's not possible to throw an exception by calling a function that has no effect error_log('There was an error closing the curl handle: ' . $x->getMessage()); } } diff --git a/lib/php/lib/Transport/THttpClient.php b/lib/php/lib/Transport/THttpClient.php index 4d6be32fed2..0f767f44330 100644 --- a/lib/php/lib/Transport/THttpClient.php +++ b/lib/php/lib/Transport/THttpClient.php @@ -1,4 +1,5 @@ host_ . ($this->port_ != 80 ? ':' . $this->port_ : ''); $headers = array(); - $defaultHeaders = array('Host' => $host, + $defaultHeaders = array( + 'Host' => $host, 'Accept' => 'application/x-thrift', 'User-Agent' => 'PHP/THttpClient', 'Content-Type' => 'application/x-thrift', - 'Content-Length' => TStringFuncFactory::create()->strlen($this->buf_)); + 'Content-Length' => TStringFuncFactory::create()->strlen($this->buf_) + ); + foreach (array_merge($defaultHeaders, $this->headers_) as $key => $value) { $headers[] = "$key: $value"; } @@ -225,10 +229,12 @@ public function flush() $baseHttpOptions = isset($options["http"]) ? $options["http"] : array(); - $httpOptions = $baseHttpOptions + array('method' => 'POST', + $httpOptions = $baseHttpOptions + array( + 'method' => 'POST', 'header' => implode("\r\n", $headers), 'max_redirects' => 1, - 'content' => $this->buf_); + 'content' => $this->buf_ + ); if ($this->timeout_ > 0) { $httpOptions['timeout'] = $this->timeout_; } diff --git a/lib/php/lib/Transport/TMemoryBuffer.php b/lib/php/lib/Transport/TMemoryBuffer.php index fee03a2a4b4..e5da9dab2c9 100644 --- a/lib/php/lib/Transport/TMemoryBuffer.php +++ b/lib/php/lib/Transport/TMemoryBuffer.php @@ -1,4 +1,5 @@ buf_ = $buf; } - protected $buf_ = ''; - public function isOpen() { return true; diff --git a/lib/php/lib/Transport/TPhpStream.php b/lib/php/lib/Transport/TPhpStream.php index 42823ff3372..2350b96f065 100644 --- a/lib/php/lib/Transport/TPhpStream.php +++ b/lib/php/lib/Transport/TPhpStream.php @@ -1,4 +1,5 @@ read_) { - $this->inStream_ = @fopen(self::inStreamName(), 'r'); + $this->inStream_ = @fopen($this->inStreamName(), 'r'); if (!is_resource($this->inStream_)) { throw new TException('TPhpStream: Could not open php://input'); } @@ -113,7 +114,7 @@ public function flush() @fflush($this->outStream_); } - private static function inStreamName() + private function inStreamName() { if (php_sapi_name() == 'cli') { return 'php://stdin'; diff --git a/lib/php/lib/Transport/TSSLSocket.php b/lib/php/lib/Transport/TSSLSocket.php index b4a0adb5430..16956e7d9b1 100644 --- a/lib/php/lib/Transport/TSSLSocket.php +++ b/lib/php/lib/Transport/TSSLSocket.php @@ -36,7 +36,7 @@ class TSSLSocket extends TSocket /** * Remote port * - * @var resource + * @var null|resource */ protected $context_ = null; @@ -57,6 +57,10 @@ public function __construct( ) { $this->host_ = $this->getSSLHost($host); $this->port_ = $port; + // Initialize a stream context if not provided + if ($context === null) { + $context = stream_context_create(); + } $this->context_ = $context; $this->debugHandler_ = $debugHandler ? $debugHandler : 'error_log'; } @@ -87,7 +91,8 @@ public function open() throw new TTransportException('Socket already connected', TTransportException::ALREADY_OPEN); } - if (empty($this->host_)) { + $host = parse_url($this->host_, PHP_URL_HOST); + if (empty($host)) { throw new TTransportException('Cannot open null host', TTransportException::NOT_OPEN); } diff --git a/lib/php/lib/Transport/TSocket.php b/lib/php/lib/Transport/TSocket.php index 8fe60fdaae7..fb74fdbf6aa 100644 --- a/lib/php/lib/Transport/TSocket.php +++ b/lib/php/lib/Transport/TSocket.php @@ -252,8 +252,10 @@ public function open() if (function_exists('socket_import_stream') && function_exists('socket_set_option')) { // warnings silenced due to bug https://bugs.php.net/bug.php?id=70939 - $socket = @socket_import_stream($this->handle_); - @socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1); + $socket = socket_import_stream($this->handle_); + if ($socket !== false) { + @socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1); + } } } diff --git a/lib/php/lib/Transport/TSocketPool.php b/lib/php/lib/Transport/TSocketPool.php index 307885f507a..312e023c60a 100644 --- a/lib/php/lib/Transport/TSocketPool.php +++ b/lib/php/lib/Transport/TSocketPool.php @@ -1,4 +1,5 @@ $host) { - $this->servers_ [] = array('host' => $host, - 'port' => $ports[$key]); + $this->servers_ [] = array( + 'host' => $host, + 'port' => $ports[$key] + ); } + + $this->useApcuCache = function_exists('apcu_fetch'); } /** @@ -206,7 +199,7 @@ public function open() $failtimeKey = 'thrift_failtime:' . $host . ':' . $port . '~'; // Cache miss? Assume it's OK - $lastFailtime = apcu_fetch($failtimeKey); + $lastFailtime = $this->apcuFetch($failtimeKey); if ($lastFailtime === false) { $lastFailtime = 0; } @@ -251,7 +244,7 @@ public function open() // Only clear the failure counts if required to do so if ($lastFailtime > 0) { - apcu_store($failtimeKey, 0); + $this->apcuStore($failtimeKey, 0); } // Successful connection, return now @@ -265,7 +258,7 @@ public function open() $consecfailsKey = 'thrift_consecfails:' . $host . ':' . $port . '~'; // Ignore cache misses - $consecfails = apcu_fetch($consecfailsKey); + $consecfails = $this->apcuFetch($consecfailsKey); if ($consecfails === false) { $consecfails = 0; } @@ -284,12 +277,12 @@ public function open() ); } // Store the failure time - apcu_store($failtimeKey, time()); + $this->apcuStore($failtimeKey, time()); // Clear the count of consecutive failures - apcu_store($consecfailsKey, 0); + $this->apcuStore($consecfailsKey, 0); } else { - apcu_store($consecfailsKey, $consecfails); + $this->apcuStore($consecfailsKey, $consecfails); } } } @@ -307,4 +300,20 @@ public function open() } throw new TException($error); } + + /** + * This library makes use of APCu cache to make hosts as down in a web + * environment. If you are running from the CLI or on a system without APCu + * installed, then these null functions will step in and act like cache + * misses. + */ + private function apcuFetch($key, &$success = null) + { + return $this->useApcuCache ? apcu_fetch($key, $success) : false; + } + + private function apcuStore($key, $var, $ttl = 0) + { + return $this->useApcuCache ? apcu_store($key, $var, $ttl) : false; + } } diff --git a/lib/php/phpunit.xml b/lib/php/phpunit.xml index 53b3f351a9f..2cbea95d345 100644 --- a/lib/php/phpunit.xml +++ b/lib/php/phpunit.xml @@ -28,12 +28,11 @@ stopOnFailure="true" processIsolation="true" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"> - - - ./src + + ./lib - - + + ./test/Unit diff --git a/lib/php/test/Fixtures/Fixtures.php b/lib/php/test/Fixtures/Fixtures.php index eb348fc7101..d48be4061c8 100644 --- a/lib/php/test/Fixtures/Fixtures.php +++ b/lib/php/test/Fixtures/Fixtures.php @@ -17,8 +17,6 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * @package thrift.test */ namespace Test\Thrift\Fixtures; diff --git a/lib/php/test/Fixtures/TJSONProtocolFixtures.php b/lib/php/test/Fixtures/TJSONProtocolFixtures.php index 81ada779638..77fb270a796 100644 --- a/lib/php/test/Fixtures/TJSONProtocolFixtures.php +++ b/lib/php/test/Fixtures/TJSONProtocolFixtures.php @@ -17,8 +17,6 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * @package thrift.test */ namespace Test\Thrift\Fixtures; diff --git a/lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php b/lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php index 448eb61261b..0281a879b7e 100644 --- a/lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php +++ b/lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php @@ -17,8 +17,6 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * @package thrift.test */ namespace Test\Thrift\Fixtures; diff --git a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/A/TestClass.php b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/A/TestClass.php index e39f501e0b9..3652b253ead 100644 --- a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/A/TestClass.php +++ b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/A/TestClass.php @@ -17,11 +17,6 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * ClassLoader to load Thrift library and definitions - * Inspired from UniversalClassLoader from Symfony 2 - * - * @package thrift.classloader */ namespace A; diff --git a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/B/TestClass.php b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/B/TestClass.php index d2e87e2e2f5..1d5a543be93 100644 --- a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/B/TestClass.php +++ b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/B/TestClass.php @@ -17,11 +17,6 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * ClassLoader to load Thrift library and definitions - * Inspired from UniversalClassLoader from Symfony 2 - * - * @package thrift.classloader */ namespace B; diff --git a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/C/TestClass.php b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/C/TestClass.php index 9e4000c1f9c..58bae58defb 100644 --- a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/C/TestClass.php +++ b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/C/TestClass.php @@ -17,11 +17,6 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * ClassLoader to load Thrift library and definitions - * Inspired from UniversalClassLoader from Symfony 2 - * - * @package thrift.classloader */ namespace C; diff --git a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/D/TestClass.php b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/D/TestClass.php index c0cda0cbc33..592fe566e2e 100644 --- a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/D/TestClass.php +++ b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/D/TestClass.php @@ -17,11 +17,6 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * ClassLoader to load Thrift library and definitions - * Inspired from UniversalClassLoader from Symfony 2 - * - * @package thrift.classloader */ namespace D; diff --git a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/E/TestClass.php b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/E/TestClass.php index b1981b497ef..56b56793de0 100644 --- a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/E/TestClass.php +++ b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/E/TestClass.php @@ -17,11 +17,6 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * ClassLoader to load Thrift library and definitions - * Inspired from UniversalClassLoader from Symfony 2 - * - * @package thrift.classloader */ namespace E; diff --git a/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php b/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php index 1180211243c..46ed2ec69c0 100644 --- a/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php +++ b/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php @@ -21,6 +21,7 @@ namespace Test\Thrift\Unit\Lib\ClassLoader; +use phpmock\phpunit\PHPMock; use PHPUnit\Framework\TestCase; use Thrift\ClassLoader\ThriftClassLoader; @@ -30,7 +31,7 @@ */ class ThriftClassLoaderTest extends TestCase { - const APCU_PREFIX = 'test'; + use PHPMock; /** * @dataProvider registerNamespaceDataProvider @@ -42,6 +43,16 @@ public function testRegisterNamespace( $useApcu = false, $apcuPrefix = null ) { + $this->getFunctionMock('Thrift\ClassLoader', 'apcu_fetch') + ->expects($useApcu ? $this->once() : $this->never()) + ->with($apcuPrefix . $class) + ->willReturn(false); + + $this->getFunctionMock('Thrift\ClassLoader', 'apcu_store') + ->expects($useApcu ? $this->once() : $this->never()) + ->with($apcuPrefix . $class, $this->anything()) + ->willReturn(true); + $loader = new ThriftClassLoader($useApcu, $apcuPrefix); foreach ($namespaces as $namespace => $paths) { $loader->registerNamespace($namespace, $paths); @@ -97,7 +108,7 @@ public function registerNamespaceDataProvider() 'class' => '\E\TestClass', 'isClassExist' => true, 'useApcu' => true, - 'apcuPrefix' => self::APCU_PREFIX, + 'apcuPrefix' => 'APCU_PREFIX', ]; } @@ -111,6 +122,16 @@ public function testRegisterDefinition( $useApcu = false, $apcuPrefix = null ) { + $this->getFunctionMock('Thrift\ClassLoader', 'apcu_fetch') + ->expects($useApcu ? $this->once() : $this->never()) + ->with($apcuPrefix . $class) + ->willReturn(false); + + $this->getFunctionMock('Thrift\ClassLoader', 'apcu_store') + ->expects($useApcu ? $this->once() : $this->never()) + ->with($apcuPrefix . $class, $this->anything()) + ->willReturn(true); + $loader = new ThriftClassLoader($useApcu, $apcuPrefix); foreach ($definitions as $namespace => $paths) { $loader->registerDefinition($namespace, $paths); @@ -191,33 +212,7 @@ public function registerDefinitionDataProvider() 'class' => '\TestValidators\TestServiceClient', 'checkInterfaceExist' => false, 'useApcu' => true, - 'apcuPrefix' => self::APCU_PREFIX, + 'apcuPrefix' => 'APCU_PREFIX', ]; } } - -namespace Thrift\ClassLoader; - -use Test\Thrift\Unit\Lib\ClassLoader\ThriftClassLoaderTest; - -if (!function_exists('apcu_fetch')) { - { - function apcu_fetch($key, &$success = null) - { - if (strpos($key, ThriftClassLoaderTest::APCU_PREFIX) === false) { - throw new \Exception('apcu_fetch error, invalid key'); - } - - return false; - } - - function apcu_store($key, $var, $ttl = 0) - { - if (strpos($key, ThriftClassLoaderTest::APCU_PREFIX) === false) { - throw new \Exception('apcu_store error, invalid key'); - } - - return false; - } - } -} diff --git a/lib/php/test/Unit/Lib/Factory/TBinaryProtocolFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TBinaryProtocolFactoryTest.php index 5f7c2a25287..76ff187d69d 100644 --- a/lib/php/test/Unit/Lib/Factory/TBinaryProtocolFactoryTest.php +++ b/lib/php/test/Unit/Lib/Factory/TBinaryProtocolFactoryTest.php @@ -17,8 +17,6 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * @package thrift.protocol */ namespace Test\Thrift\Unit\Lib\Factory; diff --git a/lib/php/test/Unit/Lib/Factory/TCompactProtocolFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TCompactProtocolFactoryTest.php index f81e789b4c5..1483c6ae2c5 100644 --- a/lib/php/test/Unit/Lib/Factory/TCompactProtocolFactoryTest.php +++ b/lib/php/test/Unit/Lib/Factory/TCompactProtocolFactoryTest.php @@ -17,8 +17,6 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * @package thrift.protocol */ namespace Test\Thrift\Unit\Lib\Factory; diff --git a/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php index 2cb32d8d3b9..3b8b5cc44f3 100644 --- a/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php +++ b/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php @@ -17,8 +17,6 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * @package thrift.protocol */ namespace Test\Thrift\Unit\Lib\Factory; diff --git a/lib/php/test/Unit/Lib/Factory/TJSONProtocolFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TJSONProtocolFactoryTest.php index 0685af79707..9c7055dbfbe 100644 --- a/lib/php/test/Unit/Lib/Factory/TJSONProtocolFactoryTest.php +++ b/lib/php/test/Unit/Lib/Factory/TJSONProtocolFactoryTest.php @@ -17,8 +17,6 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * @package thrift.protocol */ namespace Test\Thrift\Unit\Lib\Factory; diff --git a/lib/php/test/Unit/Lib/Factory/TStringFuncFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TStringFuncFactoryTest.php index eb4df44d045..c6feb2c3916 100644 --- a/lib/php/test/Unit/Lib/Factory/TStringFuncFactoryTest.php +++ b/lib/php/test/Unit/Lib/Factory/TStringFuncFactoryTest.php @@ -17,12 +17,11 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * @package thrift.protocol */ namespace Test\Thrift\Unit\Lib\Factory; +use phpmock\phpunit\PHPMock; use PHPUnit\Framework\TestCase; use Thrift\Factory\TStringFuncFactory; use Thrift\StringFunc\Core; @@ -31,16 +30,21 @@ class TStringFuncFactoryTest extends TestCase { + use PHPMock; + /** - * @return void + * @dataProvider createDataProvider */ - public function testCreate() - { - $factory = new TStringFuncFactory(); - $stringFunc = $factory::create(); - $this->assertInstanceOf(TStringFunc::class, $stringFunc); - $this->assertInstanceOf(Mbstring::class, $stringFunc); + public function testCreate( + $mbstringFuncOverload, + $expectedClass + ) { + $this->getFunctionMock('Thrift\Factory', 'ini_get') + ->expects($this->once()) + ->with('mbstring.func_overload') + ->willReturn($mbstringFuncOverload); + $factory = new TStringFuncFactory(); /** * it is a hack to nullable the instance of TStringFuncFactory, and get a new instance based on the new ini_get value */ @@ -50,25 +54,21 @@ public function testCreate() $refInstance->setValue($factory, null); $stringFunc = $factory::create(); + $this->assertInstanceOf(TStringFunc::class, $stringFunc); - $this->assertInstanceOf(Core::class, $stringFunc); + $this->assertInstanceOf($expectedClass, $stringFunc); } -} + public function createDataProvider() + { + yield 'mbstring' => [ + 'mbstring.func_overload' => 2, + 'expected' => Mbstring::class + ]; -namespace Thrift\Factory; - -function ini_get($key) -{ - static $count = 0; - if ($key === 'mbstring.func_overload') { - if ($count === 0) { - $count++; - return 2; - } else { - return 0; - } - } else { - return \ini_get($key); + yield 'string' => [ + 'mbstring.func_overload' => 0, + 'expected' => Core::class + ]; } } diff --git a/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php index da91b64b355..a8a791ad121 100644 --- a/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php +++ b/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php @@ -17,8 +17,6 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * - * @package thrift.protocol */ namespace Test\Thrift\Unit\Lib\Factory; diff --git a/lib/php/test/Unit/Lib/Transport/TBufferedTransportTest.php b/lib/php/test/Unit/Lib/Transport/TBufferedTransportTest.php new file mode 100644 index 00000000000..dd6003a8541 --- /dev/null +++ b/lib/php/test/Unit/Lib/Transport/TBufferedTransportTest.php @@ -0,0 +1,286 @@ +createMock(TTransport::class); + $bufferedTransport = new TBufferedTransport($transport); + + $transport + ->expects($this->once()) + ->method('isOpen') + ->willReturn(true); + + $this->assertTrue($bufferedTransport->isOpen()); + } + + public function testOpen() + { + $transport = $this->createMock(TTransport::class); + $bufferedTransport = new TBufferedTransport($transport); + + $transport + ->expects($this->once()) + ->method('open') + ->willReturn(null); + + $this->assertNull($bufferedTransport->open()); + } + + public function testClose() + { + $transport = $this->createMock(TTransport::class); + $bufferedTransport = new TBufferedTransport($transport); + + $transport + ->expects($this->once()) + ->method('close') + ->willReturn(null); + + $this->assertNull($bufferedTransport->close()); + } + + public function testPutBack() + { + $transport = $this->createMock(TTransport::class); + $bufferedTransport = new TBufferedTransport($transport); + $bufferedTransport->putBack('test'); + + $ref = new \ReflectionClass($bufferedTransport); + $property = $ref->getProperty('rBuf_'); + $property->setAccessible(true); + $this->assertEquals('test', $property->getValue($bufferedTransport)); + + $bufferedTransport->putBack('abcde'); + $this->assertEquals('abcdetest', $property->getValue($bufferedTransport)); + } + + /** + * @dataProvider readAllDataProvider + */ + public function testReadAll( + $startBuffer, + $readLength, + $bufferReadLength, + $bufferReadResult, + $expectedBufferValue, + $expectedRead + ) { + $transport = $this->createMock(TTransport::class); + $bufferedTransport = new TBufferedTransport($transport); + $bufferedTransport->putBack($startBuffer); + + $transport + ->expects($bufferReadLength > 0 ? $this->once() : $this->never()) + ->method('readAll') + ->with($bufferReadLength) + ->willReturn($bufferReadResult); + + $this->assertEquals($expectedRead, $bufferedTransport->readAll($readLength)); + + $ref = new \ReflectionClass($bufferedTransport); + $property = $ref->getProperty('rBuf_'); + $property->setAccessible(true); + $this->assertEquals($expectedBufferValue, $property->getValue($bufferedTransport)); + } + + public function readAllDataProvider() + { + yield 'buffer empty' => [ + 'startBuffer' => '', + 'readLength' => 5, + 'bufferReadLength' => 5, + 'bufferReadResult' => '12345', + 'expectedBufferValue' => '', + 'expectedRead' => '12345', + ]; + yield 'buffer have partly loaded data' => [ + 'startBuffer' => '12345', + 'readLength' => 10, + 'bufferReadLength' => 5, + 'bufferReadResult' => '67890', + 'expectedBufferValue' => '', + 'expectedRead' => '1234567890', + ]; + yield 'buffer fully read' => [ + 'startBuffer' => '12345', + 'readLength' => 5, + 'bufferReadLength' => 0, + 'bufferReadResult' => '', + 'expectedBufferValue' => '', + 'expectedRead' => '12345', + ]; + yield 'request less data that we have in buffer' => [ + 'startBuffer' => '12345', + 'readLength' => 3, + 'bufferReadLength' => 0, + 'bufferReadResult' => '', + 'expectedBufferValue' => '45', + 'expectedRead' => '123', + ]; + } + + /** + * @dataProvider readDataProvider + */ + public function testRead( + $readBufferSize, + $startBuffer, + $readLength, + $bufferReadResult, + $expectedBufferValue, + $expectedRead + ) { + $transport = $this->createMock(TTransport::class); + $bufferedTransport = new TBufferedTransport($transport, $readBufferSize); + $bufferedTransport->putBack($startBuffer); + + $transport + ->expects(empty($startBuffer) > 0 ? $this->once() : $this->never()) + ->method('read') + ->with($readBufferSize) + ->willReturn($bufferReadResult); + + $this->assertEquals($expectedRead, $bufferedTransport->read($readLength)); + + $ref = new \ReflectionClass($bufferedTransport); + $property = $ref->getProperty('rBuf_'); + $property->setAccessible(true); + $this->assertEquals($expectedBufferValue, $property->getValue($bufferedTransport)); + } + + public function readDataProvider() + { + yield 'buffer empty' => [ + 'readBufferSize' => 10, + 'startBuffer' => '', + 'readLength' => 5, + 'bufferReadResult' => '12345', + 'expectedBufferValue' => '', + 'expectedRead' => '12345', + ]; + yield 'buffer read partly' => [ + 'readBufferSize' => 10, + 'startBuffer' => '', + 'readLength' => 5, + 'bufferReadResult' => '1234567890', + 'expectedBufferValue' => '67890', + 'expectedRead' => '12345', + ]; + yield 'buffer fully read' => [ + 'readBufferSize' => 10, + 'startBuffer' => '12345', + 'readLength' => 5, + 'bufferReadResult' => '', + 'expectedBufferValue' => '', + 'expectedRead' => '12345', + ]; + } + + /** + * @dataProvider writeDataProvider + */ + public function testWrite( + $writeBufferSize, + $writeData, + $bufferedTransportCall, + $expectedWriteBufferValue + ) { + $transport = $this->createMock(TTransport::class); + $bufferedTransport = new TBufferedTransport($transport, 512, $writeBufferSize); + + $transport + ->expects($this->exactly($bufferedTransportCall)) + ->method('write') + ->with($writeData) + ->willReturn(null); + + $this->assertNull($bufferedTransport->write($writeData)); + + $ref = new \ReflectionClass($bufferedTransport); + $property = $ref->getProperty('wBuf_'); + $property->setAccessible(true); + $this->assertEquals($expectedWriteBufferValue, $property->getValue($bufferedTransport)); + } + + public function writeDataProvider() + { + yield 'store data in buffer' => [ + 'writeBufferSize' => 10, + 'writeData' => '12345', + 'bufferedTransportCall' => 0, + 'expectedWriteBufferValue' => '12345', + ]; + yield 'send data to buffered transport' => [ + 'writeBufferSize' => 10, + 'writeData' => '12345678901', + 'bufferedTransportCall' => 1, + 'expectedWriteBufferValue' => '', + ]; + } + + /** + * @dataProvider flushDataProvider + */ + public function testFlush( + $writeBuffer + ) { + $transport = $this->createMock(TTransport::class); + $bufferedTransport = new TBufferedTransport($transport, 512, 512); + $ref = new \ReflectionClass($bufferedTransport); + $property = $ref->getProperty('wBuf_'); + $property->setAccessible(true); + $property->setValue($bufferedTransport, $writeBuffer); + + $transport + ->expects(!empty($writeBuffer) ? $this->once() : $this->never()) + ->method('write') + ->with($writeBuffer) + ->willReturn(null); + + $transport + ->expects($this->once()) + ->method('flush') + ->willReturn(null); + + $this->assertNull($bufferedTransport->flush()); + + $this->assertEquals('', $property->getValue($bufferedTransport)); + } + + public function flushDataProvider() + { + yield 'empty buffer' => [ + 'writeBuffer' => '', + ]; + yield 'not empty buffer' => [ + 'writeBuffer' => '12345', + ]; + } +} diff --git a/lib/php/test/Unit/Lib/Transport/TCurlClientTest.php b/lib/php/test/Unit/Lib/Transport/TCurlClientTest.php new file mode 100644 index 00000000000..7cd7446bb42 --- /dev/null +++ b/lib/php/test/Unit/Lib/Transport/TCurlClientTest.php @@ -0,0 +1,423 @@ +setTimeoutSecs(1000); + + $ref = new \ReflectionClass($transport); + $prop = $ref->getProperty('timeout_'); + $prop->setAccessible(true); + $this->assertEquals(1000, $prop->getValue($transport)); + } + + public function testSetConnectionTimeoutSecs() + { + $host = 'localhost'; + $transport = new TCurlClient($host); + $transport->setConnectionTimeoutSecs(1000); + + $ref = new \ReflectionClass($transport); + $prop = $ref->getProperty('connectionTimeout_'); + $prop->setAccessible(true); + $this->assertEquals(1000, $prop->getValue($transport)); + } + + public function testIsOpen() + { + $host = 'localhost'; + $transport = new TCurlClient($host); + $this->assertTrue($transport->isOpen()); + } + + public function testOpen() + { + $host = 'localhost'; + $transport = new TCurlClient($host); + $this->assertNull($transport->open()); + } + + public function testClose() + { + $host = 'localhost'; + $transport = new TCurlClient($host); + + $ref = new \ReflectionClass($transport); + $propRequest = $ref->getProperty('request_'); + $propRequest->setAccessible(true); + $propRequest->setValue($transport, 'testRequest'); + $propResponse = $ref->getProperty('response_'); + $propResponse->setAccessible(true); + $propResponse->setValue($transport, 'testResponse'); + + $this->assertNull($transport->close()); + $this->assertEmpty($propRequest->getValue($transport)); + $this->assertEmpty($propResponse->getValue($transport)); + } + + public function testRead() + { + $host = 'localhost'; + $transport = new TCurlClient($host); + + $ref = new \ReflectionClass($transport); + $propResponse = $ref->getProperty('response_'); + $propResponse->setAccessible(true); + $propResponse->setValue($transport, '1234567890'); + + $response = $transport->read(5); + $this->assertEquals('12345', $response); + $this->assertEquals('67890', $propResponse->getValue($transport)); + + $response = $transport->read(5); + $this->assertEquals('67890', $response); + # The response does not cleaned after reading full answer, maybe it should be fixed + $this->assertEquals('67890', $propResponse->getValue($transport)); + } + + public function testReadAll() + { + $host = 'localhost'; + $transport = new TCurlClient($host); + + $ref = new \ReflectionClass($transport); + $propResponse = $ref->getProperty('response_'); + $propResponse->setAccessible(true); + $propResponse->setValue($transport, '1234567890'); + + $response = $transport->readAll(5); + $this->assertEquals('12345', $response); + $this->assertEquals('67890', $propResponse->getValue($transport)); + } + + public function testReadAll_THRIFT_4656() + { + $host = 'localhost'; + $transport = new TCurlClient($host); + + $ref = new \ReflectionClass($transport); + $propResponse = $ref->getProperty('response_'); + $propResponse->setAccessible(true); + $propResponse->setValue($transport, ''); + + $this->expectException(TTransportException::class); + $this->expectExceptionMessage('TCurlClient could not read 5 bytes'); + $this->expectExceptionCode(TTransportException::UNKNOWN); + + $transport->readAll(5); + } + + public function testWrite() + { + $host = 'localhost'; + $transport = new TCurlClient($host); + + $ref = new \ReflectionClass($transport); + $propRequest = $ref->getProperty('request_'); + $propRequest->setAccessible(true); + $propRequest->setValue($transport, '1234567890'); + + $transport->write('12345'); + $this->assertEquals('123456789012345', $propRequest->getValue($transport)); + } + + public function testAddHeaders() + { + $host = 'localhost'; + $transport = new TCurlClient($host); + + $ref = new \ReflectionClass($transport); + $propRequest = $ref->getProperty('headers_'); + $propRequest->setAccessible(true); + $propRequest->setValue($transport, ['test' => '1234567890']); + + $transport->addHeaders(['test2' => '12345']); + $this->assertEquals(['test' => '1234567890', 'test2' => '12345'], $propRequest->getValue($transport)); + } + + /** + * @dataProvider flushDataProvider + */ + public function testFlush( + $host, + $port, + $uri, + $scheme, + $headers, + $request, + $timeout, + $connectionTimeout, + $curlSetOptCalls, + $response, + $responseError, + $responseCode, + $expectedException = null, + $expectedMessage = null, + $expectedCode = null + ) { + $this->getFunctionMock('Thrift\\Transport', 'register_shutdown_function') + ->expects($this->once()) + ->with( + $this->callback( + function ($arg) { + return is_array( + $arg + ) && $arg[0] === 'Thrift\\Transport\\TCurlClient' && $arg[1] === 'closeCurlHandle'; + } + ) + ); + $this->getFunctionMock('Thrift\\Transport', 'curl_init') + ->expects($this->once()); + + $this->getFunctionMock('Thrift\\Transport', 'curl_setopt') + ->expects($this->any()) + ->withConsecutive(...$curlSetOptCalls) + ->willReturn(true); + + $this->getFunctionMock('Thrift\\Transport', 'curl_exec') + ->expects($this->once()) + ->with($this->anything()) + ->willReturn($response); + + $this->getFunctionMock('Thrift\\Transport', 'curl_error') + ->expects($this->once()) + ->with($this->anything()) + ->willReturn($responseError); + + $this->getFunctionMock('Thrift\\Transport', 'curl_getinfo') + ->expects($this->once()) + ->with($this->anything(), CURLINFO_HTTP_CODE) + ->willReturn($responseCode); + + if (!is_null($expectedException)) { + $this->expectException($expectedException); + $this->expectExceptionMessage($expectedMessage); + $this->expectExceptionCode($expectedCode); + + $this->getFunctionMock('Thrift\\Transport', 'curl_close') + ->expects($this->once()) + ->with($this->anything()); + } + + $transport = new TCurlClient($host, $port, $uri, $scheme); + if (!empty($headers)) { + $transport->addHeaders($headers); + } + $transport->write($request); + if (!empty($timeout)) { + $transport->setTimeoutSecs($timeout); + } + if (!empty($connectionTimeout)) { + $transport->setConnectionTimeoutSecs($connectionTimeout); + } + + $transport->flush(); + } + + public function flushDataProvider() + { + $request = 'request'; + + $default = [ + 'host' => 'localhost', + 'port' => 80, + 'uri' => '', + 'scheme' => 'http', + 'headers' => [], + 'request' => $request, + 'timeout' => null, + 'connectionTimeout' => null, + 'curlSetOptCalls' => [ + [$this->anything(), CURLOPT_RETURNTRANSFER, true], + [$this->anything(), CURLOPT_USERAGENT, 'PHP/TCurlClient'], + [$this->anything(), CURLOPT_CUSTOMREQUEST, 'POST'], + [$this->anything(), CURLOPT_FOLLOWLOCATION, true], + [$this->anything(), CURLOPT_MAXREDIRS, 1], + [ + $this->anything(), + CURLOPT_HTTPHEADER, + [ + 'Accept: application/x-thrift', + 'Content-Type: application/x-thrift', + 'Content-Length: ' . strlen($request), + ], + ], + [$this->anything(), CURLOPT_POSTFIELDS, $request], + [$this->anything(), CURLOPT_URL, 'http://localhost'], + ], + 'response' => 'response', + 'responseError' => '', + 'responseCode' => 200, + ]; + + yield 'default' => $default; + yield 'additionalHeaders' => array_merge( + $default, + [ + 'headers' => ['test' => '1234567890'], + 'curlSetOptCalls' => [ + [$this->anything(), CURLOPT_RETURNTRANSFER, true], + [$this->anything(), CURLOPT_USERAGENT, 'PHP/TCurlClient'], + [$this->anything(), CURLOPT_CUSTOMREQUEST, 'POST'], + [$this->anything(), CURLOPT_FOLLOWLOCATION, true], + [$this->anything(), CURLOPT_MAXREDIRS, 1], + [ + $this->anything(), + CURLOPT_HTTPHEADER, + [ + 'Accept: application/x-thrift', + 'Content-Type: application/x-thrift', + 'Content-Length: ' . strlen($request), + 'test: 1234567890', + ], + ], + [$this->anything(), CURLOPT_POSTFIELDS, $request], + [$this->anything(), CURLOPT_URL, 'http://localhost'], + ], + ] + ); + yield 'uri' => array_merge( + $default, + [ + 'uri' => 'test1234567890', + 'curlSetOptCalls' => [ + [$this->anything(), CURLOPT_RETURNTRANSFER, true], + [$this->anything(), CURLOPT_USERAGENT, 'PHP/TCurlClient'], + [$this->anything(), CURLOPT_CUSTOMREQUEST, 'POST'], + [$this->anything(), CURLOPT_FOLLOWLOCATION, true], + [$this->anything(), CURLOPT_MAXREDIRS, 1], + [ + $this->anything(), + CURLOPT_HTTPHEADER, + [ + 'Accept: application/x-thrift', + 'Content-Type: application/x-thrift', + 'Content-Length: ' . strlen($request), + ], + ], + [$this->anything(), CURLOPT_POSTFIELDS, $request], + [$this->anything(), CURLOPT_URL, 'http://localhost/test1234567890'], + ], + ] + ); + yield 'timeout' => array_merge( + $default, + [ + 'timeout' => 10, + 'connectionTimeout' => 10, + 'curlSetOptCalls' => [ + [$this->anything(), CURLOPT_RETURNTRANSFER, true], + [$this->anything(), CURLOPT_USERAGENT, 'PHP/TCurlClient'], + [$this->anything(), CURLOPT_CUSTOMREQUEST, 'POST'], + [$this->anything(), CURLOPT_FOLLOWLOCATION, true], + [$this->anything(), CURLOPT_MAXREDIRS, 1], + [ + $this->anything(), + CURLOPT_HTTPHEADER, + [ + 'Accept: application/x-thrift', + 'Content-Type: application/x-thrift', + 'Content-Length: ' . strlen($request), + ], + ], + [$this->anything(), CURLOPT_TIMEOUT, 10], + [$this->anything(), CURLOPT_CONNECTTIMEOUT, 10], + [$this->anything(), CURLOPT_POSTFIELDS, $request], + [$this->anything(), CURLOPT_URL, 'http://localhost'], + ], + ] + ); + yield 'timeout msec' => array_merge( + $default, + [ + 'timeout' => 0.1, + 'connectionTimeout' => 0.1, + 'curlSetOptCalls' => [ + [$this->anything(), CURLOPT_RETURNTRANSFER, true], + [$this->anything(), CURLOPT_USERAGENT, 'PHP/TCurlClient'], + [$this->anything(), CURLOPT_CUSTOMREQUEST, 'POST'], + [$this->anything(), CURLOPT_FOLLOWLOCATION, true], + [$this->anything(), CURLOPT_MAXREDIRS, 1], + [ + $this->anything(), + CURLOPT_HTTPHEADER, + [ + 'Accept: application/x-thrift', + 'Content-Type: application/x-thrift', + 'Content-Length: ' . strlen($request), + ], + ], + [$this->anything(), CURLOPT_TIMEOUT_MS, 100], + [$this->anything(), CURLOPT_CONNECTTIMEOUT_MS, 100], + [$this->anything(), CURLOPT_POSTFIELDS, $request], + [$this->anything(), CURLOPT_URL, 'http://localhost'], + ], + ] + ); + yield 'curl_exec return false' => array_merge( + $default, + [ + 'response' => false, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'TCurlClient: Could not connect to http://localhost', + 'expectedCode' => TTransportException::UNKNOWN, + ] + ); + yield 'curl_exec return response code 403' => array_merge( + $default, + [ + 'responseError' => 'Access denied', + 'responseCode' => 403, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'TCurlClient: Could not connect to http://localhost, Access denied, HTTP status code: 403', + 'expectedCode' => TTransportException::UNKNOWN, + ] + ); + } + + public function testCloseCurlHandle() + { + $this->getFunctionMock('Thrift\\Transport', 'curl_close') + ->expects($this->once()) + ->with('testHandle'); + + $transport = new TCurlClient('localhost'); + $ref = new \ReflectionClass($transport); + $prop = $ref->getProperty('curlHandle'); + $prop->setAccessible(true); + $prop->setValue($transport, 'testHandle'); + + $transport::closeCurlHandle(); + } +} diff --git a/lib/php/test/Unit/Lib/Transport/TFramedTransportTest.php b/lib/php/test/Unit/Lib/Transport/TFramedTransportTest.php new file mode 100644 index 00000000000..2607ddbf8b6 --- /dev/null +++ b/lib/php/test/Unit/Lib/Transport/TFramedTransportTest.php @@ -0,0 +1,240 @@ +createMock(TTransport::class); + $framedTransport = new TFramedTransport($transport); + + $transport + ->expects($this->once()) + ->method('isOpen') + ->willReturn(true); + + $this->assertTrue($framedTransport->isOpen()); + } + + public function testOpen() + { + $transport = $this->createMock(TTransport::class); + $framedTransport = new TFramedTransport($transport); + + $transport + ->expects($this->once()) + ->method('open') + ->willReturn(null); + + $this->assertNull($framedTransport->open()); + } + + public function testClose() + { + $transport = $this->createMock(TTransport::class); + $framedTransport = new TFramedTransport($transport); + + $transport + ->expects($this->once()) + ->method('close') + ->willReturn(null); + + $this->assertNull($framedTransport->close()); + } + + public function testPutBack() + { + $transport = $this->createMock(TTransport::class); + $framedTransport = new TFramedTransport($transport); + $framedTransport->putBack('test'); + + $ref = new \ReflectionClass($framedTransport); + $property = $ref->getProperty('rBuf_'); + $property->setAccessible(true); + $this->assertEquals('test', $property->getValue($framedTransport)); + + $framedTransport->putBack('abcde'); + $this->assertEquals('abcdetest', $property->getValue($framedTransport)); + } + + /** + * @dataProvider readDataProvider + */ + public function testRead( + $readAllowed, + $readBuffer, + $lowLevelTransportReadResult, + $lowLevelTransportReadAllParams, + $lowLevelTransportReadAllResult, + $readLength, + $expectedReadResult + ) { + $transport = $this->createMock(TTransport::class); + $framedTransport = new TFramedTransport($transport, $readAllowed); + $framedTransport->putBack($readBuffer); + + $transport + ->expects($readAllowed ? $this->never() : $this->once()) + ->method('read') + ->with($readLength) + ->willReturn($lowLevelTransportReadResult); + + $transport + ->expects($this->exactly(count($lowLevelTransportReadAllParams))) + ->method('readAll') + ->withConsecutive(...$lowLevelTransportReadAllParams) + ->willReturnOnConsecutiveCalls(...$lowLevelTransportReadAllResult); + + $this->assertEquals($expectedReadResult, $framedTransport->read($readLength)); + } + + public function readDataProvider() + { + yield 'read not allowed' => [ + 'readAllowed' => false, + 'readBuffer' => '', + 'lowLevelTransportReadResult' => '12345', + 'lowLevelTransportReadAllParams' => [], + 'lowLevelTransportReadAllResult' => [], + 'readLength' => 5, + 'expectedReadResult' => '12345', + ]; + yield 'read fully buffered item' => [ + 'readAllowed' => true, + 'readBuffer' => '', + 'lowLevelTransportReadResult' => '', + 'lowLevelTransportReadAllParams' => [[4], [5]], + 'lowLevelTransportReadAllResult' => [pack('N', '5'), '12345'], + 'readLength' => 5, + 'expectedReadResult' => '12345', + ]; + yield 'read partly buffered item' => [ + 'readAllowed' => true, + 'readBuffer' => '', + 'lowLevelTransportReadResult' => '', + 'lowLevelTransportReadAllParams' => [[4], [10]], + 'lowLevelTransportReadAllResult' => [pack('N', '10'), '1234567890'], + 'readLength' => 5, + 'expectedReadResult' => '12345', + ]; + } + + /** + * @dataProvider writeDataProvider + */ + public function testWrite( + $writeAllowed, + $writeData, + $writeLength, + $expectedWriteBufferValue + ) { + $transport = $this->createMock(TTransport::class); + $framedTransport = new TFramedTransport($transport, true, $writeAllowed); + + $transport + ->expects($writeAllowed ? $this->never() : $this->once()) + ->method('write') + ->with('12345', 5) + ->willReturn(5); + + $framedTransport->write($writeData, $writeLength); + + $ref = new \ReflectionClass($framedTransport); + $property = $ref->getProperty('wBuf_'); + $property->setAccessible(true); + $this->assertEquals($expectedWriteBufferValue, $property->getValue($framedTransport)); + } + + public function writeDataProvider() + { + yield 'write not allowed' => [ + 'writeAllowed' => false, + 'writeData' => '12345', + 'writeLength' => 5, + 'expectedWriteBufferValue' => '', + ]; + yield 'write full' => [ + 'writeAllowed' => true, + 'writeData' => '12345', + 'writeLength' => 5, + 'expectedWriteBufferValue' => '12345', + ]; + yield 'write partly' => [ + 'writeAllowed' => true, + 'writeData' => '1234567890', + 'writeLength' => 5, + 'expectedWriteBufferValue' => '12345', + ]; + } + + /** + * @dataProvider flushDataProvider + */ + public function testFlush( + $writeAllowed, + $writeBuffer, + $lowLevelTransportWrite + ) { + $transport = $this->createMock(TTransport::class); + $framedTransport = new TFramedTransport($transport, true, $writeAllowed); + $ref = new \ReflectionClass($framedTransport); + $property = $ref->getProperty('wBuf_'); + $property->setAccessible(true); + $property->setValue($framedTransport, $writeBuffer); + + $transport + ->expects($this->once()) + ->method('flush'); + + $transport + ->expects($writeAllowed && !empty($writeBuffer) ? $this->once() : $this->never()) + ->method('write') + ->with($lowLevelTransportWrite) + ->willReturn(null); + + $this->assertNull($framedTransport->flush()); + } + + public function flushDataProvider() + { + yield 'write not allowed' => [ + 'writeAllowed' => false, + 'writeBuffer' => '12345', + 'lowLevelTransportWrite' => '', + ]; + yield 'empty buffer' => [ + 'writeAllowed' => true, + 'writeBuffer' => '', + 'lowLevelTransportWrite' => '', + ]; + yield 'write full' => [ + 'writeAllowed' => true, + 'writeBuffer' => '12345', + 'lowLevelTransportWrite' => pack('N', strlen('12345')) . '12345', + ]; + } +} diff --git a/lib/php/test/Unit/Lib/Transport/THttpClientTest.php b/lib/php/test/Unit/Lib/Transport/THttpClientTest.php new file mode 100644 index 00000000000..ce6813c1bd1 --- /dev/null +++ b/lib/php/test/Unit/Lib/Transport/THttpClientTest.php @@ -0,0 +1,332 @@ +setTimeoutSecs(1000); + + $ref = new \ReflectionClass($transport); + $prop = $ref->getProperty('timeout_'); + $prop->setAccessible(true); + $this->assertEquals(1000, $prop->getValue($transport)); + } + + public function testIsOpen() + { + $host = 'localhost'; + $transport = new THttpClient($host); + $this->assertTrue($transport->isOpen()); + } + + public function testOpen() + { + $host = 'localhost'; + $transport = new THttpClient($host); + $this->assertNull($transport->open()); + } + + public function testClose() + { + $handle = fopen('php://temp', 'r+'); + $this->getFunctionMock('Thrift\\Transport', 'fclose') + ->expects($this->once()) + ->with($handle) + ->willReturn(true); + + $host = 'localhost'; + $transport = new THttpClient($host); + + $ref = new \ReflectionClass($transport); + $propRequest = $ref->getProperty('handle_'); + $propRequest->setAccessible(true); + $propRequest->setValue($transport, $handle); + + $this->assertNull($transport->close()); + $this->assertNull($propRequest->getValue($transport)); + } + + /** + * @dataProvider readDataProvider + */ + public function testRead( + $readLen, + $freadResult, + $streamGetMetaDataResult, + $expectedResult, + $expectedException, + $expectedExceptionMessage, + $expectedExceptionCode + ) { + $handle = fopen('php://temp', 'r+'); + $this->getFunctionMock('Thrift\\Transport', 'fread') + ->expects($this->once()) + ->with($handle, $readLen) + ->willReturn($freadResult); + + $this->getFunctionMock('Thrift\\Transport', 'stream_get_meta_data') + ->expects(!empty($streamGetMetaDataResult) ? $this->once() : $this->never()) + ->with($handle) + ->willReturn($streamGetMetaDataResult); + + if ($expectedException) { + $this->expectException($expectedException); + $this->expectExceptionMessage($expectedExceptionMessage); + $this->expectExceptionCode($expectedExceptionCode); + } + + $host = 'localhost'; + $transport = new THttpClient($host); + + $ref = new \ReflectionClass($transport); + $propRequest = $ref->getProperty('handle_'); + $propRequest->setAccessible(true); + $propRequest->setValue($transport, $handle); + + $this->assertEquals($expectedResult, $transport->read($readLen)); + } + + public function readDataProvider() + { + yield 'read success' => [ + 'readLen' => 10, + 'freadResult' => '1234567890', + 'streamGetMetaDataResult' => [], + 'expectedResult' => '1234567890', + 'expectedException' => null, + 'expectedExceptionMessage' => null, + 'expectedExceptionCode' => null, + ]; + yield 'read failed' => [ + 'readLen' => 10, + 'freadResult' => false, + 'streamGetMetaDataResult' => [ + 'timed_out' => false, + ], + 'expectedResult' => '', + 'expectedException' => TTransportException::class, + 'expectedExceptionMessage' => 'THttpClient: Could not read 10 bytes from localhost:80', + 'expectedExceptionCode' => TTransportException::UNKNOWN, + ]; + yield 'read timeout' => [ + 'readLen' => 10, + 'freadResult' => '', + 'streamGetMetaDataResult' => [ + 'timed_out' => true, + ], + 'expectedResult' => '', + 'expectedException' => TTransportException::class, + 'expectedExceptionMessage' => 'THttpClient: timed out reading 10 bytes from localhost:80', + 'expectedExceptionCode' => TTransportException::TIMED_OUT, + ]; + } + + public function testWrite() + { + $host = 'localhost'; + $transport = new THttpClient($host); + + $ref = new \ReflectionClass($transport); + $prop = $ref->getProperty('buf_'); + $prop->setAccessible(true); + + $transport->write('1234567890'); + + $this->assertEquals('1234567890', $prop->getValue($transport)); + } + + /** + * @dataProvider flushDataProvider + */ + public function testFlush( + $host, + $port, + $uri, + $scheme, + $context, + $headers, + $timeout, + $streamContextOptions, + $streamContext, + $fopenResult, + $expectedHost, + $expectedUri, + $expectedException, + $expectedExceptionMessage, + $expectedExceptionCode + ) { + $this->getFunctionMock('Thrift\\Transport', 'stream_context_create') + ->expects($this->once()) + ->with($streamContextOptions) + ->willReturn($streamContext); + + $this->getFunctionMock('Thrift\\Transport', 'fopen') + ->expects($this->once()) + ->with( + $scheme . '://' . $expectedHost . $expectedUri, + 'r', + false, + $streamContext + )->willReturn($fopenResult); + + if ($expectedException) { + $this->expectException($expectedException); + $this->expectExceptionMessage($expectedExceptionMessage); + $this->expectExceptionCode($expectedExceptionCode); + } + + $transport = new THttpClient($host, $port, $uri, $scheme, $context); + if (!empty($headers)) { + $transport->addHeaders($headers); + } + if (!empty($timeout)) { + $transport->setTimeoutSecs($timeout); + } + + $this->assertNull($transport->flush()); + } + + public function flushDataProvider() + { + $default = [ + 'host' => 'localhost', + 'port' => '80', + 'uri' => '', + 'scheme' => 'http', + 'context' => [], + 'headers' => [], + 'timeout' => null, + 'streamContextOptions' => [ + 'http' => [ + 'method' => 'POST', + 'header' => "Host: localhost\r\n" . + "Accept: application/x-thrift\r\n" . + "User-Agent: PHP/THttpClient\r\n" . + "Content-Type: application/x-thrift\r\n" . + "Content-Length: 0", + 'content' => '', + 'max_redirects' => 1, + ], + ], + 'streamContext' => fopen('php://temp', 'r+'), + 'fopenResult' => fopen('php://memory', 'r+'), + 'expectedHost' => 'localhost', + 'expectedUri' => '', + 'expectedException' => '', + 'expectedExceptionMessage' => '', + 'expectedExceptionCode' => '', + ]; + + yield 'success' => $default; + yield 'additionalHeaders' => array_merge( + $default, + [ + 'headers' => [ + 'X-Test-Header' => 'test', + ], + 'streamContextOptions' => [ + 'http' => [ + 'method' => 'POST', + 'header' => "Host: localhost\r\n" . + "Accept: application/x-thrift\r\n" . + "User-Agent: PHP/THttpClient\r\n" . + "Content-Type: application/x-thrift\r\n" . + "Content-Length: 0\r\n" . + "X-Test-Header: test", + 'content' => '', + 'max_redirects' => 1, + ], + ], + ] + ); + yield 'timeout' => array_merge( + $default, + [ + 'timeout' => 1000, + 'streamContextOptions' => [ + 'http' => [ + 'method' => 'POST', + 'header' => "Host: localhost\r\n" . + "Accept: application/x-thrift\r\n" . + "User-Agent: PHP/THttpClient\r\n" . + "Content-Type: application/x-thrift\r\n" . + "Content-Length: 0", + 'content' => '', + 'max_redirects' => 1, + 'timeout' => 1000, + ], + ], + ] + ); + yield 'fopenFailed' => array_merge( + $default, + [ + 'host' => 'localhost', + 'port' => 8080, + 'uri' => 'test', + 'expectedHost' => 'localhost:8080', + 'expectedUri' => '/test', + 'streamContextOptions' => [ + 'http' => [ + 'method' => 'POST', + 'header' => "Host: localhost:8080\r\n" . + "Accept: application/x-thrift\r\n" . + "User-Agent: PHP/THttpClient\r\n" . + "Content-Type: application/x-thrift\r\n" . + "Content-Length: 0", + 'content' => '', + 'max_redirects' => 1, + ], + ], + 'fopenResult' => false, + 'expectedException' => TTransportException::class, + 'expectedExceptionMessage' => 'THttpClient: Could not connect to localhost:8080/test', + 'expectedExceptionCode' => TTransportException::NOT_OPEN, + ] + ); + } + + public function testAddHeaders() + { + $host = 'localhost'; + $transport = new THttpClient($host); + + $ref = new \ReflectionClass($transport); + $propRequest = $ref->getProperty('headers_'); + $propRequest->setAccessible(true); + $propRequest->setValue($transport, ['test' => '1234567890']); + + $transport->addHeaders(['test2' => '12345']); + $this->assertEquals(['test' => '1234567890', 'test2' => '12345'], $propRequest->getValue($transport)); + } +} diff --git a/lib/php/test/Unit/Lib/Transport/TMemoryBufferTest.php b/lib/php/test/Unit/Lib/Transport/TMemoryBufferTest.php new file mode 100644 index 00000000000..06f0012ede5 --- /dev/null +++ b/lib/php/test/Unit/Lib/Transport/TMemoryBufferTest.php @@ -0,0 +1,143 @@ +assertTrue($transport->isOpen()); + } + + public function testOpen() + { + $transport = new TMemoryBuffer(); + $this->assertNull($transport->open()); + } + + public function testClose() + { + $transport = new TMemoryBuffer(); + $this->assertNull($transport->close()); + } + + public function testReadEmptyBuffer() + { + $transport = new TMemoryBuffer(); + $this->expectException(\Thrift\Exception\TTransportException::class); + $this->expectExceptionMessage("TMemoryBuffer: Could not read 1 bytes from buffer."); + $this->expectExceptionCode(TTransportException::UNKNOWN); + $transport->read(1); + } + + /** + * @dataProvider readDataProvider + */ + public function testRead( + $startBuffer, + $readLength, + $expectedRead, + $expectedBuffer + ) { + $transport = new TMemoryBuffer($startBuffer); + $this->assertEquals($expectedRead, $transport->read($readLength)); + $this->assertEquals($expectedBuffer, $transport->getBuffer()); + } + + public function readDataProvider() + { + yield 'Read part of buffer' => [ + 'startBuffer' => '1234567890', + 'readLength' => 5, + 'expectedRead' => '12345', + 'expectedBuffer' => '67890', + ]; + yield 'Read part of buffer UTF' => [ + 'startBuffer' => 'Slovenščina', + 'readLength' => 6, + 'expectedRead' => 'Sloven', + 'expectedBuffer' => 'ščina', + ]; + yield 'Read part of buffer UTF 2' => [ + 'startBuffer' => 'Українська', + 'readLength' => 6, + 'expectedRead' => 'Укр', + 'expectedBuffer' => 'аїнська', + ]; + yield 'Read full' => [ + 'startBuffer' => '123456789', + 'readLength' => 10, + 'expectedRead' => '123456789', + 'expectedBuffer' => '', + ]; + } + + /** + * @dataProvider writeDataProvider + */ + public function testWrite( + $startBuffer, + $writeData, + $expectedBuffer + ) { + $transport = new TMemoryBuffer($startBuffer); + $transport->write($writeData); + $this->assertEquals($expectedBuffer, $transport->getBuffer()); + } + + public function writeDataProvider() + { + yield 'empty start buffer' => [ + 'startBuffer' => '', + 'writeData' => '12345', + 'expectedBuffer' => '12345', + ]; + yield 'not empty start buffer' => [ + 'startBuffer' => '67890', + 'writeData' => '12345', + 'expectedBuffer' => '6789012345', + ]; + yield 'not empty start buffer UTF' => [ + 'startBuffer' => 'Slovenščina', + 'writeData' => 'Українська', + 'expectedBuffer' => 'SlovenščinaУкраїнська', + ]; + } + + public function testAvailable() + { + $transport = new TMemoryBuffer('12345'); + $this->assertEquals('5', $transport->available()); + } + + public function testPutBack() + { + $transport = new TMemoryBuffer('12345'); + $transport->putBack('67890'); + $this->assertEquals('6789012345', $transport->getBuffer()); + } +} diff --git a/lib/php/test/Unit/Lib/Transport/TNullTransportTest.php b/lib/php/test/Unit/Lib/Transport/TNullTransportTest.php new file mode 100644 index 00000000000..044c703571c --- /dev/null +++ b/lib/php/test/Unit/Lib/Transport/TNullTransportTest.php @@ -0,0 +1,62 @@ +assertTrue($transport->isOpen()); + } + + public function testOpen() + { + $transport = new TNullTransport(); + $this->assertNull($transport->open()); + } + + public function testClose() + { + $transport = new TNullTransport(); + $this->assertNull($transport->close()); + } + + public function testRead() + { + $transport = new TNullTransport(); + $this->expectException(TTransportException::class); + $this->expectExceptionMessage("Can't read from TNullTransport."); + $this->expectExceptionCode(0); + $transport->read(1); + } + + public function testWrite() + { + $transport = new TNullTransport(); + $this->assertNull($transport->write('test')); + } +} diff --git a/lib/php/test/Unit/Lib/Transport/TPhpStreamTest.php b/lib/php/test/Unit/Lib/Transport/TPhpStreamTest.php new file mode 100644 index 00000000000..c2f950c106b --- /dev/null +++ b/lib/php/test/Unit/Lib/Transport/TPhpStreamTest.php @@ -0,0 +1,296 @@ + $result) { + $fopenResult[$num] = $result ? fopen(...$result) : $result; + } + + $this->getFunctionMock('Thrift\Transport', 'php_sapi_name') + ->expects(!empty($sapiName) ? $this->once() : $this->never()) + ->willReturn($sapiName); + + $this->getFunctionMock('Thrift\Transport', 'fopen') + ->expects($this->exactly(count($fopenResult))) + ->withConsecutive(...$fopenParams) + ->willReturnOnConsecutiveCalls(...$fopenResult); + + if ($expectedException) { + $this->expectException($expectedException); + $this->expectExceptionMessage($expectedExceptionMessage); + $this->expectExceptionCode($expectedExceptionCode); + } + + $transport = new TPhpStream($mode); + $transport->open(); + } + + public function fopenDataProvider() + { + yield 'readCli' => [ + 'mode' => TPhpStream::MODE_R, + 'sapiName' => 'cli', + 'fopenParams' => [['php://stdin', 'r']], + 'fopenResult' => [['php://temp', 'r']], + 'expectedException' => null, + 'expectedExceptionMessage' => '', + 'expectedExceptionCode' => 0, + ]; + yield 'readNotCli' => [ + 'mode' => TPhpStream::MODE_R, + 'sapiName' => 'apache', + 'fopenParams' => [['php://input', 'r']], + 'fopenResult' => [['php://temp', 'r']], + 'expectedException' => null, + 'expectedExceptionMessage' => '', + 'expectedExceptionCode' => 0, + ]; + yield 'write' => [ + 'mode' => TPhpStream::MODE_W, + 'sapiName' => '', + 'fopenParams' => [['php://output', 'w']], + 'fopenResult' => [['php://temp', 'w']], + 'expectedException' => null, + 'expectedExceptionMessage' => '', + 'expectedExceptionCode' => 0, + ]; + yield 'read and write' => [ + 'mode' => TPhpStream::MODE_R | TPhpStream::MODE_W, + 'sapiName' => 'cli', + 'fopenParams' => [['php://stdin', 'r'], ['php://output', 'w']], + 'fopenResult' => [['php://temp', 'r'], ['php://temp', 'w']], + 'expectedException' => null, + 'expectedExceptionMessage' => '', + 'expectedExceptionCode' => 0, + ]; + yield 'read exception' => [ + 'mode' => TPhpStream::MODE_R, + 'sapiName' => 'cli', + 'fopenParams' => [['php://stdin', 'r']], + 'fopenResult' => [false], + 'expectedException' => TException::class, + 'expectedExceptionMessage' => 'TPhpStream: Could not open php://input', + #should depend on php_sapi_name result + 'expectedExceptionCode' => 0, + ]; + yield 'write exception' => [ + 'mode' => TPhpStream::MODE_W, + 'sapiName' => '', + 'fopenParams' => [['php://output', 'w']], + 'fopenResult' => [false], + 'expectedException' => TException::class, + 'expectedExceptionMessage' => 'TPhpStream: Could not open php://output', + 'expectedExceptionCode' => 0, + ]; + } + + /** + * @dataProvider closeDataProvider + */ + public function testClose( + $mode, + $fopenParams, + $fopenResult + ) { + #due to the running tests in separate process we could not open stream in data provider, so we need to do it here + foreach ($fopenResult as $num => $result) { + $fopenResult[$num] = $result ? fopen(...$result) : $result; + } + + $this->getFunctionMock('Thrift\Transport', 'fopen') + ->expects($this->exactly(count($fopenParams))) + ->withConsecutive(...$fopenParams) + ->willReturnOnConsecutiveCalls(...$fopenResult); + + $this->getFunctionMock('Thrift\Transport', 'fclose') + ->expects($this->exactly(count($fopenParams))) + ->with( + $this->callback(function ($stream) { + return is_resource($stream); + }) + ) + ->willReturn(true); + + $transport = new TPhpStream($mode); + $transport->open(); + $this->assertTrue($transport->isOpen()); + + $transport->close(); + $this->assertFalse($transport->isOpen()); + } + + public function closeDataProvider() + { + $read = ['php://temp', 'r']; + $write = ['php://temp', 'w']; + yield 'read' => [ + 'mode' => TPhpStream::MODE_R, + 'fopenParams' => [['php://stdin', 'r']], + 'fopenResult' => [$read], + ]; + yield 'write' => [ + 'mode' => TPhpStream::MODE_W, + 'fopenParams' => [['php://output', 'w']], + 'fopenResult' => [$write], + ]; + yield 'read and write' => [ + 'mode' => TPhpStream::MODE_R | TPhpStream::MODE_W, + 'fopenParams' => [['php://stdin', 'r'], ['php://output', 'w']], + 'fopenResult' => [$read, $write], + ]; + } + + /** + * @dataProvider readDataProvider + */ + public function testRead( + $freadResult, + $expectedResult, + $expectedException, + $expectedExceptionMessage, + $expectedExceptionCode + ) { + $this->getFunctionMock('Thrift\Transport', 'fread') + ->expects($this->once()) + ->with($this->anything(), 5) + ->willReturn($freadResult); + + if ($expectedException) { + $this->expectException($expectedException); + $this->expectExceptionMessage($expectedExceptionMessage); + $this->expectExceptionCode($expectedExceptionCode); + } + + $transport = new TPhpStream(TPhpStream::MODE_R); + $this->assertEquals($expectedResult, $transport->read(5)); + } + + public function readDataProvider() + { + yield 'success' => [ + 'freadResult' => '12345', + 'expectedResult' => '12345', + 'expectedException' => null, + 'expectedExceptionMessage' => '', + 'expectedExceptionCode' => 0, + ]; + yield 'empty' => [ + 'freadResult' => '', + 'expectedResult' => '', + 'expectedException' => TException::class, + 'expectedExceptionMessage' => 'TPhpStream: Could not read 5 bytes', + 'expectedExceptionCode' => 0, + ]; + yield 'false' => [ + 'freadResult' => false, + 'expectedResult' => false, + 'expectedException' => TException::class, + 'expectedExceptionMessage' => 'TPhpStream: Could not read 5 bytes', + 'expectedExceptionCode' => 0, + ]; + } + + /** + * @dataProvider writeDataProvider + */ + public function testWrite( + $buf, + $fwriteParams, + $fwriteResult, + $expectedException, + $expectedExceptionMessage, + $expectedExceptionCode + ) { + $this->getFunctionMock('Thrift\Transport', 'fwrite') + ->expects($this->exactly(count($fwriteParams))) + ->withConsecutive(...$fwriteParams) + ->willReturnOnConsecutiveCalls(...$fwriteResult); + + if ($expectedException) { + $this->expectException($expectedException); + $this->expectExceptionMessage($expectedExceptionMessage); + $this->expectExceptionCode($expectedExceptionCode); + } + + $transport = new TPhpStream(TPhpStream::MODE_W); + $transport->write($buf); + } + + public function writeDataProvider() + { + yield 'success' => [ + 'buf' => '12345', + 'fwriteParams' => [[$this->anything(), '12345']], + 'fwriteResult' => [5], + 'expectedException' => null, + 'expectedExceptionMessage' => '', + 'expectedExceptionCode' => 0, + ]; + yield 'several iteration' => [ + 'buf' => '1234567890', + 'fwriteParams' => [[$this->anything(), '1234567890'], [$this->anything(), '67890']], + 'fwriteResult' => [5, 5], + 'expectedException' => null, + 'expectedExceptionMessage' => '', + 'expectedExceptionCode' => 0, + ]; + yield 'fail' => [ + 'buf' => '1234567890', + 'fwriteParams' => [[$this->anything(), '1234567890']], + 'fwriteResult' => [false], + 'expectedException' => TException::class, + 'expectedExceptionMessage' => 'TPhpStream: Could not write 10 bytes', + 'expectedExceptionCode' => 0, + ]; + } + + public function testFlush() + { + $this->getFunctionMock('Thrift\Transport', 'fflush') + ->expects($this->once()); + + $transport = new TPhpStream(TPhpStream::MODE_R); + $transport->flush(); + } +} diff --git a/lib/php/test/Unit/Lib/Transport/TSSLSocketTest.php b/lib/php/test/Unit/Lib/Transport/TSSLSocketTest.php new file mode 100644 index 00000000000..71772190bce --- /dev/null +++ b/lib/php/test/Unit/Lib/Transport/TSSLSocketTest.php @@ -0,0 +1,247 @@ +expectException($expectedException); + $this->expectExceptionMessage($expectedMessage); + $this->expectExceptionCode($expectedCode); + + $this->getFunctionMock('Thrift\Transport', 'stream_socket_client') + ->expects($this->exactly($streamSocketClientCallCount)) + ->with( + 'ssl://' . $host . ':' . $port, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + STREAM_CLIENT_CONNECT, + $this->anything() #$context + ) + ->willReturn(false); + + $socket = new TSSLSocket( + $host, + $port, + $context, + $debugHandler + ); + $socket->open(); + } + + public function openExceptionDataProvider() + { + yield 'host is empty' => [ + 'host' => '', + 'port' => 9090, + 'context' => null, + 'debugHandler' => null, + 'streamSocketClientCallCount' => 0, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'Cannot open null host', + 'expectedCode' => TTransportException::NOT_OPEN, + ]; + yield 'port is not positive' => [ + 'host' => 'localhost', + 'port' => 0, + 'context' => null, + 'debugHandler' => null, + 'streamSocketClientCallCount' => 0, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'Cannot open without port', + 'expectedCode' => TTransportException::NOT_OPEN, + ]; + yield 'connection failure' => [ + 'host' => 'nonexistent-host', + 'port' => 9090, + 'context' => null, + 'debugHandler' => null, + 'streamSocketClientCallCount' => 1, + 'expectedException' => TException::class, + 'expectedMessage' => 'TSocket: Could not connect to', + 'expectedCode' => TTransportException::UNKNOWN, + ]; + } + + public function testDoubleConnect(): void + { + $host = 'localhost'; + $port = 9090; + $context = null; + $debugHandler = null; + + $this->getFunctionMock('Thrift\Transport', 'stream_socket_client') + ->expects($this->once()) + ->with( + 'ssl://' . $host . ':' . $port, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + STREAM_CLIENT_CONNECT, + $this->anything() #$context + ) + ->willReturn(fopen('php://memory', 'r+')); + + $transport = new TSSLSocket( + $host, + $port, + $context, + $debugHandler + ); + + $transport->open(); + $this->expectException(TTransportException::class); + $this->expectExceptionMessage('Socket already connected'); + $this->expectExceptionCode(TTransportException::ALREADY_OPEN); + $transport->open(); + } + + public function testDebugHandler() + { + $host = 'nonexistent-host'; + $port = 9090; + $context = null; + + $debugHandler = function ($error) { + $this->assertEquals( + 'TSocket: Could not connect to ssl://nonexistent-host:9090 (Connection refused [999])', + $error + ); + }; + + $this->getFunctionMock('Thrift\Transport', 'stream_socket_client') + ->expects($this->once()) + ->with( + 'ssl://' . $host . ':' . $port, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + STREAM_CLIENT_CONNECT, + $this->anything() #$context + ) + ->willReturnCallback( + function ($host, &$error_code, &$error_message, $timeout, $flags, $context) { + $error_code = 999; + $error_message = 'Connection refused'; + + return false; + } + ); + + $this->expectException(\Exception::class); + $this->expectExceptionMessage('TSocket: Could not connect to'); + $this->expectExceptionCode(0); + + $transport = new TSSLSocket( + $host, + $port, + $context, + $debugHandler + ); + $transport->setDebug(true); + $transport->open(); + } + + public function testOpenWithContext() + { + $host = 'self-signed-localhost'; + $port = 9090; + $context = stream_context_create( + [ + 'ssl' => [ + 'verify_peer' => true, + 'verify_peer_name' => true, + 'allow_self_signed' => true, + ], + ] + ); + $debugHandler = null; + + $this->getFunctionMock('Thrift\Transport', 'stream_socket_client') + ->expects($this->once()) + ->with( + 'ssl://' . $host . ':' . $port, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + STREAM_CLIENT_CONNECT, + $context #$context + ) + ->willReturn(fopen('php://memory', 'r+')); + + $transport = new TSSLSocket( + $host, + $port, + $context, + $debugHandler + ); + + + $transport->open(); + $this->assertTrue($transport->isOpen()); + } + + /** + * @dataProvider hostDataProvider + */ + public function testGetHost($host, $expected) + { + $port = 9090; + $context = null; + $debugHandler = null; + $transport = new TSSLSocket( + $host, + $port, + $context, + $debugHandler + ); + $this->assertEquals($expected, $transport->getHost()); + } + + public function hostDataProvider() + { + yield 'localhost' => ['localhost', 'ssl://localhost']; + yield 'ssl_localhost' => ['ssl://localhost', 'ssl://localhost']; + yield 'http_localhost' => ['http://localhost', 'http://localhost']; + } +} diff --git a/lib/php/test/Unit/Lib/Transport/TSocketPoolTest.php b/lib/php/test/Unit/Lib/Transport/TSocketPoolTest.php new file mode 100644 index 00000000000..01e45325bc8 --- /dev/null +++ b/lib/php/test/Unit/Lib/Transport/TSocketPoolTest.php @@ -0,0 +1,541 @@ +getProperty('servers_'); + $serversProp->setAccessible(true); + + $this->assertEquals($expectedServers, $serversProp->getValue($socketPool)); + } + + + public function constructDataProvider() + { + yield 'one server' => [ + ['localhost'], + [9090], + false, + null, + [ + ['host' => 'localhost', 'port' => 9090], + ], + ]; + yield 'two servers' => [ + ['localhost1', 'localhost2'], + [9090, 9091], + false, + null, + [ + ['host' => 'localhost1', 'port' => 9090], + ['host' => 'localhost2', 'port' => 9091], + ], + ]; + yield 'one server with one port' => [ + ['localhost'], + 9090, + false, + null, + [ + ['host' => 'localhost', 'port' => 9090], + ], + ]; + yield 'two servers with one port' => [ + ['localhost1', 'localhost2'], + 9090, + false, + null, + [ + ['host' => 'localhost1', 'port' => 9090], + ['host' => 'localhost2', 'port' => 9090], + ], + ]; + } + + public function testAddServer(): void + { + $socketPool = new TSocketPool([], []); + $socketPool->addServer('localhost', 9090); + + $ref = new \ReflectionObject($socketPool); + $servers = $ref->getProperty('servers_'); + $servers->setAccessible(true); + + $this->assertEquals([['host' => 'localhost', 'port' => 9090]], $servers->getValue($socketPool)); + } + + public function testSetNumRetries(): void + { + $socketPool = new TSocketPool([], []); + $socketPool->setNumRetries(5); + + $ref = new \ReflectionObject($socketPool); + $numRetries = $ref->getProperty('numRetries_'); + $numRetries->setAccessible(true); + + $this->assertEquals(5, $numRetries->getValue($socketPool)); + } + + public function testrSetRetryInterval(): void + { + $socketPool = new TSocketPool([], []); + $socketPool->setRetryInterval(5); + + $ref = new \ReflectionObject($socketPool); + $retryInterval = $ref->getProperty('retryInterval_'); + $retryInterval->setAccessible(true); + + $this->assertEquals(5, $retryInterval->getValue($socketPool)); + } + + public function testrSetMaxConsecutiveFailures(): void + { + $socketPool = new TSocketPool([], []); + $socketPool->setMaxConsecutiveFailures(5); + + $ref = new \ReflectionObject($socketPool); + $maxConsecutiveFailures = $ref->getProperty('maxConsecutiveFailures_'); + $maxConsecutiveFailures->setAccessible(true); + + $this->assertEquals(5, $maxConsecutiveFailures->getValue($socketPool)); + } + + public function testrSetRandomize(): void + { + $socketPool = new TSocketPool([], []); + $socketPool->setRandomize(false); + + $ref = new \ReflectionObject($socketPool); + $randomize = $ref->getProperty('randomize_'); + $randomize->setAccessible(true); + + $this->assertEquals(false, $randomize->getValue($socketPool)); + } + + public function testrSetAlwaysTryLast(): void + { + $socketPool = new TSocketPool([], []); + $socketPool->setAlwaysTryLast(false); + + $ref = new \ReflectionObject($socketPool); + $alwaysTryLast = $ref->getProperty('alwaysTryLast_'); + $alwaysTryLast->setAccessible(true); + + $this->assertEquals(false, $alwaysTryLast->getValue($socketPool)); + } + + /** + * @dataProvider openDataProvider + */ + public function testOpen( + $hosts, + $ports, + $persist, + $debugHandler, + $randomize, + $retryInterval, + $numRetries, + $maxConsecutiveFailures, + $debug, + $servers, + $functionExistCallParams, + $functionExistResult, + $apcuFetchCallParams, + $apcuFetchResult, + $timeResult, + $debugHandlerCall, + $apcuStoreCallParams, + $fsockopenCallParams, + $fsockopenResult, + $expectedException, + $expectedExceptionMessage + ) { + $this->getFunctionMock('Thrift\Transport', 'function_exists') + ->expects($this->exactly(count($functionExistCallParams))) + ->withConsecutive(...$functionExistCallParams) + ->willReturnOnConsecutiveCalls(...$functionExistResult); + + $this->getFunctionMock('Thrift\Transport', 'shuffle') + ->expects($randomize ? $this->once() : $this->never()) + ->with($servers) + ->willReturnCallback(function (array &$servers) { + $servers = array_reverse($servers); + + return true; + }); + + $this->getFunctionMock('Thrift\Transport', 'apcu_fetch') + ->expects($this->exactly(count($apcuFetchCallParams))) + ->withConsecutive(...$apcuFetchCallParams) + ->willReturnOnConsecutiveCalls(...$apcuFetchResult); + + $this->getFunctionMock('Thrift\Transport', 'call_user_func') + ->expects($this->exactly(count($debugHandlerCall))) + ->withConsecutive(...$debugHandlerCall) + ->willReturn(true); + + $this->getFunctionMock('Thrift\Transport', 'apcu_store') + ->expects($this->exactly(count($apcuStoreCallParams))) + ->withConsecutive(...$apcuStoreCallParams) + ->willReturn(true); + + $this->getFunctionMock('Thrift\Transport', 'time') + ->expects($this->exactly(count($timeResult))) + ->willReturnOnConsecutiveCalls(...$timeResult); + + #due to the running tests in separate process we could not open stream in data provider, so we need to do it here + foreach ($fsockopenResult as $num => $result) { + $fsockopenResult[$num] = $result ? fopen(...$result) : $result; + } + + $this->getFunctionMock('Thrift\Transport', $persist ? 'pfsockopen' : 'fsockopen') + ->expects($this->exactly(count($fsockopenCallParams))) + ->withConsecutive(...$fsockopenCallParams) + ->willReturnOnConsecutiveCalls(...$fsockopenResult); + + $this->getFunctionMock('Thrift\Transport', 'socket_import_stream') + ->expects(is_null($expectedException) ? $this->once() : $this->never()) + ->with( + $this->callback(function ($stream) { + return is_resource($stream); + }) + ) + ->willReturn(true); + + $this->getFunctionMock('Thrift\Transport', 'socket_set_option') + ->expects(is_null($expectedException) ? $this->once() : $this->never()) + ->with( + $this->anything(), #$socket, + SOL_TCP, #$level + TCP_NODELAY, #$option + 1 #$value + ) + ->willReturn(true); + + if ($expectedException) { + $this->expectException($expectedException); + $this->expectExceptionMessage($expectedExceptionMessage); + } + + $socketPool = new TSocketPool($hosts, $ports, $persist, $debugHandler); + $socketPool->setRandomize($randomize); + $socketPool->setRetryInterval($retryInterval); + $socketPool->setNumRetries($numRetries); + $socketPool->setMaxConsecutiveFailures($maxConsecutiveFailures); + $socketPool->setDebug($debug); + + $this->assertNull($socketPool->open()); + } + + public function openDataProvider() + { + $default = [ + 'hosts' => ['localhost'], + 'ports' => [9090], + 'persist' => false, + 'debugHandler' => null, + 'randomize' => true, + 'retryInterval' => 5, + 'numRetries' => 1, + 'maxConsecutiveFailures' => 1, + 'debug' => false, + 'servers' => [ + ['host' => 'localhost', 'port' => 9090], + ], + 'functionExistCallParams' => [ + ['apcu_fetch'], + ['socket_import_stream'], + ['socket_set_option'], + ], + 'functionExistResult' => [ + true, + true, + true, + ], + 'apcuFetchCallParams' => [ + ['thrift_failtime:localhost:9090~', $this->anything()], + ], + 'apcuFetchResult' => [ + false, + ], + 'timeResult' => [], + 'debugHandlerCall' => [], + 'apcuStoreCallParams' => [], + 'fsockopenCallParams' => [ + [ + 'localhost', + 9090, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + ], + ], + 'fsockopenResult' => [ + ['php://temp', 'r'], + ], + 'expectedException' => null, + 'expectedExceptionMessage' => null, + ]; + + yield 'one server ready' => $default; + yield 'one server failed' => array_merge( + $default, + [ + 'functionExistCallParams' => [ + ['apcu_fetch'], + ], + 'fsockopenResult' => [ + false, + ], + 'apcuFetchCallParams' => [ + ['thrift_failtime:localhost:9090~', $this->anything()], + ['thrift_consecfails:localhost:9090~', $this->anything()], + ], + 'apcuStoreCallParams' => [ + ['thrift_failtime:localhost:9090~', $this->anything()], + ['thrift_consecfails:localhost:9090~', $this->anything(), 0], + ], + 'timeResult' => [ + 1, + ], + 'expectedException' => TException::class, + 'expectedExceptionMessage' => 'TSocketPool: All hosts in pool are down. (localhost:9090)', + ] + ); + yield 'connect to one server on second attempt' => array_merge( + $default, + [ + 'numRetries' => 2, + 'fsockopenCallParams' => [ + [ + 'localhost', + 9090, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + ], + [ + 'localhost', + 9090, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + ], + ], + 'fsockopenResult' => [ + false, + ['php://temp', 'r'], + ], + 'apcuStoreCallParams' => [], + ] + ); + yield 'last time fail time is not expired' => array_merge( + $default, + [ + 'retryInterval' => 5, + 'apcuFetchResult' => [ + 99, + ], + 'apcuStoreCallParams' => [ + ['thrift_failtime:localhost:9090~', $this->anything()], + ], + 'timeResult' => [ + 100, + ], + ] + ); + yield 'last time fail time is expired, store info to debug' => array_merge( + $default, + [ + 'retryInterval' => 5, + 'apcuFetchResult' => [ + 90, + ], + 'apcuStoreCallParams' => [ + ['thrift_failtime:localhost:9090~', $this->anything()], + ], + 'timeResult' => [ + 100, + ], + 'debug' => true, + 'debugHandlerCall' => [ + ['error_log', 'TSocketPool: retryInterval (5) has passed for host localhost:9090'], + ], + ] + ); + yield 'not accessible server, store info to debug' => array_merge( + $default, + [ + 'retryInterval' => 5, + 'functionExistCallParams' => [ + ['apcu_fetch'], + ], + 'functionExistResult' => [ + true, + ], + 'apcuFetchCallParams' => [ + ['thrift_failtime:localhost:9090~', $this->anything()], + ['thrift_consecfails:localhost:9090~', $this->anything()], + ], + 'apcuFetchResult' => [ + 90, + ], + 'apcuStoreCallParams' => [ + ['thrift_failtime:localhost:9090~', $this->anything()], + ['thrift_consecfails:localhost:9090~', 0], + ], + 'timeResult' => [ + 100, + 101, + ], + 'fsockopenResult' => [ + false, + ], + 'debug' => true, + 'debugHandlerCall' => [ + ['error_log', 'TSocketPool: retryInterval (5) has passed for host localhost:9090'], + ['error_log', 'TSocket: Could not connect to localhost:9090 ( [])'], + ['error_log', 'TSocketPool: marking localhost:9090 as down for 5 secs after 1 failed attempts.'], + ['error_log', 'TSocketPool: All hosts in pool are down. (localhost:9090)'], + ], + 'expectedException' => TException::class, + 'expectedExceptionMessage' => 'TSocketPool: All hosts in pool are down. (localhost:9090)', + ] + ); + yield 'max consecutive failures' => array_merge( + $default, + [ + 'maxConsecutiveFailures' => 5, + 'functionExistCallParams' => [ + ['apcu_fetch'], + ], + 'functionExistResult' => [ + true, + ], + 'apcuFetchCallParams' => [ + ['thrift_failtime:localhost:9090~', $this->anything()], + ['thrift_consecfails:localhost:9090~', $this->anything()], + ], + 'apcuStoreCallParams' => [ + ['thrift_consecfails:localhost:9090~', 1], + ], + 'timeResult' => [], + 'fsockopenResult' => [ + false, + ], + 'expectedException' => TException::class, + 'expectedExceptionMessage' => 'TSocketPool: All hosts in pool are down. (localhost:9090)', + ] + ); + yield 'apcu disabled' => array_merge( + $default, + [ + 'functionExistCallParams' => [ + ['apcu_fetch'], + ], + 'functionExistResult' => [ + false, + ], + 'fsockopenResult' => [ + false, + ], + 'timeResult' => [ + 1, + ], + 'apcuFetchCallParams' => [], + 'apcuStoreCallParams' => [], + 'expectedException' => TException::class, + 'expectedExceptionMessage' => 'TSocketPool: All hosts in pool are down. (localhost:9090)', + ] + ); + yield 'second host accessible' => array_merge( + $default, + [ + 'hosts' => ['host1', 'host2'], + 'ports' => [9090, 9091], + 'servers' => [ + ['host' => 'host1', 'port' => 9090], + ['host' => 'host2', 'port' => 9091], + ], + 'fsockopenCallParams' => [ + [ + 'host2', + 9091, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + ], + [ + 'host1', + 9090, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + ], + ], + 'fsockopenResult' => [ + false, + ['php://temp', 'r'], + ], + 'apcuFetchCallParams' => [ + ['thrift_failtime:host2:9091~', $this->anything()], + ['thrift_consecfails:host2:9091~', $this->anything()], + ['thrift_failtime:host1:9090~', $this->anything()], + ], + 'apcuStoreCallParams' => [ + ['thrift_failtime:host2:9091~', $this->anything()], + ['thrift_consecfails:host2:9091~', $this->anything(), 0], + ], + 'timeResult' => [ + 1, + ], + ] + ); + } +} diff --git a/lib/php/test/Unit/Lib/Transport/TSocketTest.php b/lib/php/test/Unit/Lib/Transport/TSocketTest.php new file mode 100644 index 00000000000..6bab297ea2d --- /dev/null +++ b/lib/php/test/Unit/Lib/Transport/TSocketTest.php @@ -0,0 +1,669 @@ +expectException($expectedException); + $this->expectExceptionMessage($expectedMessage); + $this->expectExceptionCode($expectedCode); + + $this->getFunctionMock('Thrift\Transport', 'fsockopen') + ->expects($this->exactly($fsockopenCallCount)) + ->with( + $host, + $port, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything() #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + ) + ->willReturn(false); + + $socket = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + $socket->open(); + } + + public function openExceptionDataProvider() + { + yield 'host is empty' => [ + 'host' => '', + 'port' => 9090, + 'persist' => null, + 'debugHandler' => false, + 'fsockopenCallCount' => 0, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'Cannot open null host', + 'expectedCode' => TTransportException::NOT_OPEN, + ]; + yield 'port is not positive' => [ + 'host' => 'localhost', + 'port' => 0, + 'persist' => false, + 'debugHandler' => null, + 'fsockopenCallCount' => 0, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'Cannot open without port', + 'expectedCode' => TTransportException::NOT_OPEN, + ]; + yield 'connection failure' => [ + 'host' => 'nonexistent-host', + 'port' => 9090, + 'persist' => false, + 'debugHandler' => null, + 'fsockopenCallCount' => 1, + 'expectedException' => TException::class, + 'expectedMessage' => 'TSocket: Could not connect to', + 'expectedCode' => TTransportException::UNKNOWN, + ]; + } + + public function testDoubleConnect(): void + { + $host = 'localhost'; + $port = 9090; + $persist = false; + $debugHandler = null; + $handle = fopen('php://memory', 'r+'); + $this->getFunctionMock('Thrift\Transport', 'fsockopen') + ->expects($this->once()) + ->with( + $host, + $port, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything() #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + ) + ->willReturn($handle); + + $this->getFunctionMock('Thrift\Transport', 'socket_import_stream') + ->expects($this->once()) + ->with($handle) + ->willReturn(true); + + $this->getFunctionMock('Thrift\Transport', 'socket_set_option') + ->expects($this->once()) + ->with( + $this->anything(), #$socket, + SOL_TCP, #$level + TCP_NODELAY, #$option + 1 #$value + ) + ->willReturn(true); + + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + + $transport->open(); + $this->expectException(TTransportException::class); + $this->expectExceptionMessage('Socket already connected'); + $this->expectExceptionCode(TTransportException::ALREADY_OPEN); + $transport->open(); + } + + public function testDebugHandler() + { + $host = 'nonexistent-host'; + $port = 9090; + $false = false; + + $debugHandler = function ($error) { + $this->assertEquals( + 'TSocket: Could not connect to nonexistent-host:9090 (Connection refused [999])', + $error + ); + }; + + $this->getFunctionMock('Thrift\Transport', 'fsockopen') + ->expects($this->once()) + ->with( + $host, + $port, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything() #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + ) + ->willReturnCallback( + function ( + string $hostname, + int $port, + &$error_code, + &$error_message, + ?float $timeout + ) { + $error_code = 999; + $error_message = 'Connection refused'; + + return false; + } + ); + + $transport = new TSocket( + $host, + $port, + $false, + $debugHandler + ); + $transport->setDebug(true); + + $this->expectException(\Exception::class); + $this->expectExceptionMessage('TSocket: Could not connect to'); + $this->expectExceptionCode(0); + $transport->open(); + } + + public function testOpenPersist() + { + $host = 'persist-localhost'; + $port = 9090; + $persist = true; + $debugHandler = null; + + $handle = fopen('php://memory', 'r+'); + + $this->getFunctionMock('Thrift\Transport', 'pfsockopen') + ->expects($this->once()) + ->with( + $host, + $port, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything() #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + ) + ->willReturn($handle); + + $this->getFunctionMock('Thrift\Transport', 'socket_import_stream') + ->expects($this->once()) + ->with($handle) + ->willReturn(true); + + $this->getFunctionMock('Thrift\Transport', 'socket_set_option') + ->expects($this->once()) + ->with( + $this->anything(), #$socket, + SOL_TCP, #$level + TCP_NODELAY, #$option + 1 #$value + ) + ->willReturn(true); + + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + + $transport->open(); + $this->assertTrue($transport->isOpen()); + } + + /** + * @dataProvider open_THRIFT_5132_DataProvider + */ + public function testOpen_THRIFT_5132( + $socketImportResult + ) { + $host = 'localhost'; + $port = 9090; + $persist = false; + $debugHandler = null; + + $this->getFunctionMock('Thrift\Transport', 'fsockopen') + ->expects($this->once()) + ->with( + $host, + $port, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything() #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + ) + ->willReturn(fopen('php://input', 'r+')); + + $this->getFunctionMock('Thrift\Transport', 'socket_import_stream') + ->expects($this->once()) + ->willReturn($socketImportResult); + + $this->getFunctionMock('Thrift\Transport', 'socket_set_option') + ->expects($socketImportResult ? $this->once() : $this->never()) + ->with( + $this->anything(), #$socket, + SOL_TCP, #$level + TCP_NODELAY, #$option + 1 #$value + ) + ->willReturn(true); + + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + + $transport->open(); + $this->assertTrue($transport->isOpen()); + } + + public function open_THRIFT_5132_DataProvider() + { + yield 'socket_import_stream success' => [ + 'socketImportResult' => true, + ]; + yield 'socket_import_stream fail' => [ + 'socketImportResult' => false, + ]; + } + + public function testSetHandle() + { + $host = 'localhost'; + $port = 9090; + $persist = false; + $debugHandler = null; + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + + $this->assertFalse($transport->isOpen()); + $transport->setHandle(fopen('php://memory', 'r+')); + $this->assertTrue($transport->isOpen()); + } + + public function testSetSendTimeout() + { + $host = 'localhost'; + $port = 9090; + $persist = false; + $debugHandler = null; + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + + $transport->setSendTimeout(9999); + $reflector = new \ReflectionClass($transport); + $property = $reflector->getProperty('sendTimeoutSec_'); + $property->setAccessible(true); + $this->assertEquals(9.0, $property->getValue($transport)); + $property = $reflector->getProperty('sendTimeoutUsec_'); + $property->setAccessible(true); + $this->assertEquals(999000, $property->getValue($transport)); + } + + public function testSetRecvTimeout() + { + $host = 'localhost'; + $port = 9090; + $persist = false; + $debugHandler = null; + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + + $transport->setRecvTimeout(9999); + $reflector = new \ReflectionClass($transport); + $property = $reflector->getProperty('recvTimeoutSec_'); + $property->setAccessible(true); + $this->assertEquals(9.0, $property->getValue($transport)); + $property = $reflector->getProperty('recvTimeoutUsec_'); + $property->setAccessible(true); + $this->assertEquals(999000, $property->getValue($transport)); + } + + /** + * @dataProvider hostDataProvider + */ + public function testGetHost($host, $expected) + { + $port = 9090; + $persist = false; + $debugHandler = null; + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + $this->assertEquals($expected, $transport->getHost()); + } + + public function hostDataProvider() + { + yield 'localhost' => ['localhost', 'localhost']; + yield 'ssl_localhost' => ['ssl://localhost', 'ssl://localhost']; + yield 'http_localhost' => ['http://localhost', 'http://localhost']; + } + + public function testGetPort() + { + $host = 'localhost'; + $port = 9090; + $persist = false; + $debugHandler = null; + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + $this->assertEquals($port, $transport->getPort()); + } + + public function testClose() + { + $host = 'localhost'; + $port = 9090; + $persist = false; + $debugHandler = null; + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + $transport->setHandle(fopen('php://memory', 'r+')); + $reflector = new \ReflectionClass($transport); + $property = $reflector->getProperty('handle_'); + $property->setAccessible(true); + $this->assertNotNull($property->getValue($transport)); + + $transport->close(); + $reflector = new \ReflectionClass($transport); + $property = $reflector->getProperty('handle_'); + $property->setAccessible(true); + $this->assertNull($property->getValue($transport)); + } + + /** + * @dataProvider writeFailDataProvider + */ + public function testWriteFail( + $streamSelectResult, + $fwriteCallCount, + $expectedException, + $expectedMessage, + $expectedCode + ) { + $host = 'localhost'; + $port = 9090; + $persist = false; + $debugHandler = null; + $handle = fopen('php://memory', 'r+'); + + $this->getFunctionMock('Thrift\Transport', 'stream_select') + ->expects($this->once()) + ->with( + $this->anything(), #$null, + [$handle], + $this->anything(), #$null, + $this->anything(), #$this->sendTimeoutSec_, + $this->anything() #$this->sendTimeoutUsec_ + ) + ->willReturn($streamSelectResult); + + $this->getFunctionMock('Thrift\Transport', 'fwrite') + ->expects($this->exactly($fwriteCallCount)) + ->with( + $handle, + 'test1234456789132456798' + ) + ->willReturn(false); + + $this->expectException($expectedException); + $this->expectExceptionMessage($expectedMessage); + $this->expectExceptionCode($expectedCode); + + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + $transport->setHandle($handle); + + $transport->write('test1234456789132456798'); + } + + public function testWrite() + { + $host = 'localhost'; + $port = 9090; + $persist = false; + $debugHandler = null; + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + $fileName = sys_get_temp_dir() . '/' . md5(mt_rand(0, time()) . time()); + touch($fileName); + $handle = fopen($fileName, 'r+'); + $transport->setHandle($handle); + $transport->write('test1234456789132456798'); + $this->assertEquals('test1234456789132456798', file_get_contents($fileName)); + + register_shutdown_function(function () use ($fileName) { + is_file($fileName) && unlink($fileName); + }); + } + + public function writeFailDataProvider() + { + yield 'stream_select timeout' => [ + 'streamSelectResult' => 0, + 'fwriteCallCount' => 0, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'TSocket: timed out writing 23 bytes from localhost:9090', + 'expectedCode' => 0, + ]; + yield 'stream_select fail write' => [ + 'streamSelectResult' => 1, + 'fwriteCallCount' => 1, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'TSocket: Could not write 23 bytes localhost:9090', + 'expectedCode' => 0, + ]; + yield 'stream_select fail' => [ + 'streamSelectResult' => false, + 'fwriteCallCount' => 0, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'TSocket: Could not write 23 bytes localhost:9090', + 'expectedCode' => 0, + ]; + } + + public function testRead() + { + $host = 'localhost'; + $port = 9090; + $persist = false; + $debugHandler = null; + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + $fileName = sys_get_temp_dir() . '/' . md5(mt_rand(0, time()) . time()); + file_put_contents($fileName, '12345678901234567890'); + $handle = fopen($fileName, 'r+'); + $transport->setHandle($handle); + $this->assertEquals('12345', $transport->read(5)); + + register_shutdown_function(function () use ($fileName) { + is_file($fileName) && unlink($fileName); + }); + } + + /** + * @dataProvider readFailDataProvider + */ + public function testReadFail( + $streamSelectResult, + $freadResult, + $feofResult, + $expectedException, + $expectedMessage, + $expectedCode + ) { + $host = 'localhost'; + $port = 9090; + $persist = false; + $debugHandler = null; + $handle = fopen('php://memory', 'r+'); + + $this->getFunctionMock('Thrift\Transport', 'stream_select') + ->expects($this->once()) + ->with( + [$handle], + $this->anything(), #$null, + $this->anything(), #$null, + $this->anything(), #$this->recvTimeoutSec_, + $this->anything() #$this->recvTimeoutUsec_ + ) + ->willReturn($streamSelectResult); + + $this->getFunctionMock('Thrift\Transport', 'fread') + ->expects($this->exactly($streamSelectResult ? 1 : 0)) + ->with( + $handle, + 5 + ) + ->willReturn($freadResult); + $this->getFunctionMock('Thrift\Transport', 'feof') + ->expects($this->exactly($feofResult ? 1 : 0)) + ->with($handle) + ->willReturn($feofResult); + + $this->expectException($expectedException); + $this->expectExceptionMessage($expectedMessage); + $this->expectExceptionCode($expectedCode); + + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + $transport->setHandle($handle); + + $transport->read(5); + } + + public function readFailDataProvider() + { + yield 'stream_select timeout' => [ + 'streamSelectResult' => 0, + 'freadResult' => '', + 'feofResult' => false, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'TSocket: timed out reading 5 bytes from localhost:9090', + 'expectedCode' => 0, + ]; + yield 'stream_select fail read' => [ + 'streamSelectResult' => 1, + 'freadResult' => '', + 'feofResult' => true, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'TSocket read 0 bytes', + 'expectedCode' => 0, + ]; + yield 'stream_select fail' => [ + 'streamSelectResult' => false, + 'freadResult' => '', + 'feofResult' => false, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'TSocket: Could not read 5 bytes from localhost:9090', + 'expectedCode' => 0, + ]; + yield 'fread false' => [ + 'streamSelectResult' => 1, + 'freadResult' => false, + 'feofResult' => false, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'TSocket: Could not read 5 bytes from localhost:9090', + 'expectedCode' => 0, + ]; + yield 'fread empty' => [ + 'streamSelectResult' => 1, + 'freadResult' => '', + 'feofResult' => true, + 'expectedException' => TTransportException::class, + 'expectedMessage' => 'TSocket read 0 bytes', + 'expectedCode' => 0, + ]; + } + + public function testFlush() + { + $host = 'localhost'; + $port = 9090; + $persist = false; + $debugHandler = null; + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + $this->assertNUll($transport->flush()); + } +} From 0e7236391f9ac7482f2e62a8c30155e015a80aa9 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 12 Mar 2024 23:21:00 +0100 Subject: [PATCH 028/430] Add "my own +1 vote" paragraph to mail template --- doc/ReleaseManagement.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/ReleaseManagement.md b/doc/ReleaseManagement.md index e06c9b4468e..51ecead5345 100644 --- a/doc/ReleaseManagement.md +++ b/doc/ReleaseManagement.md @@ -275,9 +275,10 @@ All Apache Thrift releases go through a 72-hour final release candidate voting p The CHANGES list for this release is available at: https://github.com/apache/thrift/blob/release/1.0.0/CHANGES.md - Please download, verify sig/sum, install and test the libraries and languages of your choice. + I start this voting thread with my own +1 vote. + This vote will close in 72 hours on 2019-07-06 21:00 UTC [ ] +1 Release this as Apache Thrift 1.0.0 From b60b8feb5f0ff8e439069132e9081d89cf7cbf6c Mon Sep 17 00:00:00 2001 From: Tuomo Jokimies Date: Mon, 18 Mar 2024 16:56:25 +0200 Subject: [PATCH 029/430] THRIFT-5769: fix invalid size error on large messages Client: nodejs --- lib/nodejs/lib/thrift/framed_transport.js | 19 ++++++++----------- lib/nodejs/test/header.test.js | 12 ++++++++++++ lib/nodejs/test/testAll.sh | 1 + 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/lib/nodejs/lib/thrift/framed_transport.js b/lib/nodejs/lib/thrift/framed_transport.js index 9a50a738dde..058d2301ff3 100644 --- a/lib/nodejs/lib/thrift/framed_transport.js +++ b/lib/nodejs/lib/thrift/framed_transport.js @@ -35,30 +35,27 @@ function TFramedTransport(buffer, callback) { Object.setPrototypeOf(TFramedTransport.prototype, THeaderTransport.prototype); TFramedTransport.receiver = function(callback, seqid) { - var residual = []; + var residual = new Buffer(0); return function(data) { - // push received data to residual - for(var i = 0; i < data.length; ++i) { - residual.push(data[i]) - } + residual = Buffer.concat([residual, Buffer.from(data)]); while (residual.length > 0) { if (residual.length < 4) { // Not enough bytes to continue, save and resume on next packet return; } - // get single package sieze - var frameSize = binary.readI32(Buffer.from(residual.slice(0, 4)), 0); + // Get single package size + var frameSize = binary.readI32(residual, 0); // Not enough bytes to continue, save and resume on next packet if (residual.length < 4 + frameSize) { return; } - // splice first 4 bytes - residual.splice(0, 4) - // get package data - var frame = Buffer.from(residual.splice(0, frameSize)); + // Get package data + var frame = residual.subarray(4, 4 + frameSize); + // Remove processed data from residual + residual = residual.subarray(4 + frameSize); callback(new TFramedTransport(frame), seqid); } }; diff --git a/lib/nodejs/test/header.test.js b/lib/nodejs/test/header.test.js index 99bb832bc3c..12f1557a477 100644 --- a/lib/nodejs/test/header.test.js +++ b/lib/nodejs/test/header.test.js @@ -99,6 +99,18 @@ const cases = { assert.equals(headers.otherfoo, undefined); assert.equals(otherHeaders.foo, undefined); assert.equals(otherHeaders.otherfoo, "baz"); + assert.end(); + }, + "Should handle large messages without crashing": function(assert) { + const callback = function() {}; + const onData = TFramedTransport.receiver(callback); + + const largeChunkSize = 2 * 100 * 1024 * 1024; + const largeChunk = Buffer.alloc(largeChunkSize, "A"); + const sizeBuffer = new Buffer(4); + sizeBuffer.writeInt32BE(largeChunkSize + 4, 0); + onData(Buffer.concat([sizeBuffer, largeChunk])); + assert.end(); } }; diff --git a/lib/nodejs/test/testAll.sh b/lib/nodejs/test/testAll.sh index 37b6b438d42..144832ee43d 100755 --- a/lib/nodejs/test/testAll.sh +++ b/lib/nodejs/test/testAll.sh @@ -118,6 +118,7 @@ fi # unit tests node ${DIR}/binary.test.js || TESTOK=1 +node ${DIR}/header.test.js || TESTOK=1 node ${DIR}/int64.test.js || TESTOK=1 node ${DIR}/deep-constructor.test.js || TESTOK=1 From a9b14634991cb50dbe90bbeb27b16e2d2f7ddcc6 Mon Sep 17 00:00:00 2001 From: k-walton <113375522+k-walton@users.noreply.github.com> Date: Mon, 18 Mar 2024 18:26:27 -0400 Subject: [PATCH 030/430] THRIFT-5767: use string builder to parse strings with escaped quotes (#2946) Client: Go --- lib/go/test/Makefile.am | 5 +- lib/go/test/StringParseAllocationTest.thrift | 22 +++++++ .../tests/string_parse_allocation_test.go | 62 +++++++++++++++++++ lib/go/thrift/simple_json_protocol.go | 43 ++++++------- 4 files changed, 107 insertions(+), 25 deletions(-) create mode 100644 lib/go/test/StringParseAllocationTest.thrift create mode 100644 lib/go/test/tests/string_parse_allocation_test.go diff --git a/lib/go/test/Makefile.am b/lib/go/test/Makefile.am index cb8928bc8c3..dc56963c34b 100644 --- a/lib/go/test/Makefile.am +++ b/lib/go/test/Makefile.am @@ -62,7 +62,8 @@ gopath: $(THRIFT) $(THRIFTTEST) \ ProcessorMiddlewareTest.thrift \ ClientMiddlewareExceptionTest.thrift \ ValidateTest.thrift \ - ForwardType.thrift + ForwardType.thrift \ + StringParseAllocationTest.thrift mkdir -p gopath/src grep -v list.*map.*list.*map $(THRIFTTEST) | grep -v 'set' > ThriftTest.thrift $(THRIFT) $(THRIFTARGS) -r IncludesTest.thrift @@ -98,6 +99,7 @@ gopath: $(THRIFT) $(THRIFTTEST) \ $(THRIFT) $(THRIFTARGS) ClientMiddlewareExceptionTest.thrift $(THRIFT) $(THRIFTARGS) ValidateTest.thrift $(THRIFT) $(THRIFTARGS) ForwardType.thrift + $(THRIFT) $(THRIFTARGS) StringParseAllocationTest.thrift ln -nfs ../../tests gopath/src/tests cp -r ./dontexportrwtest gopath/src touch gopath @@ -169,6 +171,7 @@ EXTRA_DIST = \ RefAnnotationFieldsTest.thrift \ RequiredFieldTest.thrift \ ServicesTest.thrift \ + StringParseAllocationTest.thrift \ TypedefFieldTest.thrift \ UnionBinaryTest.thrift \ UnionDefaultValueTest.thrift \ diff --git a/lib/go/test/StringParseAllocationTest.thrift b/lib/go/test/StringParseAllocationTest.thrift new file mode 100644 index 00000000000..0ede9a52be1 --- /dev/null +++ b/lib/go/test/StringParseAllocationTest.thrift @@ -0,0 +1,22 @@ +/* + * 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. + */ + +struct StringStruct { + 1: required string example +} diff --git a/lib/go/test/tests/string_parse_allocation_test.go b/lib/go/test/tests/string_parse_allocation_test.go new file mode 100644 index 00000000000..12790c4f078 --- /dev/null +++ b/lib/go/test/tests/string_parse_allocation_test.go @@ -0,0 +1,62 @@ +/* + * 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. + */ + +package tests + +import ( + "context" + "fmt" + "strings" + "testing" + + "github.com/apache/thrift/lib/go/test/gopath/src/stringparseallocationtest" + "github.com/apache/thrift/lib/go/thrift" +) + +func TestSimpleJsonStringParse_Allocations(t *testing.T) { + byteAllocationLimit := 100 * 1024 // 100 KB + res := testing.Benchmark(BenchmarkSimpleJsonStringParse_Allocations) + if res.AllocedBytesPerOp() > int64(byteAllocationLimit) { + t.Errorf("Total memory allocation size too high: %d (> %d)", res.AllocedBytesPerOp(), byteAllocationLimit) + } +} + +func BenchmarkSimpleJsonStringParse_Allocations(b *testing.B) { + b.ReportAllocs() + b.StopTimer() + numEscapedQuotes := 1000 + var sb strings.Builder + for i := 0; i < numEscapedQuotes; i++ { + sb.WriteString(`\"`) + } + + testString := fmt.Sprintf(`{"1": {"str": "this is a test with %d of escaped quotes %s"}}`, numEscapedQuotes, sb.String()) + stringStruct := stringparseallocationtest.NewStringStruct() + transport := thrift.NewTMemoryBuffer() + p := thrift.NewTJSONProtocol(transport) + + for i := 0; i < b.N; i++ { + transport.Reset() + transport.WriteString(testString) + transport.Flush(context.Background()) + b.StartTimer() + _ = stringStruct.Read(context.Background(), p) + b.StopTimer() + } +} diff --git a/lib/go/thrift/simple_json_protocol.go b/lib/go/thrift/simple_json_protocol.go index 8b1284fd1b1..da12248a17f 100644 --- a/lib/go/thrift/simple_json_protocol.go +++ b/lib/go/thrift/simple_json_protocol.go @@ -30,6 +30,7 @@ import ( "io" "math" "strconv" + "strings" ) type _ParseContext int @@ -922,15 +923,7 @@ func (p *TSimpleJSONProtocol) ParseStringBody() (string, error) { if err != nil { return "", NewTProtocolException(err) } - l := len(line) - // count number of escapes to see if we need to keep going - i := 1 - for ; i < l; i++ { - if line[l-i-1] != '\\' { - break - } - } - if i&0x01 == 1 { + if endsWithoutEscapedQuote(line) { v, ok := jsonUnquote(string(JSON_QUOTE) + line) if !ok { return "", NewTProtocolException(err) @@ -951,27 +944,29 @@ func (p *TSimpleJSONProtocol) ParseStringBody() (string, error) { } func (p *TSimpleJSONProtocol) ParseQuotedStringBody() (string, error) { - line, err := p.reader.ReadString(JSON_QUOTE) - if err != nil { - return "", NewTProtocolException(err) + var sb strings.Builder + + for { + line, err := p.reader.ReadString(JSON_QUOTE) + if err != nil { + return "", NewTProtocolException(err) + } + sb.WriteString(line) + if endsWithoutEscapedQuote(line) { + return sb.String(), nil + } } - l := len(line) - // count number of escapes to see if we need to keep going +} + +func endsWithoutEscapedQuote(s string) bool { + l := len(s) i := 1 for ; i < l; i++ { - if line[l-i-1] != '\\' { + if s[l-i-1] != '\\' { break } } - if i&0x01 == 1 { - return line, nil - } - s, err := p.ParseQuotedStringBody() - if err != nil { - return "", NewTProtocolException(err) - } - v := line + s - return v, nil + return i&0x01 == 1 } func (p *TSimpleJSONProtocol) ParseBase64EncodedBody() ([]byte, error) { From 4233d75289cbd39581def1706ed3ac589f416992 Mon Sep 17 00:00:00 2001 From: Thomas Date: Sun, 17 Mar 2024 09:45:38 +0900 Subject: [PATCH 031/430] THRIFT-5768 Add missing test in configure.ac for kotlin The Kotlin autoconfig script was missing a `test` causing it to try and execute `x/usr/local/bin/gradle` instead of test for its existence. This resulted in the following error: ``` ./configure: line 15049: x/usr/local/bin/gradle: No such file or directory ``` Adding `test` results in the configuration succeeding. Configure output now: ``` thrift 0.21.0 Building C (GLib) Library .... : yes Building C++ Library ......... : yes Building Common Lisp Library.. : yes Building D Library ........... : yes Building Dart Library ........ : yes Building .NET Standard Library : yes Building Erlang Library ...... : yes Building Go Library .......... : yes Building Haxe Library ........ : yes Building Java Library ........ : yes Building Kotlin Library ...... : yes Building Lua Library ......... : yes Building NodeJS Library ...... : yes Building Perl Library ........ : yes Building PHP Library ......... : yes Building Python Library ...... : yes Building Py3 Library ......... : yes Building Ruby Library ........ : yes Building Rust Library ........ : yes Building Swift Library ....... : yes ``` --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 12a1168a8af..c8eaa6db31a 100644 --- a/configure.ac +++ b/configure.ac @@ -214,7 +214,7 @@ if test "$with_kotlin" = "yes"; then AC_PATH_PROG([GRADLE], [gradle]) AC_SUBST(CLASSPATH) AC_SUBST(GRADLE_OPTS) - if test "x$JAVA" != "x" && test "x$JAVAC" != "x" && "x$GRADLE" != "x" ; then + if test "x$JAVA" != "x" && test "x$JAVAC" != "x" && test "x$GRADLE" != "x" ; then have_kotlin="yes" fi fi From 28260982599cf3de90bb34af6589d8ddbf7bedce Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 15 Mar 2024 19:08:16 +0900 Subject: [PATCH 032/430] THRIFT-5762 Fix spotless errors Run `gradlew :spotlessApply` to apply the correct coding style. Update kotlin compiler to support `getEmptyResultInstance` https://github.com/apache/thrift/pull/2939 added the feature to create an instance of the result object without having to use the ProcessFunction. The Kotlin compiler re-uses the java lib so this commit udpates the Kotlin compiler to support this feature as well. --- .../src/thrift/generate/t_kotlin_generator.cc | 17 ++- .../org/apache/thrift/ProcessFunction.java | 142 +++++++++--------- .../apache/thrift/TBaseAsyncProcessor.java | 6 +- .../org/apache/thrift/TBaseProcessor.java | 3 +- 4 files changed, 90 insertions(+), 78 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_kotlin_generator.cc b/compiler/cpp/src/thrift/generate/t_kotlin_generator.cc index a0172720045..78917d99f95 100644 --- a/compiler/cpp/src/thrift/generate/t_kotlin_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_kotlin_generator.cc @@ -1615,7 +1615,7 @@ void t_kotlin_generator::generate_service_processor(t_service* tservice) { "org.apache.thrift.AsyncProcessFunction<" << tservice->get_name() << ", out org.apache.thrift.TBase<*, " - "*>, out kotlin.Any>> = mapOf(" + "*>, out kotlin.Any, out org.apache.thrift.TBase<*, *>>> = mapOf(" << endl; indent_up(); { @@ -1656,16 +1656,27 @@ void t_kotlin_generator::generate_service_process_function(ostream& out, t_function* tfunc) { string args_name = tservice->get_name() + "FunctionArgs." + tfunc->get_name() + "_args"; string rtype = type_name(tfunc->get_returntype(), true); + string resultname = tservice->get_name() + "FunctionResult." + tfunc->get_name() + "_result"; indent(out) << "class " << tfunc->get_name() << "get_name() << ">(private val scope: kotlinx.coroutines.CoroutineScope) : " "org.apache.thrift.AsyncProcessFunction(\"" << tfunc->get_name() - << "\"), ProcessFunction {" << endl; + << args_name << ", " << rtype << ", " + << (tfunc->is_oneway() ? "org.apache.thrift.TBase<*, *>" : resultname) + << ">(\"" << tfunc->get_name() << "\"), ProcessFunction {" + << endl; indent_up(); { indent(out) << "override fun isOneway() = " << (tfunc->is_oneway() ? "true" : "false") << endl; indent(out) << "override fun getEmptyArgsInstance() = " << args_name << "()" << endl; + indent(out) << "override fun getEmptyResultInstance() = "; + if (tfunc->is_oneway()) { + out << "null" << endl; + } + else { + out << resultname << "()" << endl; + } + indent(out) << endl; indent(out) << "override fun start(iface: I, args: " << args_name << ", resultHandler: org.apache.thrift.async.AsyncMethodCallback<" << rtype << ">) {" << endl; diff --git a/lib/java/src/main/java/org/apache/thrift/ProcessFunction.java b/lib/java/src/main/java/org/apache/thrift/ProcessFunction.java index 8552863aaef..ac99d8e607d 100644 --- a/lib/java/src/main/java/org/apache/thrift/ProcessFunction.java +++ b/lib/java/src/main/java/org/apache/thrift/ProcessFunction.java @@ -9,90 +9,88 @@ import org.slf4j.LoggerFactory; public abstract class ProcessFunction { - private final String methodName; + private final String methodName; - private static final Logger LOGGER = LoggerFactory.getLogger(ProcessFunction.class.getName()); + private static final Logger LOGGER = LoggerFactory.getLogger(ProcessFunction.class.getName()); - public ProcessFunction(String methodName) { - this.methodName = methodName; - } - - public final void process(int seqid, TProtocol iprot, TProtocol oprot, I iface) - throws TException { - T args = getEmptyArgsInstance(); - try { - args.read(iprot); - } catch (TProtocolException e) { - iprot.readMessageEnd(); - TApplicationException x = - new TApplicationException(TApplicationException.PROTOCOL_ERROR, e.getMessage()); - oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.EXCEPTION, seqid)); - x.write(oprot); - oprot.writeMessageEnd(); - oprot.getTransport().flush(); - return; - } - iprot.readMessageEnd(); - TSerializable result = null; - byte msgType = TMessageType.REPLY; + public ProcessFunction(String methodName) { + this.methodName = methodName; + } - try { - result = getResult(iface, args); - } catch (TTransportException ex) { - LOGGER.error("Transport error while processing " + getMethodName(), ex); - throw ex; - } catch (TApplicationException ex) { - LOGGER.error("Internal application error processing " + getMethodName(), ex); - result = ex; - msgType = TMessageType.EXCEPTION; - } catch (Exception ex) { - LOGGER.error("Internal error processing " + getMethodName(), ex); - if (rethrowUnhandledExceptions()) throw new RuntimeException(ex.getMessage(), ex); - if (!isOneway()) { - result = - new TApplicationException( - TApplicationException.INTERNAL_ERROR, - "Internal error processing " + getMethodName()); - msgType = TMessageType.EXCEPTION; - } - } + public final void process(int seqid, TProtocol iprot, TProtocol oprot, I iface) + throws TException { + T args = getEmptyArgsInstance(); + try { + args.read(iprot); + } catch (TProtocolException e) { + iprot.readMessageEnd(); + TApplicationException x = + new TApplicationException(TApplicationException.PROTOCOL_ERROR, e.getMessage()); + oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.EXCEPTION, seqid)); + x.write(oprot); + oprot.writeMessageEnd(); + oprot.getTransport().flush(); + return; + } + iprot.readMessageEnd(); + TSerializable result = null; + byte msgType = TMessageType.REPLY; - if (!isOneway()) { - oprot.writeMessageBegin(new TMessage(getMethodName(), msgType, seqid)); - result.write(oprot); - oprot.writeMessageEnd(); - oprot.getTransport().flush(); - } + try { + result = getResult(iface, args); + } catch (TTransportException ex) { + LOGGER.error("Transport error while processing " + getMethodName(), ex); + throw ex; + } catch (TApplicationException ex) { + LOGGER.error("Internal application error processing " + getMethodName(), ex); + result = ex; + msgType = TMessageType.EXCEPTION; + } catch (Exception ex) { + LOGGER.error("Internal error processing " + getMethodName(), ex); + if (rethrowUnhandledExceptions()) throw new RuntimeException(ex.getMessage(), ex); + if (!isOneway()) { + result = + new TApplicationException( + TApplicationException.INTERNAL_ERROR, + "Internal error processing " + getMethodName()); + msgType = TMessageType.EXCEPTION; + } } - private void handleException(int seqid, TProtocol oprot) throws TException { - if (!isOneway()) { - TApplicationException x = - new TApplicationException( - TApplicationException.INTERNAL_ERROR, "Internal error processing " + getMethodName()); - oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.EXCEPTION, seqid)); - x.write(oprot); - oprot.writeMessageEnd(); - oprot.getTransport().flush(); - } + if (!isOneway()) { + oprot.writeMessageBegin(new TMessage(getMethodName(), msgType, seqid)); + result.write(oprot); + oprot.writeMessageEnd(); + oprot.getTransport().flush(); } + } - protected boolean rethrowUnhandledExceptions() { - return false; + private void handleException(int seqid, TProtocol oprot) throws TException { + if (!isOneway()) { + TApplicationException x = + new TApplicationException( + TApplicationException.INTERNAL_ERROR, "Internal error processing " + getMethodName()); + oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.EXCEPTION, seqid)); + x.write(oprot); + oprot.writeMessageEnd(); + oprot.getTransport().flush(); } + } - public abstract boolean isOneway(); + protected boolean rethrowUnhandledExceptions() { + return false; + } - public abstract TBase getResult(I iface, T args) throws TException; + public abstract boolean isOneway(); - public abstract T getEmptyArgsInstance(); + public abstract TBase getResult(I iface, T args) throws TException; - /** - * Returns null when this is a oneWay function. - */ - public abstract A getEmptyResultInstance(); + public abstract T getEmptyArgsInstance(); - public String getMethodName() { - return methodName; - } + /** Returns null when this is a oneWay function. */ + public abstract A getEmptyResultInstance(); + + public String getMethodName() { + return methodName; + } } diff --git a/lib/java/src/main/java/org/apache/thrift/TBaseAsyncProcessor.java b/lib/java/src/main/java/org/apache/thrift/TBaseAsyncProcessor.java index 0a583c05a6a..eedb8cb5058 100644 --- a/lib/java/src/main/java/org/apache/thrift/TBaseAsyncProcessor.java +++ b/lib/java/src/main/java/org/apache/thrift/TBaseAsyncProcessor.java @@ -33,12 +33,14 @@ public class TBaseAsyncProcessor implements TAsyncProcessor, TProcessor { final Map> processMap; public TBaseAsyncProcessor( - I iface, Map> processMap) { + I iface, + Map> processMap) { this.iface = iface; this.processMap = processMap; } - public Map> getProcessMapView() { + public Map> + getProcessMapView() { return Collections.unmodifiableMap(processMap); } diff --git a/lib/java/src/main/java/org/apache/thrift/TBaseProcessor.java b/lib/java/src/main/java/org/apache/thrift/TBaseProcessor.java index ff1ccfcc9c0..2cd805f2f1a 100644 --- a/lib/java/src/main/java/org/apache/thrift/TBaseProcessor.java +++ b/lib/java/src/main/java/org/apache/thrift/TBaseProcessor.java @@ -13,7 +13,8 @@ public abstract class TBaseProcessor implements TProcessor { private final Map> processMap; protected TBaseProcessor( - I iface, Map> processFunctionMap) { + I iface, + Map> processFunctionMap) { this.iface = iface; this.processMap = processFunctionMap; } From 9bd1f1bee7bf59080492bbd3213ca1fed57ab4d6 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sat, 23 Mar 2024 00:53:56 +0100 Subject: [PATCH 033/430] We have 2024 --- lib/netstd/Thrift/Thrift.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/netstd/Thrift/Thrift.csproj b/lib/netstd/Thrift/Thrift.csproj index 3aa16d25ea1..da93da496ec 100644 --- a/lib/netstd/Thrift/Thrift.csproj +++ b/lib/netstd/Thrift/Thrift.csproj @@ -52,7 +52,7 @@ Apache Thrift RPC https://github.com/apache/thrift/blob/0.21.0/CHANGES.md README.md - Copyright 2023 The Apache Software Foundation + Copyright 2024 The Apache Software Foundation From aa04bb94023416cf644fce285111224f18074c95 Mon Sep 17 00:00:00 2001 From: Volodymyr Panivko Date: Mon, 18 Mar 2024 22:26:00 +0100 Subject: [PATCH 034/430] [THRIFT-5757] Unit tests for php lib --- composer.json | 3 +- .../lib/Factory/TFramedTransportFactory.php | 21 ++- lib/php/lib/Factory/TTransportFactory.php | 22 ++- .../Factory/TTransportFactoryInterface.php | 22 ++- lib/php/lib/Server/TSSLServerSocket.php | 4 + lib/php/lib/Server/TServerTransport.php | 1 + .../Factory/TFramedTransportFactoryTest.php | 2 +- .../Lib/Factory/TTransportFactoryTest.php | 2 +- .../Unit/Lib/Server/Fixture/TestProcessor.php | 30 ++++ .../Unit/Lib/Server/TForkingServerTest.php | 32 ++++ .../Unit/Lib/Server/TSSLServerSocketTest.php | 150 ++++++++++++++++ .../Unit/Lib/Server/TServerSocketTest.php | 128 ++++++++++++++ .../Unit/Lib/Server/TSimpleServerTest.php | 166 ++++++++++++++++++ 13 files changed, 575 insertions(+), 8 deletions(-) create mode 100644 lib/php/test/Unit/Lib/Server/Fixture/TestProcessor.php create mode 100644 lib/php/test/Unit/Lib/Server/TForkingServerTest.php create mode 100644 lib/php/test/Unit/Lib/Server/TSSLServerSocketTest.php create mode 100644 lib/php/test/Unit/Lib/Server/TServerSocketTest.php create mode 100644 lib/php/test/Unit/Lib/Server/TSimpleServerTest.php diff --git a/composer.json b/composer.json index 900fb2854e7..684c1b3875c 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,8 @@ "php-mock/php-mock-phpunit": "^2.10", "ext-json": "*", "ext-xml": "*", - "ext-curl": "*" + "ext-curl": "*", + "ext-pcntl": "*" }, "autoload": { "psr-4": {"Thrift\\": "lib/php/lib/"} diff --git a/lib/php/lib/Factory/TFramedTransportFactory.php b/lib/php/lib/Factory/TFramedTransportFactory.php index 485fca505fb..c0adfd0d038 100644 --- a/lib/php/lib/Factory/TFramedTransportFactory.php +++ b/lib/php/lib/Factory/TFramedTransportFactory.php @@ -1,5 +1,24 @@ getSSLHost($host); parent::__construct($ssl_host, $port); + // Initialize a stream context if not provided + if ($context === null) { + $context = stream_context_create(); + } $this->context_ = $context; } diff --git a/lib/php/lib/Server/TServerTransport.php b/lib/php/lib/Server/TServerTransport.php index 15a27afa8ad..82ee752684b 100644 --- a/lib/php/lib/Server/TServerTransport.php +++ b/lib/php/lib/Server/TServerTransport.php @@ -3,6 +3,7 @@ namespace Thrift\Server; use Thrift\Exception\TTransportException; +use Thrift\Transport\TTransport; /** * Generic class for Server agent. diff --git a/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php index 3b8b5cc44f3..f8a860c9739 100644 --- a/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php +++ b/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php @@ -35,7 +35,7 @@ public function testGetTransport() { $transport = $this->createMock(TTransport::class); $factory = new TFramedTransportFactory(); - $framedTransport = $factory::getTransport($transport); + $framedTransport = $factory->getTransport($transport); $this->assertInstanceOf(TFramedTransport::class, $framedTransport); diff --git a/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php index a8a791ad121..9d3e6402ba6 100644 --- a/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php +++ b/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php @@ -34,7 +34,7 @@ public function testGetTransport() { $transport = $this->createMock(TTransport::class); $factory = new TTransportFactory(); - $result = $factory::getTransport($transport); + $result = $factory->getTransport($transport); $this->assertSame($transport, $result); } diff --git a/lib/php/test/Unit/Lib/Server/Fixture/TestProcessor.php b/lib/php/test/Unit/Lib/Server/Fixture/TestProcessor.php new file mode 100644 index 00000000000..8fc689194a5 --- /dev/null +++ b/lib/php/test/Unit/Lib/Server/Fixture/TestProcessor.php @@ -0,0 +1,30 @@ +markTestSkipped('Unit test could not be written for class which use pcntl_fork and exit functions'); + } +} diff --git a/lib/php/test/Unit/Lib/Server/TSSLServerSocketTest.php b/lib/php/test/Unit/Lib/Server/TSSLServerSocketTest.php new file mode 100644 index 00000000000..02ae584db42 --- /dev/null +++ b/lib/php/test/Unit/Lib/Server/TSSLServerSocketTest.php @@ -0,0 +1,150 @@ +assertEquals('ssl://localhost', $socket->getSSLHost('localhost')); + $this->assertEquals('ssl://localhost', $socket->getSSLHost('ssl://localhost')); + $this->assertEquals('tcp://localhost', $socket->getSSLHost('tcp://localhost')); + } + + public function testListenAndClose(): void + { + $options = [ + 'ssl' => [ + 'verify_peer' => true, + 'verify_peer_name' => true, + 'allow_self_signed' => true, + ], + ]; + $context = stream_context_create($options); + $socket = new TSSLServerSocket('somehost', 999, $context); + + $listener = tmpfile(); + $this->getFunctionMock('Thrift\Server', 'stream_socket_server') + ->expects($this->once()) + ->with( + 'ssl://somehost:999', #$address + $this->anything(), #&$error_code + $this->anything(), #&$error_string + STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, #int $flags + $this->callback(function ($context) use ($options) { + $contextOptions = stream_context_get_options($context); + + return is_resource($context) && $options === $contextOptions; + })#resource $context + )->willReturn($listener); + + $socket->listen(); + + $reflection = new \ReflectionClass($socket); + $property = $reflection->getProperty('listener_'); + $property->setAccessible(true); + + $this->assertIsResource($property->getValue($socket)); + + $this->getFunctionMock('Thrift\Server', 'fclose') + ->expects($this->once()) + ->with($this->equalTo($listener)) + ->willReturn(true); + + $socket->close(); + $this->assertNull($property->getValue($socket)); + } + + public function testAccept() + { + $socket = new TSSLServerSocket('somehost', 999); + $socket->setAcceptTimeout(1000); + + $listener = tmpfile(); + $this->getFunctionMock('Thrift\Server', 'stream_socket_server') + ->expects($this->once()) + ->with( + 'ssl://somehost:999', #$address + $this->anything(), #&$error_code + $this->anything(), #&$error_string + STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, #int $flags + $this->callback(function ($context) { + $contextOptions = stream_context_get_options($context); + + return is_resource($context) && $contextOptions === []; + }) #resource $context + )->willReturn($listener); + + $transportHandle = tmpfile(); + $this->getFunctionMock('Thrift\Server', 'stream_socket_accept') + ->expects($this->once()) + ->with( + $this->equalTo($listener), + 1 + )->willReturn($transportHandle); + + $socket->listen(); + $result = $socket->accept(); + $this->assertInstanceOf(TSocket::class, $result); + + $reflection = new \ReflectionClass($result); + $property = $reflection->getProperty('handle_'); + $property->setAccessible(true); + $this->assertEquals($transportHandle, $property->getValue($result)); + } + + public function testAcceptFailed() + { + $socket = new TSSLServerSocket('somehost', 999); + $socket->setAcceptTimeout(1000); + + $listener = tmpfile(); + + $this->getFunctionMock('Thrift\Server', 'stream_socket_server') + ->expects($this->once()) + ->with('ssl://somehost:999') + ->willReturn($listener); + + $this->getFunctionMock('Thrift\Server', 'stream_socket_accept') + ->expects($this->once()) + ->with( + $this->equalTo($listener), + 1 + )->willReturn(null); + + $this->expectException(TTransportException::class); + $this->expectExceptionMessage('accept() may not return NULL'); + + $socket->listen(); + $socket->accept(); + } +} diff --git a/lib/php/test/Unit/Lib/Server/TServerSocketTest.php b/lib/php/test/Unit/Lib/Server/TServerSocketTest.php new file mode 100644 index 00000000000..e9d3b9666f5 --- /dev/null +++ b/lib/php/test/Unit/Lib/Server/TServerSocketTest.php @@ -0,0 +1,128 @@ +setAcceptTimeout(1000); + + $reflection = new \ReflectionClass($socket); + $property = $reflection->getProperty('acceptTimeout_'); + $property->setAccessible(true); + + $this->assertEquals(1000, $property->getValue($socket)); + } + + public function testListenAndClose(): void + { + $socket = new TServerSocket('somehost', 999); + + $listener = tmpfile(); + $this->getFunctionMock('Thrift\Server', 'stream_socket_server') + ->expects($this->once()) + ->with('tcp://somehost:999') + ->willReturn($listener); + + $socket->listen(); + + $reflection = new \ReflectionClass($socket); + $property = $reflection->getProperty('listener_'); + $property->setAccessible(true); + + $this->assertIsResource($property->getValue($socket)); + + $this->getFunctionMock('Thrift\Server', 'fclose') + ->expects($this->once()) + ->with($this->equalTo($listener)) + ->willReturn(true); + + $socket->close(); + $this->assertNull($property->getValue($socket)); + } + + public function testAccept() + { + $socket = new TServerSocket('somehost', 999); + $socket->setAcceptTimeout(1000); + + $listener = tmpfile(); + + $this->getFunctionMock('Thrift\Server', 'stream_socket_server') + ->expects($this->once()) + ->with('tcp://somehost:999') + ->willReturn($listener); + + $transportHandle = tmpfile(); + $this->getFunctionMock('Thrift\Server', 'stream_socket_accept') + ->expects($this->once()) + ->with( + $this->equalTo($listener), + 1 + )->willReturn($transportHandle); + + $socket->listen(); + $result = $socket->accept(); + $this->assertInstanceOf(TSocket::class, $result); + + $reflection = new \ReflectionClass($result); + $property = $reflection->getProperty('handle_'); + $property->setAccessible(true); + $this->assertEquals($transportHandle, $property->getValue($result)); + } + + public function testAcceptFailed() + { + $socket = new TServerSocket('somehost', 999); + $socket->setAcceptTimeout(1000); + + $listener = tmpfile(); + + $this->getFunctionMock('Thrift\Server', 'stream_socket_server') + ->expects($this->once()) + ->with('tcp://somehost:999') + ->willReturn($listener); + + $this->getFunctionMock('Thrift\Server', 'stream_socket_accept') + ->expects($this->once()) + ->with( + $this->equalTo($listener), + 1 + )->willReturn(null); + + $this->expectException(TTransportException::class); + $this->expectExceptionMessage('accept() may not return NULL'); + + $socket->listen(); + $socket->accept(); + } +} diff --git a/lib/php/test/Unit/Lib/Server/TSimpleServerTest.php b/lib/php/test/Unit/Lib/Server/TSimpleServerTest.php new file mode 100644 index 00000000000..269b838592d --- /dev/null +++ b/lib/php/test/Unit/Lib/Server/TSimpleServerTest.php @@ -0,0 +1,166 @@ +processor = $this->createMock(TestProcessor::class); + $this->transport = $this->createMock(TServerTransport::class); + $this->inputTransportFactory = $this->createMock(TTransportFactoryInterface::class); + $this->outputTransportFactory = $this->createMock(TTransportFactoryInterface::class); + $this->inputProtocolFactory = $this->createMock(TProtocolFactory::class); + $this->outputProtocolFactory = $this->createMock(TProtocolFactory::class); + + $this->server = new TSimpleServer( + $this->processor, + $this->transport, + $this->inputTransportFactory, + $this->outputTransportFactory, + $this->inputProtocolFactory, + $this->outputProtocolFactory + ); + } + + protected function tearDown(): void + { + unset( + $this->processor, + $this->transport, + $this->inputTransportFactory, + $this->outputTransportFactory, + $this->inputProtocolFactory, + $this->outputProtocolFactory, + $this->server + ); + } + + /** + * @dataProvider serveDataProvider + */ + public function testServe( + $serveLoopCount, + array $processLoopResult + ): void { + $transport = $this->createMock(TTransport::class); + + $this->transport->expects($this->once()) + ->method('listen'); + $this->transport->expects($this->exactly($serveLoopCount)) + ->method('accept') + ->willReturn($transport); + + $this->inputTransportFactory->expects($this->exactly($serveLoopCount)) + ->method('getTransport') + ->willReturn($this->createMock(TServerTransport::class)); + $this->outputTransportFactory->expects($this->exactly($serveLoopCount)) + ->method('getTransport') + ->willReturn($this->createMock(TServerTransport::class)); + + $inputProtocol = $this->createMock(TServerTransport::class); + $this->inputProtocolFactory->expects($this->exactly($serveLoopCount)) + ->method('getProtocol') + ->willReturn($inputProtocol); + + $outputProtocol = $this->createMock(TServerTransport::class); + $this->outputProtocolFactory->expects($this->exactly($serveLoopCount)) + ->method('getProtocol') + ->willReturn($outputProtocol); + + /** + * ATTENTION! + * it is a hack to stop the server loop in unit test + * last call of process can return any value, but should stop server for removing infinite loop + **/ + $processLoopResult[] = $this->returnCallback(function () { + $this->server->stop(); + + return false; + }); + + $this->processor->expects($this->exactly(count($processLoopResult))) + ->method('process') + ->with( + $this->equalTo($inputProtocol), + $this->equalTo($outputProtocol) + ) + ->willReturnOnConsecutiveCalls(...$processLoopResult); + + $this->server->serve(); + } + + public function serveDataProvider() + { + yield 'one serve loop' => [ + 'serveLoopCount' => 1, + 'processLoopResult' => [ + true, + ] + ]; + yield 'two serve loop' => [ + 'serveLoopCount' => 2, + 'processLoopResult' => [ + true, + false, + ] + ]; + } +} From 564dbfc6fb9edb733435aacb048b5a798968f7d7 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sun, 31 Mar 2024 15:36:04 +0200 Subject: [PATCH 035/430] Upgraded appveyor dockerfile reference to zlib to 1.2.13 Patch: JensG --- .gitignore | 2 ++ build/docker/msvc2017/Dockerfile | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0ed47297d13..e7f06a77214 100644 --- a/.gitignore +++ b/.gitignore @@ -75,6 +75,8 @@ project.lock.json /compiler/cpp/src/thrift/plugin/gen.stamp /compiler/cpp/Debug /compiler/cpp/Release +/compiler/cpp/compiler/Debug +/compiler/cpp/compiler/Release /compiler/cpp/src/thrift/libparse.a /compiler/cpp/src/thrift/thriftl.cc /compiler/cpp/src/thrift/thrifty.cc diff --git a/build/docker/msvc2017/Dockerfile b/build/docker/msvc2017/Dockerfile index d59c19568bc..a5c04b7f927 100644 --- a/build/docker/msvc2017/Dockerfile +++ b/build/docker/msvc2017/Dockerfile @@ -67,7 +67,7 @@ RUN C:\BuildTools\Common7\Tools\VsDevCmd.bat -arch=amd64 && ` # Install zlib COPY appveyor\build-zlib.bat C:\TEMP\build-zlib.bat -ENV ZLIB_VERSION=1.2.11 +ENV ZLIB_VERSION=1.2.13 ENV WIN3P=C:\TEMP\WIN3P RUN C:\BuildTools\Common7\Tools\VsDevCmd.bat -arch=amd64 && ` MKDIR C:\TEMP\WIN3P && ` From f8852dc61ea6bab5ecee4729341645cfecdce8c6 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sun, 31 Mar 2024 15:42:16 +0200 Subject: [PATCH 036/430] Upgraded dockerfile reference to Win64OpenSSL-1_1_0l.exe --- build/docker/msvc2017/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/docker/msvc2017/Dockerfile b/build/docker/msvc2017/Dockerfile index a5c04b7f927..a29753e0f78 100644 --- a/build/docker/msvc2017/Dockerfile +++ b/build/docker/msvc2017/Dockerfile @@ -76,7 +76,7 @@ RUN C:\BuildTools\Common7\Tools\VsDevCmd.bat -arch=amd64 && ` RMDIR /S /Q C:\TEMP\WIN3P # Install OpenSSL 1.1.0 -ADD http://slproweb.com/download/Win64OpenSSL-1_1_0j.exe C:\TEMP\openssl.exe +ADD http://slproweb.com/download/Win64OpenSSL-1_1_0l.exe C:\TEMP\openssl.exe RUN C:\TEMP\openssl.exe /silent && ` DEL C:\TEMP\openssl.exe From fcddf0803d9c7a7cb9ddb2915ae1c480db8c76b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 06:20:43 +0000 Subject: [PATCH 037/430] Bump jvm from 1.9.22 to 1.9.23 in /lib/kotlin Bumps [jvm](https://github.com/JetBrains/kotlin) from 1.9.22 to 1.9.23. - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/v1.9.23/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.22...v1.9.23) --- updated-dependencies: - dependency-name: jvm dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lib/kotlin/settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/kotlin/settings.gradle.kts b/lib/kotlin/settings.gradle.kts index 294cd83c1d6..6bbfd7f6723 100644 --- a/lib/kotlin/settings.gradle.kts +++ b/lib/kotlin/settings.gradle.kts @@ -18,7 +18,7 @@ */ pluginManagement { plugins { - kotlin("jvm") version "1.9.22" + kotlin("jvm") version "1.9.23" id("com.ncorti.ktfmt.gradle") version "0.12.0" } } From 2adfd14c02383c006f4e1cf64ab3e22b61fb5bf7 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Mon, 1 Apr 2024 22:44:14 +0200 Subject: [PATCH 038/430] THRIFT-5750 Remove "ansistr_binary_" option Client: delphi Patch: Jens Geyer --- .../src/thrift/generate/t_delphi_generator.cc | 33 +++---------------- lib/delphi/src/Thrift.Protocol.pas | 28 ++++++++++++---- 2 files changed, 26 insertions(+), 35 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc index c91ff332eab..c5998365664 100644 --- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc @@ -68,7 +68,6 @@ class t_delphi_generator : public t_oop_generator { has_const = false; std::map::const_iterator iter; - ansistr_binary_ = false; register_types_ = false; constprefix_ = false; old_names_ = false; @@ -78,10 +77,7 @@ class t_delphi_generator : public t_oop_generator { com_types_ = false; rtti_ = false; for( iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) { - if( iter->first.compare("ansistr_binary") == 0) { - ansistr_binary_ = true; - pwarning(0, "The 'ansistr_binary' option is deprecated."); - } else if( iter->first.compare("register_types") == 0) { + if( iter->first.compare("register_types") == 0) { register_types_ = true; } else if( iter->first.compare("old_names") == 0) { old_names_ = true; @@ -102,10 +98,6 @@ class t_delphi_generator : public t_oop_generator { } } - if(com_types_ && ansistr_binary_) { - throw "com_types and ansistr_binary are mutually exclusive"; - } - out_dir_base_ = "gen-delphi"; escape_.clear(); escape_['\''] = "''"; @@ -468,7 +460,6 @@ class t_delphi_generator : public t_oop_generator { void init_known_types_list(); bool is_void(t_type* type); int indent_impl_; - bool ansistr_binary_; bool register_types_; bool constprefix_; bool old_names_; @@ -760,7 +751,6 @@ void t_delphi_generator::close_generator() { f_all << "const" << endl; indent_up(); - indent(f_all) << "c" << tmp_unit << "_Option_AnsiStr_Binary = " << (ansistr_binary_ ? "True" : "False") << ";" << endl; indent(f_all) << "c" << tmp_unit << "_Option_Register_Types = " << (register_types_ ? "True" : "False") << ";" << endl; indent(f_all) << "c" << tmp_unit << "_Option_ConstPrefix = " << (constprefix_ ? "True" : "False") << ";" << endl; indent(f_all) << "c" << tmp_unit << "_Option_Events = " << (events_ ? "True" : "False") << ";" << endl; @@ -2634,11 +2624,7 @@ void t_delphi_generator::generate_deserialize_field(ostream& out, break; case t_base_type::TYPE_STRING: if (type->is_binary()) { - if (ansistr_binary_) { - out << "ReadAnsiString();"; - } else { - out << (com_types_ ? "ReadBinaryCOM();" : "ReadBinary();"); - } + out << (com_types_ ? "ReadBinaryCOM();" : "ReadBinary();"); } else { out << "ReadString();"; } @@ -2837,11 +2823,7 @@ void t_delphi_generator::generate_serialize_field(ostream& out, break; case t_base_type::TYPE_STRING: if (type->is_binary()) { - if (ansistr_binary_) { - out << "WriteAnsiString("; - } else { - out << "WriteBinary("; - } + out << "WriteBinary("; } else { out << "WriteString("; } @@ -3180,8 +3162,6 @@ string t_delphi_generator::base_type_name(t_base_type* tbase) { return ""; case t_base_type::TYPE_STRING: if (tbase->is_binary()) { - if (ansistr_binary_) - return "System.AnsiString"; if( com_types_) return "IThriftBytes"; if( rtti_) @@ -3400,11 +3380,7 @@ string t_delphi_generator::empty_value(t_type* type) { return "0"; case t_base_type::TYPE_STRING: if (type->is_binary()) { - if (ansistr_binary_) { - return "''"; - } else { - return "nil"; - } + return "nil"; } else { return "''"; } @@ -4072,7 +4048,6 @@ std::string t_delphi_generator::display_name() const { THRIFT_REGISTER_GENERATOR( delphi, "Delphi", - " ansistr_binary: Use AnsiString for binary datatype (default is TBytes).\n" " register_types: Enable TypeRegistry, allows for creation of struct, union\n" " and container instances by interface or TypeInfo()\n" " constprefix: Name TConstants classes after IDL to reduce ambiguities\n" diff --git a/lib/delphi/src/Thrift.Protocol.pas b/lib/delphi/src/Thrift.Protocol.pas index fd92da9b73b..7cfc2ae651b 100644 --- a/lib/delphi/src/Thrift.Protocol.pas +++ b/lib/delphi/src/Thrift.Protocol.pas @@ -232,7 +232,7 @@ TProtocolRecursionTrackerImpl = class abstract( TInterfacedObject, IProtocolRe procedure WriteI64( const i64: Int64); procedure WriteDouble( const d: Double); procedure WriteString( const s: string ); - procedure WriteAnsiString( const s: AnsiString); + procedure WriteAnsiString( const s: AnsiString); deprecated 'AnsiString routines are deprecated, see THRIFT-5750'; procedure WriteBinary( const b: TBytes); overload; procedure WriteBinary( const b: IThriftBytes); overload; procedure WriteUuid( const uuid: TGuid); @@ -259,7 +259,7 @@ TProtocolRecursionTrackerImpl = class abstract( TInterfacedObject, IProtocolRe function ReadBinaryCOM : IThriftBytes; function ReadUuid: TGuid; function ReadString: string; - function ReadAnsiString: AnsiString; + function ReadAnsiString: AnsiString; deprecated 'AnsiString routines are deprecated, see THRIFT-5750'; function NextRecursionLevel : IProtocolRecursionTracker; procedure IncrementRecursionDepth; @@ -311,7 +311,6 @@ TProtocolImpl = class abstract( TInterfacedObject, IProtocol) procedure WriteI64( const i64: Int64); virtual; abstract; procedure WriteDouble( const d: Double); virtual; abstract; procedure WriteString( const s: string ); virtual; - procedure WriteAnsiString( const s: AnsiString); virtual; procedure WriteBinary( const b: TBytes); overload; virtual; abstract; procedure WriteUuid( const b: TGuid); virtual; abstract; @@ -336,7 +335,6 @@ TProtocolImpl = class abstract( TInterfacedObject, IProtocol) function ReadBinary: TBytes; virtual; abstract; function ReadUuid: TGuid; virtual; abstract; function ReadString: string; virtual; - function ReadAnsiString: AnsiString; virtual; // provide generic implementation for all derived classes procedure WriteBinary( const bytes : IThriftBytes); overload; virtual; @@ -344,6 +342,13 @@ TProtocolImpl = class abstract( TInterfacedObject, IProtocol) property Transport: ITransport read GetTransport; + private + // THRIFT-5750 unit visible, but no longer protected - awaiting final removal + // - Note that you can implement whavetever you want in your derived class, but no longer inherit + // - The function can still be called via IProtocol until final removal + function ReadAnsiString: AnsiString; virtual; //deprecated; + procedure WriteAnsiString( const s: AnsiString); virtual; //deprecated; + public constructor Create( const aTransport : ITransport); virtual; end; @@ -508,7 +513,6 @@ TProtocolDecorator = class( TProtocolImpl) procedure WriteI64( const i64: Int64); override; procedure WriteDouble( const d: Double); override; procedure WriteString( const s: string ); override; - procedure WriteAnsiString( const s: AnsiString); override; procedure WriteBinary( const b: TBytes); override; procedure WriteBinary( const bytes : IThriftBytes); overload; override; procedure WriteUuid( const uuid: TGuid); override; @@ -534,7 +538,15 @@ TProtocolDecorator = class( TProtocolImpl) function ReadBinary: TBytes; override; function ReadUuid: TGuid; override; function ReadString: string; override; - function ReadAnsiString: AnsiString; override; + + private + // THRIFT-5750 unit visible, but no longer protected - awaiting final removal + // - Note that you can implement whavetever you want in your derived class, but no longer inherit + // - The function can still be called via IProtocol until final removal + {$WARN SYMBOL_DEPRECATED OFF} + function ReadAnsiString: AnsiString; override; deprecated; + procedure WriteAnsiString( const s: AnsiString); override; deprecated; + {$WARN SYMBOL_DEPRECATED DEFAULT} end; @@ -1520,7 +1532,9 @@ procedure TProtocolDecorator.WriteString( const s: string ); procedure TProtocolDecorator.WriteAnsiString( const s: AnsiString); begin + {$WARN SYMBOL_DEPRECATED OFF} FWrappedProtocol.WriteAnsiString( s); + {$WARN SYMBOL_DEPRECATED DEFAULT} end; @@ -1670,7 +1684,9 @@ function TProtocolDecorator.ReadString: string; function TProtocolDecorator.ReadAnsiString: AnsiString; begin + {$WARN SYMBOL_DEPRECATED OFF} result := FWrappedProtocol.ReadAnsiString; + {$WARN SYMBOL_DEPRECATED DEFAULT} end; From c890ed41ca957b851cd7e33c038fea7799e3b19d Mon Sep 17 00:00:00 2001 From: Thomas Date: Sun, 25 Feb 2024 19:58:30 +0900 Subject: [PATCH 039/430] THRIFT-5755 Docker image build fail This PR submits fixes to the focal and jammy docker images. * Bionic support was dropped becaused dotnet 8 no longer supports bionic (Ubuntu 18.04). Moved to `old/` like other unmaintained images. * Focal/Jammy used the wrong apt location for dotnet, endpoint was 18.04 instead of 20.04/22.04 * Jammy cannot build Erlang OPT 23 since it depends on OpenSSL 1.1 which was dropped in favor of 3.0. Using Erlang OPT 25 fixes the problem since it depends on OpenSSL 3.0 * Jammy was installing JDK 11 but lib/java requires Java 17 All containers used the `root` used to volume map the local files into the running container. This creates a hard to maintain working directory on Linux and MacOS since files form the local user and root user are mixed. To solve this the new docker files can be build using the UID and GID of the host so the files dont mix. The script uses UID and GID 1000 since these are the default ids for most Linux distros. Change the travis yml to build with 20.04 instead of 18.04. Removed all traces of 18.04 but it cant be tested locally. Updated the README to reflect the new `build/docker/` directory. --- .travis.yml | 14 +---------- build/docker/README.md | 24 ++++++++++++------- .../docker/{ => old}/ubuntu-bionic/Dockerfile | 24 +++++++++++++++---- build/docker/ubuntu-focal/Dockerfile | 18 ++++++++++++-- build/docker/ubuntu-jammy/Dockerfile | 23 ++++++++++++++---- 5 files changed, 69 insertions(+), 34 deletions(-) rename build/docker/{ => old}/ubuntu-bionic/Dockerfile (93%) diff --git a/.travis.yml b/.travis.yml index b771d70a4a5..99dd2bc0e2d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,7 +47,7 @@ env: - SCRIPT="cmake.sh" - BUILD_ARG="" - BUILD_ENV="-e CC=gcc -e CXX=g++ -e THRIFT_CROSSTEST_CONCURRENCY=4" - - DISTRO=ubuntu-bionic + - DISTRO=ubuntu-focal - BUILD_LIBS="CPP C_GLIB JAVA PYTHON TESTING TUTORIALS" # only meaningful for CMake builds - TRAVIS_BUILD_STAGE=test # DOCKER_REPO (this works for all builds as a source for docker images - you can override for fork builds in your Travis settings) @@ -58,12 +58,6 @@ env: jobs: include: # ========================= stage: docker ========================= - - stage: docker - script: true - env: - - JOB="Docker Build ubuntu-bionic 18.04 LTS" - - DISTRO=ubuntu-bionic - - TRAVIS_BUILD_STAGE=docker - script: true env: - JOB="Docker Build ubuntu-focal 20.04 LTS" @@ -131,12 +125,6 @@ jobs: - DISTRO=ubuntu-focal - SCRIPT="autotools.sh" - - script: build/docker/run.sh - env: - - JOB="Autotools (Ubuntu Bionic)" - - DISTRO=ubuntu-bionic - - SCRIPT="autotools.sh" - # ------------------------- phase: cmake ------------------------ - script: build/docker/run.sh env: diff --git a/build/docker/README.md b/build/docker/README.md index 9c9175ff824..3cb1a32237c 100644 --- a/build/docker/README.md +++ b/build/docker/README.md @@ -20,12 +20,12 @@ logic to determine their behavior: | Variable | Default | Usage | | -------- | ----- | ------- | -| `DISTRO` | `ubuntu-bionic` | Set by various build jobs in `.travis.yml` to run builds in different containers. Not intended to be set externally.| +| `DISTRO` | `ubuntu-focal` | Set by various build jobs in `.travis.yml` to run builds in different containers. Not intended to be set externally.| | `DOCKER_REPO` | `thrift/thrift-build` | The name of the Docker Hub repository to obtain and store docker images. | | `DOCKER_USER` | `` | The Docker Hub account name containing the repository. | | `DOCKER_PASS` | `` | The Docker Hub account password to use when pushing new tags. | -For example, the default docker image that is used in builds if no overrides are specified would be: `thrift/thrift-build:ubuntu-bionic` +For example, the default docker image that is used in builds if no overrides are specified would be: `thrift/thrift-build:ubuntu-focal` ### Forks ### @@ -46,14 +46,13 @@ Docker Hub and push the resulting tags. ## Supported Containers ## -The Travis CI (continuous integration) builds use the Ubuntu Bionic -(18.04 LTS) and Xenial (16.04 LTS) images to maximize language level +The Travis CI (continuous integration) builds use the Ubuntu Jammy +(22.04 LTS) and Focal (20.04 LTS) images to maximize language level coverage. ### Ubuntu ### * focal (stable, current) -* bionic (previous stable) * jammy (next stable, WIP) ## Unsupported Containers ## @@ -105,16 +104,16 @@ Then, to pull down the current image being used to build (the same way Travis CI does it) - if it is out of date in any way it will build a new one for you: - thrift$ DOCKER_REPO=thrift/thrift-build DISTRO=ubuntu-bionic build/docker/refresh.sh + thrift$ DOCKER_REPO=thrift/thrift-build DISTRO=ubuntu-focal build/docker/refresh.sh To run all unit tests (just like Travis CI does): - thrift$ dockerrun thrift/thrift-build:ubuntu-bionic + thrift$ dockerrun thrift/thrift-build:ubuntu-focal root@8caf56b0ce7b:/thrift/src# build/docker/scripts/autotools.sh To run the cross tests (just like Travis CI does): - thrift$ dockerrun thrift/thrift-build:ubuntu-bionic + thrift$ dockerrun thrift/thrift-build:ubuntu-focal root@8caf56b0ce7b:/thrift/src# build/docker/scripts/cross-test.sh When you are done, you want to clean up occasionally so that docker isn't using lots of extra disk space: @@ -136,7 +135,14 @@ If you do not want to use the same scripts Travis CI does, you can do it manuall Build the image: - thrift$ docker build -t thrift build/docker/ubuntu-bionic +Linux/Mac: + + thrift$ docker build --build-arg uid=$(id -u) --build-arg gid=$(id -g) -t thrift build/docker/ubuntu-jammy + +Windows: + + thrift$ docker build -t thrift build/docker/ubuntu-jammy + Open a command prompt in the image: diff --git a/build/docker/ubuntu-bionic/Dockerfile b/build/docker/old/ubuntu-bionic/Dockerfile similarity index 93% rename from build/docker/ubuntu-bionic/Dockerfile rename to build/docker/old/ubuntu-bionic/Dockerfile index 5ece6e10d1c..6d337d7ea32 100644 --- a/build/docker/ubuntu-bionic/Dockerfile +++ b/build/docker/old/ubuntu-bionic/Dockerfile @@ -124,10 +124,10 @@ ENV PATH /usr/lib/dart/bin:$PATH RUN apt-get install -y --no-install-recommends \ `# dotnet core dependencies` \ - dotnet-sdk-8.0 \ - dotnet-runtime-8.0 \ - aspnetcore-runtime-8.0 \ - dotnet-apphost-pack-8.0 + dotnet-sdk-7.0 \ + dotnet-runtime-7.0 \ + aspnetcore-runtime-7.0 \ + dotnet-apphost-pack-7.0 # Erlang dependencies ARG ERLANG_OTP_VERSION=23.3.4.11 @@ -298,7 +298,21 @@ RUN apt-get install -y --no-install-recommends \ # rm -rf /tmp/* && \ # rm -rf /var/tmp/* +ARG user=build +ARG group=build +ARG uid=1000 +ARG gid=1000 + +RUN apt-get install -y --no-install-recommends sudo && \ + echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \ + if [ -z `cat /etc/group | grep "${group}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ + adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos "" && \ + echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + ENV THRIFT_ROOT /thrift -RUN mkdir -p $THRIFT_ROOT/src +RUN mkdir -p $THRIFT_ROOT/src && \ + chown -R ${uid}:${uid} $THRIFT_ROOT/ COPY Dockerfile $THRIFT_ROOT/ WORKDIR $THRIFT_ROOT/src + +USER ${user} diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile index 416e806469c..00ab2be95b7 100644 --- a/build/docker/ubuntu-focal/Dockerfile +++ b/build/docker/ubuntu-focal/Dockerfile @@ -39,7 +39,7 @@ RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - & # dotnet (netcore) RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \ - wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/18.04/prod.list && \ + wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/20.04/prod.list && \ chown root:root /etc/apt/trusted.gpg.d/microsoft.gpg && \ chown root:root /etc/apt/sources.list.d/microsoft-prod.list @@ -280,7 +280,21 @@ RUN apt-get install -y --no-install-recommends \ # rm -rf /tmp/* && \ # rm -rf /var/tmp/* +ARG user=build +ARG group=build +ARG uid=1000 +ARG gid=1000 + +RUN apt-get install -y --no-install-recommends sudo && \ + echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \ + if [ -z `cat /etc/group | grep "${group}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ + adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos "" && \ + echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + ENV THRIFT_ROOT /thrift -RUN mkdir -p $THRIFT_ROOT/src +RUN mkdir -p $THRIFT_ROOT/src && \ + chown -R ${uid}:${uid} $THRIFT_ROOT/ COPY Dockerfile $THRIFT_ROOT/ WORKDIR $THRIFT_ROOT/src + +USER ${user} diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile index a10fea6500a..d214b9fc7aa 100644 --- a/build/docker/ubuntu-jammy/Dockerfile +++ b/build/docker/ubuntu-jammy/Dockerfile @@ -39,7 +39,7 @@ RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - & # dotnet (netcore) RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \ - wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/18.04/prod.list && \ + wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/22.04/prod.list && \ chown root:root /etc/apt/trusted.gpg.d/microsoft.gpg && \ chown root:root /etc/apt/sources.list.d/microsoft-prod.list @@ -84,7 +84,6 @@ RUN apt-get install -y --no-install-recommends \ libboost-all-dev \ libevent-dev \ libssl-dev \ - qt5-default \ qtbase5-dev \ qtbase5-dev-tools @@ -131,7 +130,7 @@ RUN apt-get install -y --no-install-recommends \ dotnet-apphost-pack-8.0 # Erlang dependencies -ARG ERLANG_OTP_VERSION=23.3.4.11 +ARG ERLANG_OTP_VERSION=25.3.2.9 ARG ERLANG_REBAR_VERSION=3.18.0 RUN apt-get update && apt-get install -y --no-install-recommends libncurses5-dev && \ curl -ssLo /usr/local/bin/kerl https://raw.githubusercontent.com/kerl/kerl/master/kerl && chmod +x /usr/local/bin/kerl && \ @@ -168,7 +167,7 @@ RUN apt-get install -y --no-install-recommends \ ant \ ant-optional \ maven \ - openjdk-11-jdk-headless && \ + openjdk-17-jdk-headless && \ `# Gradle` \ wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \ (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \ @@ -280,7 +279,21 @@ RUN apt-get install -y --no-install-recommends \ # rm -rf /tmp/* && \ # rm -rf /var/tmp/* +ARG user=build +ARG group=build +ARG uid=1000 +ARG gid=1000 + +RUN apt-get install -y --no-install-recommends sudo && \ + echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \ + if [ -z `cat /etc/group | grep "${group}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ + adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos "" && \ + echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + ENV THRIFT_ROOT /thrift -RUN mkdir -p $THRIFT_ROOT/src +RUN mkdir -p $THRIFT_ROOT/src && \ + chown -R ${uid}:${uid} $THRIFT_ROOT/ COPY Dockerfile $THRIFT_ROOT/ WORKDIR $THRIFT_ROOT/src + +USER ${user} From fb92b73c7b8293b1458765983c58ce736dbf5e89 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 28 Feb 2024 19:27:41 +0900 Subject: [PATCH 040/430] Remove `old/` directory from `build/docker` since its not maintained/used --- build/docker/old/Vagrantfile | 59 ---- build/docker/old/centos-7.3/Dockerfile | 196 ------------- build/docker/old/debian-jessie/Dockerfile | 197 ------------- build/docker/old/debian-stretch/Dockerfile | 225 --------------- build/docker/old/ubuntu-artful/Dockerfile | 260 ----------------- build/docker/old/ubuntu-bionic/Dockerfile | 318 --------------------- build/docker/old/ubuntu-disco/Dockerfile | 296 ------------------- build/docker/old/ubuntu-trusty/Dockerfile | 235 --------------- build/docker/old/ubuntu-xenial/Dockerfile | 273 ------------------ 9 files changed, 2059 deletions(-) delete mode 100644 build/docker/old/Vagrantfile delete mode 100644 build/docker/old/centos-7.3/Dockerfile delete mode 100644 build/docker/old/debian-jessie/Dockerfile delete mode 100644 build/docker/old/debian-stretch/Dockerfile delete mode 100644 build/docker/old/ubuntu-artful/Dockerfile delete mode 100644 build/docker/old/ubuntu-bionic/Dockerfile delete mode 100644 build/docker/old/ubuntu-disco/Dockerfile delete mode 100644 build/docker/old/ubuntu-trusty/Dockerfile delete mode 100644 build/docker/old/ubuntu-xenial/Dockerfile diff --git a/build/docker/old/Vagrantfile b/build/docker/old/Vagrantfile deleted file mode 100644 index 5eac6e6865f..00000000000 --- a/build/docker/old/Vagrantfile +++ /dev/null @@ -1,59 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : -# -# Licensed 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. - -# Base system bootstrap script -$bootstrap_script = <<__BOOTSTRAP__ -echo "Provisioning defaults" - -sudo apt-get update -y -sudo apt-get upgrade -y - -# Install default packages -sudo apt-get install -y build-essential curl git - -# Install latest Docker version -sudo curl -sSL https://get.docker.io/gpg | sudo apt-key add - -sudo echo "deb http://get.docker.io/ubuntu docker main" > /etc/apt/sources.list.d/docker.list -sudo apt-get update -y -sudo apt-get install -y linux-image-extra-`uname -r` aufs-tools -sudo apt-get install -y lxc-docker - -echo "Finished provisioning defaults" -__BOOTSTRAP__ - -Vagrant.configure("2") do |config| - config.vm.box = "trusty64" - config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box" - config.ssh.forward_agent = true - - config.vm.provider :virtualbox do |vbox| - vbox.customize ["modifyvm", :id, "--memory", "1024"] - vbox.customize ["modifyvm", :id, "--cpus", "2"] - end - - # Setup the default bootstrap script for our ubuntu base box image - config.vm.provision "shell", inline: $bootstrap_script - - # Setup the custom docker image from our Ubuntu Dockerfile - config.vm.provision "docker" do |d| - d.build_image "/vagrant/ubuntu", args: "-t thrift" - end - - # Setup the custom docker image from our Centos Dockerfile - #config.vm.provision "docker" do |d| - # d.build_image "/vagrant/centos", args: "-t thrift-centos" - #end - -end diff --git a/build/docker/old/centos-7.3/Dockerfile b/build/docker/old/centos-7.3/Dockerfile deleted file mode 100644 index ba4c54926fd..00000000000 --- a/build/docker/old/centos-7.3/Dockerfile +++ /dev/null @@ -1,196 +0,0 @@ -# Licensed 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. - -# Apache Thrift Docker build environment for CentOS -# -# Known missing client libraries: -# - dotnet (will update to 2.0.0 separately) -# - haxe (not in centos) - -FROM centos:7.3.1611 -MAINTAINER Apache Thrift - -RUN yum install -y epel-release - -# General dependencies -RUN yum install -y \ - autoconf \ - bison \ - bison-devel \ - clang \ - clang-analyzer \ - cmake3 \ - curl \ - flex \ - gcc \ - gcc-c++ \ - gdb \ - git \ - libtool \ - m4 \ - make \ - tar \ - unzip \ - valgrind \ - wget && \ - ln -s /usr/bin/cmake3 /usr/bin/cmake && \ - ln -s /usr/bin/cpack3 /usr/bin/cpack && \ - ln -s /usr/bin/ctest3 /usr/bin/ctest - -# C++ dependencies -RUN yum install -y \ - boost-devel-static \ - zlib-devel \ - openssl-devel \ - libevent-devel && \ - cd /usr/lib64 && \ - ln -s libboost_thread-mt.a libboost_thread.a - -# C# Dependencies -RUN yum install -y \ - mono-core \ - mono-devel \ - mono-web-devel \ - mono-extras - -# D Dependencies -RUN yum install -y http://downloads.dlang.org/releases/2.x/2.076.0/dmd-2.076.0-0.fedora.x86_64.rpm xdg-utils -RUN curl -sSL https://github.com/D-Programming-Deimos/openssl/archive/master.tar.gz| tar xz && \ - curl -sSL https://github.com/D-Programming-Deimos/libevent/archive/master.tar.gz| tar xz && \ - mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \ - mv libevent-master/deimos/* openssl-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv libevent-master/C/* openssl-master/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf libevent-master openssl-master - -# Dart -RUN cd /usr/local && \ - wget -q https://storage.googleapis.com/dart-archive/channels/stable/release/1.24.2/sdk/dartsdk-linux-x64-release.zip && \ - unzip -q dartsdk-linux-x64-release.zip && \ - rm dartsdk-linux-x64-release.zip -ENV PATH /usr/local/dart-sdk/bin:$PATH - -# Erlang Dependencies -RUN curl -sSL http://packages.erlang-solutions.com/rpm/centos/erlang_solutions.repo -o /etc/yum.repos.d/erlang_solutions.repo && \ - yum install -y \ - erlang-kernel \ - erlang-erts \ - erlang-stdlib \ - erlang-eunit \ - erlang-rebar \ - erlang-tools - -# GLibC Dependencies -RUN yum install -y glib2-devel - -# Go Dependencies -RUN curl -sSL https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz | tar -C /usr/local/ -xz -ENV PATH /usr/local/go/bin:$PATH - -# Haxe Dependencies -# Not in debian/stretch - -# Java Dependencies -RUN yum install -y \ - ant \ - junit \ - ant-junit \ - java-1.8.0-openjdk-devel - -# Lua Dependencies -# Lua in epel is too old (5.1.4, need 5.2) so we get the latest -RUN yum install -y readline-devel && \ - wget -q http://www.lua.org/ftp/lua-5.3.4.tar.gz && \ - tar xzf lua-5.3.4.tar.gz && \ - cd lua-5.3.4 && \ - sed -i 's/CFLAGS= /CFLAGS= -fPIC /g' src/Makefile && \ - make linux && \ - make install && \ - cd .. && \ - rm -rf lua-5* - -# MinGW Dependencies -RUN yum install -y \ - mingw32-binutils \ - mingw32-crt \ - mingw32-nsis - -# Node.js Dependencies -# Work around epel issue where they removed http-parser that nodejs depends on! -RUN yum -y install https://opensource.enda.eu/packages/http-parser-2.7.1-3.el7.x86_64.rpm -RUN yum install -y \ - nodejs \ - npm - -# Ocaml Dependencies -RUN yum install -y \ - ocaml \ - ocaml-ocamldoc && \ - wget -q https://raw.github.com/ocaml/opam/master/shell/opam_installer.sh -O - | sh -s /usr/local/bin && \ - opam init --yes && \ - opam install --yes oasis && \ - echo '. /root/.opam/opam-init/init.sh > /dev/null 2> /dev/null || true' >> ~/.bashrc - -# Perl Dependencies -RUN yum install -y \ - perl \ - perl-version \ - perl-Bit-Vector \ - perl-Class-Accessor \ - perl-ExtUtils-MakeMaker \ - perl-Test-Simple \ - perl-IO-Socket-SSL \ - perl-Net-SSLeay \ - perl-Crypt-SSLeay - -# PHP Dependencies -RUN yum install -y \ - php \ - php-devel \ - php-pear \ - re2c \ - php-phpunit-PHPUnit \ - bzip2 - -# Python Dependencies -RUN yum install -y \ - python \ - python-devel \ - python-pip \ - python-setuptools \ - python34 \ - python34-devel \ - python34-pip \ - python34-setuptools -RUN pip2 install --upgrade pip -RUN pip2 install --upgrade backports.ssl_match_hostname ipaddress setuptools six tornado tornado-testing twisted virtualenv zope-interface -RUN pip3 install --upgrade pip -RUN pip3 install --upgrade backports.ssl_match_hostname ipaddress setuptools six tornado tornado-testing twisted virtualenv zope-interface - -# Ruby Dependencies -RUN yum install -y \ - ruby \ - ruby-devel \ - rubygems && \ - gem install bundler rake - -# Rust -RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain 1.17.0 -ENV PATH /root/.cargo/bin:$PATH - -# Clean up -RUN rm -rf /tmp/* && \ - yum clean all - -ENV THRIFT_ROOT /thrift -RUN mkdir -p $THRIFT_ROOT/src -COPY Dockerfile $THRIFT_ROOT/ -WORKDIR $THRIFT_ROOT/src diff --git a/build/docker/old/debian-jessie/Dockerfile b/build/docker/old/debian-jessie/Dockerfile deleted file mode 100644 index 15e02e9c181..00000000000 --- a/build/docker/old/debian-jessie/Dockerfile +++ /dev/null @@ -1,197 +0,0 @@ -# Licensed 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. - -# Apache Thrift Docker build environment for Debian -# -# Known missing client libraries: -# - dotnetcore -# - rust - -FROM buildpack-deps:jessie-scm -MAINTAINER Apache Thrift - -ENV DEBIAN_FRONTEND noninteractive - -# Add apt sources -# jessie-backports for cmake and some ruby bits -RUN echo "deb http://ftp.debian.org/debian jessie-backports main" > /etc/apt/sources.list.d/jessie-backports.list - -# Dart -RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ - curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list && \ - sed -i /etc/apt/sources.list.d/dart_stable.list -e 's/https:/http:/g' - -RUN apt-get update && apt-get install -y --no-install-recommends \ -`# General dependencies` \ - bison \ - build-essential \ - clang \ - debhelper \ - flex \ - pkg-config && \ - apt-get -t jessie-backports install -y --no-install-recommends cmake - -RUN apt-get install -y --no-install-recommends \ -`# C++ dependencies` \ - libboost-dev \ - libboost-filesystem-dev \ - libboost-program-options-dev \ - libboost-system-dev \ - libboost-test-dev \ - libboost-thread-dev \ - libevent-dev \ - libssl-dev \ - qt5-default \ - qtbase5-dev \ - qtbase5-dev-tools - -RUN apt-get install -y --no-install-recommends \ -`# Java dependencies` \ - ant \ - ant-optional \ - openjdk-7-jdk \ - maven - -RUN apt-get install -y --no-install-recommends \ -`# Python dependencies` \ - python-all \ - python-all-dbg \ - python-all-dev \ - python-pip \ - python-setuptools \ - python-twisted \ - python-zope.interface \ - python3-all \ - python3-all-dbg \ - python3-all-dev \ - python3-setuptools \ - python3-pip - -RUN apt-get install -y --no-install-recommends \ -`# Ruby dependencies` \ - ruby \ - ruby-bundler \ - ruby-dev \ -`# Perl dependencies` \ - libbit-vector-perl \ - libclass-accessor-class-perl \ - libcrypt-ssleay-perl \ - libio-socket-ssl-perl \ - libnet-ssleay-perl - -RUN apt-get -t jessie-backports install -y ruby-bundler -RUN apt-get install -y --no-install-recommends \ -`# Php dependencies` \ - php5 \ - php5-dev \ - php5-cli \ - php-pear \ - re2c \ - phpunit \ -`# GlibC dependencies` \ - libglib2.0-dev - -RUN apt-get update && apt-get install -y --no-install-recommends \ -`# Erlang dependencies` \ - erlang-base \ - erlang-eunit \ - erlang-dev \ - erlang-tools \ - rebar - -RUN apt-get update && apt-get install -y --no-install-recommends \ -`# Haxe dependencies` \ - neko \ - neko-dev \ - libneko0 - -RUN apt-get update && apt-get install -y --no-install-recommends \ -`# Node.js dependencies` \ - nodejs \ - nodejs-dev \ - nodejs-legacy \ - npm - -RUN apt-get update && apt-get install -y --no-install-recommends \ -`# D dependencies` \ - xdg-utils \ -`# Dart dependencies` \ - dart \ -`# Lua dependencies` \ - lua5.2 \ - lua5.2-dev \ -`# MinGW dependencies` \ - mingw32 \ - mingw32-binutils \ -`# mingw32-runtime` \ - nsis \ -`# Clean up` \ - && rm -rf /var/cache/apt/* && \ - rm -rf /var/lib/apt/lists/* && \ - rm -rf /tmp/* && \ - rm -rf /var/tmp/* - -# Ruby -RUN gem install bundler --no-ri --no-rdoc - -# Python optional dependencies -RUN pip2 install -U ipaddress backports.ssl_match_hostname tornado -RUN pip3 install -U backports.ssl_match_hostname tornado - -# Go -RUN curl -sSL https://storage.googleapis.com/golang/go1.4.3.linux-amd64.tar.gz | tar -C /usr/local/ -xz -ENV PATH /usr/local/go/bin:$PATH - -# Haxe -RUN mkdir -p /usr/lib/haxe && \ - wget -O - https://github.com/HaxeFoundation/haxe/releases/download/3.2.1/haxe-3.2.1-linux64.tar.gz | \ - tar -C /usr/lib/haxe --strip-components=1 -xz && \ - ln -s /usr/lib/haxe/haxe /usr/bin/haxe && \ - ln -s /usr/lib/haxe/haxelib /usr/bin/haxelib && \ - mkdir -p /usr/lib/haxe/lib && \ - chmod -R 777 /usr/lib/haxe/lib && \ - haxelib setup /usr/lib/haxe/lib && \ - haxelib install hxcpp - -# D -RUN curl -sSL http://downloads.dlang.org/releases/2.x/2.070.0/dmd_2.070.0-0_amd64.deb -o /tmp/dmd_2.070.0-0_amd64.deb && \ - dpkg -i /tmp/dmd_2.070.0-0_amd64.deb && \ - rm /tmp/dmd_2.070.0-0_amd64.deb && \ - curl -sSL https://github.com/D-Programming-Deimos/openssl/archive/master.tar.gz| tar xz && \ - curl -sSL https://github.com/D-Programming-Deimos/libevent/archive/master.tar.gz| tar xz && \ - mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \ - mv libevent-master/deimos/* openssl-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv libevent-master/C/* openssl-master/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf libevent-master openssl-master && \ - echo 'gcc -Wl,--no-as-needed $*' > /usr/local/bin/gcc-dmd && \ - chmod 755 /usr/local/bin/gcc-dmd && \ - echo 'CC=/usr/local/bin/gcc-dmd' >> /etc/dmd.conf - -# Dart -ENV PATH /usr/lib/dart/bin:$PATH - -# OCaml -RUN echo 'deb http://ppa.launchpad.net/avsm/ppa/ubuntu trusty main' > /etc/apt/sources.list.d/avsm-official-ocaml.list && \ - gpg --keyserver keyserver.ubuntu.com --recv 61707B09 && \ - gpg --export --armor 61707B09 | apt-key add - && \ - apt-get update && \ - apt-get install -y ocaml opam && \ - opam init && \ - opam install oasis - -# Force utf8 locale to successfully build Haskell tf-random -ENV LC_ALL C.UTF-8 - -ENV THRIFT_ROOT /thrift -RUN mkdir -p $THRIFT_ROOT/src -COPY Dockerfile $THRIFT_ROOT/ -WORKDIR $THRIFT_ROOT/src diff --git a/build/docker/old/debian-stretch/Dockerfile b/build/docker/old/debian-stretch/Dockerfile deleted file mode 100644 index f584bba9a96..00000000000 --- a/build/docker/old/debian-stretch/Dockerfile +++ /dev/null @@ -1,225 +0,0 @@ -# Licensed 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. - -# Apache Thrift Docker build environment for Debian Stretch -# -# Known issues: -# - d: deimos for libevent and openssl disabled - build errors -# - dotnetcore, because netcore is for 1.0.0-preview and 2.0.0 is out -# - rust: cargo not in debian repo - perhaps not needed? - -FROM buildpack-deps:stretch-scm -MAINTAINER Apache Thrift - -ENV DEBIAN_FRONTEND noninteractive - -### Add apt repos - -RUN apt-get update && apt-get install -y --no-install-recommends apt apt-transport-https curl wget apt-utils - -# D -RUN wget http://master.dl.sourceforge.net/project/d-apt/files/d-apt.list -O /etc/apt/sources.list.d/d-apt.list && \ - apt-get update && apt-get -y --allow-unauthenticated install --reinstall d-apt-keyring - -# Dart -RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ - curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list && \ - sed -i /etc/apt/sources.list.d/dart_stable.list -e 's/https:/http:/g' - -# dotnet (core) 2.0.0 - project isn't ready for this yet: -# RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \ -# echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list - -# node.js (this step runs apt-get update internally) -RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - - -### install general dependencies -RUN apt-get install -y --no-install-recommends \ -`# General dependencies` \ - bash-completion \ - bison \ - build-essential \ - clang \ - cmake \ - debhelper \ - flex \ - gdb \ - ninja-build \ - pkg-config \ - valgrind \ - vim - - -### languages - -RUN apt-get install -y --no-install-recommends \ -`# C++ dependencies` \ - libboost-dev \ - libboost-filesystem-dev \ - libboost-program-options-dev \ - libboost-system-dev \ - libboost-test-dev \ - libboost-thread-dev \ - libevent-dev \ - libssl-dev \ - qt5-default \ - qtbase5-dev \ - qtbase5-dev-tools - -RUN apt-get install -y --no-install-recommends \ -`# D dependencies` \ - dmd-bin \ - libevent-dev \ - libssl-dev \ - xdg-utils -# libevent deimos disabled - build errors -# RUN mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \ -# curl -sSL https://github.com/D-Programming-Deimos/libevent/archive/master.tar.gz| tar xz && \ -# mv libevent-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ -# mv libevent-master/C/* /usr/include/dmd/druntime/import/C/ && \ -# rm -rf libevent-master -# openssl deimos doesn't work with openssl-1.1.0 - disabling it for now: -# RUN curl -sSL https://github.com/D-Programming-Deimos/openssl/archive/master.tar.gz| tar xz && \ -# mv openssl-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ -# mv openssl-master/C/* /usr/include/dmd/druntime/import/C/ && \ -# rm -rf openssl-master - -RUN apt-get install -y --no-install-recommends \ -`# Dart dependencies` \ - dart -ENV PATH /usr/lib/dart/bin:$PATH - -# project isn't ready for this quite yet: -# RUN apt-get install -y --no-install-recommends \ -# `# dotnet core dependencies` \ -# dotnet-sdk-8.0 \ -# dotnet-runtime-8.0 \ -# aspnetcore-runtime-8.0 \ -# dotnet-apphost-pack-8.0 - -RUN apt-get install -y --no-install-recommends \ -`# Erlang dependencies` \ - erlang-base \ - erlang-eunit \ - erlang-dev \ - erlang-tools \ - rebar - -RUN apt-get install -y --no-install-recommends \ -`# GlibC dependencies` \ - libglib2.0-dev - -RUN apt-get install -y --no-install-recommends \ -`# golang (go) dependencies` \ - golang-go - -RUN apt-get install -y --no-install-recommends \ -`# Haxe dependencies` \ - haxe \ - neko \ - neko-dev -RUN haxelib setup --always /usr/share/haxe/lib && \ - haxelib install --always hxcpp - -RUN apt-get install -y --no-install-recommends \ -`# Java dependencies` \ - ant \ - ant-optional \ - openjdk-8-jdk \ - maven - -RUN apt-get install -y --no-install-recommends \ -`# Lua dependencies` \ - lua5.2 \ - lua5.2-dev -# https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212 -# same for debian stretch -# lua5.3 does not install alternatives so stick with 5.2 here - -RUN apt-get install -y --no-install-recommends \ -`# Node.js dependencies` \ - nodejs - -RUN apt-get install -y --no-install-recommends \ -`# OCaml dependencies` \ - ocaml \ - opam && \ - opam init --yes && \ - opam install --yes oasis - -RUN apt-get install -y --no-install-recommends \ -`# Perl dependencies` \ - libbit-vector-perl \ - libclass-accessor-class-perl \ - libcrypt-ssleay-perl \ - libio-socket-ssl-perl \ - libnet-ssleay-perl - -RUN apt-get install -y --no-install-recommends \ -`# Php dependencies` \ - php7.0 \ - php7.0-cli \ - php7.0-dev \ - php-pear \ - re2c \ - phpunit - -RUN apt-get install -y --no-install-recommends \ -`# Python dependencies` \ - python-all \ - python-all-dbg \ - python-all-dev \ - python-backports.ssl-match-hostname \ - python-ipaddress \ - python-pip \ - python-setuptools \ - python-six \ - python-tornado \ - python-twisted \ - python-wheel \ - python-zope.interface \ - python3-all \ - python3-all-dbg \ - python3-all-dev \ - python3-setuptools \ - python3-six \ - python3-tornado \ - python3-twisted \ - python3-wheel \ - python3-zope.interface && \ - pip install --upgrade backports.ssl_match_hostname - -RUN apt-get install -y --no-install-recommends \ -`# Ruby dependencies` \ - ruby \ - ruby-dev \ - ruby-bundler -RUN gem install bundler --no-ri --no-rdoc - -RUN apt-get install -y --no-install-recommends \ -`# Rust dependencies` \ - rustc - -# Update anything else left hanging -RUN apt-get dist-upgrade -y - -# Clean up -RUN rm -rf /var/cache/apt/* && \ - rm -rf /var/lib/apt/lists/* && \ - rm -rf /tmp/* && \ - rm -rf /var/tmp/* - -ENV THRIFT_ROOT /thrift -RUN mkdir -p $THRIFT_ROOT/src -COPY Dockerfile $THRIFT_ROOT/ -WORKDIR $THRIFT_ROOT/src diff --git a/build/docker/old/ubuntu-artful/Dockerfile b/build/docker/old/ubuntu-artful/Dockerfile deleted file mode 100644 index f94b70086b5..00000000000 --- a/build/docker/old/ubuntu-artful/Dockerfile +++ /dev/null @@ -1,260 +0,0 @@ -# Licensed 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. - -# -# Apache Thrift Docker build environment for Ubuntu Artful -# Using all stock Ubuntu Artful packaging except for: -# - cpp: stock boost 1.62 in artful has a nasty bug so we use stock boost 1.63 -# - d: dmd does not come with Ubuntu -# - dart: does not come with Ubuntu. Pinned to last 1.x release -# - dotnet: does not come with Ubuntu -# - haxe: version 3.4.2 that comes with Ubuntu cores in our CI build -# - go: artful comes with 1.9, we want the latest (supported) -# - nodejs: want v8, artful comes with v6 -# - -FROM buildpack-deps:artful-scm -MAINTAINER Apache Thrift -ENV DEBIAN_FRONTEND noninteractive - -### Add apt repos - -RUN apt-get update && \ - apt-get dist-upgrade -y && \ - apt-get install -y --no-install-recommends \ - apt \ - apt-transport-https \ - apt-utils \ - curl \ - dirmngr \ - software-properties-common \ - wget - -# Dart -RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ - curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \ - /etc/apt/sources.list.d/dart_stable.list -ENV DART_VERSION 1.24.3-1 - -# dotnet (netcore) -RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \ - echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-artful-prod artful main" > \ - /etc/apt/sources.list.d/dotnetdev.list - -# haxe (https://haxe.org/download/linux/) -RUN add-apt-repository ppa:haxe/releases -y - -# node.js -RUN curl -sL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \ - echo "deb https://deb.nodesource.com/node_8.x artful main" | tee /etc/apt/sources.list.d/nodesource.list - -### install general dependencies -RUN apt-get update && apt-get install -y --no-install-recommends \ -`# General dependencies` \ - bash-completion \ - bison \ - build-essential \ - clang \ - cmake \ - debhelper \ - flex \ - gdb \ - llvm \ - ninja-build \ - pkg-config \ - valgrind \ - vim -ENV PATH /usr/lib/llvm-3.8/bin:$PATH - -# boost-1.62 has a terrible bug in boost::test, see https://svn.boost.org/trac10/ticket/12507 -RUN apt-get install -y --no-install-recommends \ -`# C++ dependencies` \ - libboost1.63-all-dev \ - libevent-dev \ - libssl-dev \ - qt5-default \ - qtbase5-dev \ - qtbase5-dev-tools - -ENV SBCL_VERSION 1.4.5 -RUN \ -`# Common Lisp (sbcl) dependencies` \ - curl --version && \ - curl -O -J -L https://kent.dl.sourceforge.net/project/sbcl/sbcl/${SBCL_VERSION}/sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 && \ - tar xjf sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 && \ - cd sbcl-${SBCL_VERSION}-x86-64-linux && \ - ./install.sh && \ - sbcl --version && \ - rm -rf sbcl* - -ENV D_VERSION 2.080.0 -ENV DMD_DEB dmd_2.080.0-0_amd64.deb -RUN \ -`# D dependencies` \ - wget -q http://downloads.dlang.org/releases/2.x/${D_VERSION}/${DMD_DEB} && \ - dpkg --install ${DMD_DEB} && \ - rm -f ${DMD_DEB} && \ - mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \ - curl -sSL https://github.com/D-Programming-Deimos/libevent/archive/master.tar.gz| tar xz && \ - mv libevent-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv libevent-master/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf libevent-master && \ - curl -sSL https://github.com/D-Programming-Deimos/openssl/archive/master.tar.gz| tar xz && \ - mv openssl-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv openssl-master/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf openssl-master - -RUN apt-get install -y --no-install-recommends \ -`# Dart dependencies` \ - dart=$DART_VERSION -ENV PATH /usr/lib/dart/bin:$PATH - -RUN apt-get install -y --no-install-recommends \ -`# dotnet core dependencies` \ - dotnet-sdk-8.0 \ - dotnet-runtime-8.0 \ - aspnetcore-runtime-8.0 \ - dotnet-apphost-pack-8.0 - -RUN apt-get install -y --no-install-recommends \ -`# Erlang dependencies` \ - erlang-base \ - erlang-eunit \ - erlang-dev \ - erlang-tools \ - rebar - -RUN apt-get install -y --no-install-recommends \ -`# GlibC dependencies` \ - libglib2.0-dev - -# golang -ENV GOLANG_VERSION 1.10 -ENV GOLANG_DOWNLOAD_URL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz -ENV GOLANG_DOWNLOAD_SHA256 b5a64335f1490277b585832d1f6c7f8c6c11206cba5cd3f771dcb87b98ad1a33 -RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \ - echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - && \ - tar -C /usr/local -xzf golang.tar.gz && \ - ln -s /usr/local/go/bin/go /usr/local/bin && \ - rm golang.tar.gz - -RUN apt-get install -y --no-install-recommends \ -`# Haxe dependencies` \ - haxe \ - neko \ - neko-dev && \ - haxelib setup --always /usr/share/haxe/lib && \ - haxelib install --always hxcpp 2>&1 > /dev/null - -RUN apt-get install -y --no-install-recommends \ -`# Java dependencies` \ - ant \ - ant-optional \ - openjdk-8-jdk \ - maven - -RUN apt-get install -y --no-install-recommends \ -`# Lua dependencies` \ - lua5.2 \ - lua5.2-dev -# https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212 -# lua5.3 does not install alternatives! -# need to update our luasocket code, lua doesn't have luaL_openlib any more - -RUN apt-get install -y --no-install-recommends \ -`# Node.js dependencies` \ - nodejs - -# Test dependencies for running puppeteer -RUN apt-get install -y --no-install-recommends \ -`# JS dependencies` \ - libxss1 - -RUN apt-get install -y --no-install-recommends \ -`# OCaml dependencies` \ - ocaml \ - opam && \ - opam init --yes && \ - opam install --yes oasis - -RUN apt-get install -y --no-install-recommends \ -`# Perl dependencies` \ - libbit-vector-perl \ - libclass-accessor-class-perl \ - libcrypt-ssleay-perl \ - libio-socket-ssl-perl \ - libnet-ssleay-perl - -RUN apt-get install -y --no-install-recommends \ -`# Php dependencies` \ - php \ - php-cli \ - php-dev \ - php-pear \ - re2c \ - composer - -RUN apt-get install -y --no-install-recommends \ -`# Python dependencies` \ - python-all \ - python-all-dbg \ - python-all-dev \ - python-ipaddress \ - python-pip \ - python-setuptools \ - python-six \ - python-tornado \ - python-twisted \ - python-wheel \ - python-zope.interface && \ - pip install --upgrade backports.ssl_match_hostname - -RUN apt-get install -y --no-install-recommends \ -`# Python3 dependencies` \ - python3-all \ - python3-all-dbg \ - python3-all-dev \ - python3-pip \ - python3-setuptools \ - python3-six \ - python3-tornado \ - python3-twisted \ - python3-wheel \ - python3-zope.interface - -RUN apt-get install -y --no-install-recommends \ -`# Ruby dependencies` \ - ruby \ - ruby-dev \ - ruby-bundler - -RUN apt-get install -y --no-install-recommends \ -`# Rust dependencies` \ - cargo \ - rustc - -RUN apt-get install -y --no-install-recommends \ -`# Static Code Analysis dependencies` \ - cppcheck \ - sloccount && \ - pip install flake8 - -# Clean up -RUN rm -rf /var/cache/apt/* && \ - rm -rf /var/lib/apt/lists/* && \ - rm -rf /tmp/* && \ - rm -rf /var/tmp/* - -ENV THRIFT_ROOT /thrift -RUN mkdir -p $THRIFT_ROOT/src -COPY Dockerfile $THRIFT_ROOT/ -WORKDIR $THRIFT_ROOT/src diff --git a/build/docker/old/ubuntu-bionic/Dockerfile b/build/docker/old/ubuntu-bionic/Dockerfile deleted file mode 100644 index 6d337d7ea32..00000000000 --- a/build/docker/old/ubuntu-bionic/Dockerfile +++ /dev/null @@ -1,318 +0,0 @@ -# Licensed 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. - -# -# Apache Thrift Docker build environment for Ubuntu Bionic -# with some updated packages. -# - -FROM buildpack-deps:bionic-scm -LABEL MAINTAINER='Apache Thrift ' -ENV DEBIAN_FRONTEND noninteractive - -### Add apt repos - -RUN apt-get update -yq && \ - apt-get dist-upgrade -y && \ - apt-get install -y --no-install-recommends --fix-missing \ - apt \ - apt-transport-https \ - apt-utils \ - curl \ - dirmngr \ - software-properties-common \ - wget - -# Dart -RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ - curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \ - /etc/apt/sources.list.d/dart_stable.list - -# dotnet (netcore) -RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \ - wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/18.04/prod.list && \ - chown root:root /etc/apt/trusted.gpg.d/microsoft.gpg && \ - chown root:root /etc/apt/sources.list.d/microsoft-prod.list - -# node.js -RUN curl -sL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \ - echo "deb https://deb.nodesource.com/node_10.x bionic main" | tee /etc/apt/sources.list.d/nodesource.list - -### install general dependencies -RUN apt-get update && apt-get install -y --no-install-recommends \ - `# General dependencies` \ - bash-completion \ - bison \ - build-essential \ - clang \ - cmake \ - debhelper \ - flex \ - gdb \ - libasound2 \ - libatk-bridge2.0-0 \ - libgtk-3-0 \ - llvm \ - ninja-build \ - pkg-config \ - unzip \ - valgrind \ - vim -ENV PATH /usr/lib/llvm-6.0/bin:$PATH - -# lib/as3 (ActionScript) -RUN mkdir -p /usr/local/adobe/flex/4.6 && \ - cd /usr/local/adobe/flex/4.6 && \ - wget -q "http://download.macromedia.com/pub/flex/sdk/flex_sdk_4.6.zip" && \ - unzip flex_sdk_4.6.zip -ENV FLEX_HOME /usr/local/adobe/flex/4.6 - -# TODO: "apt-get install" without "apt-get update" in the same "RUN" step can cause cache issues if modified later. -# See https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run -RUN apt-get install -y --no-install-recommends \ - `# C++ dependencies` \ - libboost-all-dev \ - libevent-dev \ - libssl-dev \ - qt5-default \ - qtbase5-dev \ - qtbase5-dev-tools - -ENV SBCL_VERSION 1.5.3 -RUN \ - `# Common Lisp (sbcl) dependencies` \ - curl --version && \ - curl -o sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 -J -L https://sourceforge.net/projects/sbcl/files/sbcl/${SBCL_VERSION}/sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2/download?use_mirror=managedway# && \ - tar xjf sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 && \ - cd sbcl-${SBCL_VERSION}-x86-64-linux && \ - ./install.sh && \ - sbcl --version && \ - cd .. && \ - rm -rf sbcl* - -ENV D_VERSION 2.087.0 -ENV DMD_DEB dmd_2.087.0-0_amd64.deb -RUN \ - `# D dependencies` \ - wget -q http://downloads.dlang.org/releases/2.x/${D_VERSION}/${DMD_DEB} && \ - dpkg --install ${DMD_DEB} && \ - rm -f ${DMD_DEB} && \ - mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \ - git clone -b 'v2.0.2+2.0.16' https://github.com/D-Programming-Deimos/libevent.git deimos-libevent-2.0 && \ - mv deimos-libevent-2.0/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv deimos-libevent-2.0/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf deimos-libevent-2.0 && \ - git clone -b 'v2.0.0+1.1.0h' https://github.com/D-Programming-Deimos/openssl.git deimos-openssl-1.1.0h && \ - mv deimos-openssl-1.1.0h/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv deimos-openssl-1.1.0h/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf deimos-openssl-1.1.0h - -ENV DART_VERSION 2.7.2-1 -RUN apt-get install -y --no-install-recommends \ - `# Dart dependencies` \ - dart=$DART_VERSION -ENV PATH /usr/lib/dart/bin:$PATH - -RUN apt-get install -y --no-install-recommends \ - `# dotnet core dependencies` \ - dotnet-sdk-7.0 \ - dotnet-runtime-7.0 \ - aspnetcore-runtime-7.0 \ - dotnet-apphost-pack-7.0 - -# Erlang dependencies -ARG ERLANG_OTP_VERSION=23.3.4.11 -ARG ERLANG_REBAR_VERSION=3.18.0 -RUN apt-get update && apt-get install -y --no-install-recommends libncurses5-dev && \ - curl -ssLo /usr/local/bin/kerl https://raw.githubusercontent.com/kerl/kerl/master/kerl && chmod +x /usr/local/bin/kerl && \ - kerl build $ERLANG_OTP_VERSION && kerl install $ERLANG_OTP_VERSION /usr/local/lib/otp/ && . /usr/local/lib/otp/activate && \ - curl -ssLo /usr/local/bin/rebar3 https://github.com/erlang/rebar3/releases/download/${ERLANG_REBAR_VERSION}/rebar3 && chmod +x /usr/local/bin/rebar3 && \ - rebar3 --version -ENV PATH /usr/local/lib/otp/bin:$PATH - -RUN apt-get install -y --no-install-recommends \ - `# GlibC dependencies` \ - libglib2.0-dev - -# golang -ENV GOLANG_VERSION 1.19.5 -ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz -ENV GOLANG_DOWNLOAD_SHA256 36519702ae2fd573c9869461990ae550c8c0d955cd28d2827a6b159fda81ff95 -RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \ - echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - && \ - tar -C /usr/local -xzf golang.tar.gz && \ - ln -s /usr/local/go/bin/go /usr/local/bin && \ - rm golang.tar.gz - -RUN apt-get install -y --no-install-recommends \ - `# Haxe dependencies` \ - haxe \ - neko \ - neko-dev && \ - haxelib setup --always /usr/share/haxe/lib && \ - haxelib install --always hxcpp 2>&1 > /dev/null - -ENV GRADLE_VERSION="8.4" -RUN apt-get install -y --no-install-recommends \ - `# Java dependencies` \ - ant \ - ant-optional \ - maven \ - openjdk-17-jdk-headless && \ - `# Gradle` \ - wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \ - (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \ - unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \ - mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \ - ln -s /usr/local/gradle/bin/gradle /usr/local/bin - -RUN apt-get install -y --no-install-recommends \ - `# Lua dependencies` \ - lua5.2 \ - lua5.2-dev -# https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212 -# lua5.3 does not install alternatives! -# need to update our luasocket code, lua doesn't have luaL_openlib any more - -RUN apt-get install -y --no-install-recommends \ - `# Node.js dependencies` \ - nodejs - -# Test dependencies for running puppeteer -RUN apt-get install -y --no-install-recommends \ - `# JS dependencies` \ - libxss1 \ - libxtst6 - -RUN apt-get install -y --no-install-recommends \ - `# OCaml dependencies` \ - ocaml \ - opam && \ - opam init --yes && \ - opam install --yes oasis - -RUN apt-get install -y --no-install-recommends \ - `# Perl dependencies` \ - libbit-vector-perl \ - libclass-accessor-class-perl \ - libcrypt-ssleay-perl \ - libio-socket-ssl-perl \ - libnet-ssleay-perl \ - libtest-exception-perl - -RUN apt-get install -y --no-install-recommends \ - `# Php dependencies` \ - php \ - php-cli \ - php-dev \ - php-json \ - php-pear \ - php-mbstring \ - php-xml \ - re2c \ - composer - -RUN pecl install xdebug-3.1.1 && \ - echo "zend_extension=xdebug.so" > /etc/php/7.2/cli/conf.d/20-xdebug.ini - -RUN apt-get install -y --no-install-recommends \ - `# Python dependencies` \ - python-all \ - python-all-dbg \ - python-all-dev \ - python-ipaddress \ - python-pip \ - python-setuptools \ - python-six \ - python-tornado \ - python-twisted \ - python-wheel \ - python-zope.interface && \ - pip install --upgrade backports.ssl_match_hostname - -RUN apt-get install -y --no-install-recommends \ - `# Python3 dependencies` \ - python3-all \ - python3-all-dbg \ - python3-all-dev \ - python3-pip \ - python3-setuptools \ - python3-six \ - python3-tornado \ - python3-twisted \ - python3-wheel \ - python3-zope.interface - -RUN apt-get install -y --no-install-recommends \ - `# Ruby dependencies` \ - ruby \ - ruby-dev \ - ruby-bundler - -# Rust dependencies -RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y -ENV PATH /root/.cargo/bin:$PATH - -# Swift on Linux for cross tests -RUN apt-get install -yq \ - libedit-dev \ - libz3-dev \ - libpython-dev \ - libxml2-dev && \ - cd / && \ - wget --quiet https://download.swift.org/swift-5.7-release/ubuntu1804/swift-5.7-RELEASE/swift-5.7-RELEASE-ubuntu18.04.tar.gz && \ - tar xf swift-5.7-RELEASE-ubuntu18.04.tar.gz && \ - mv swift-5.7-RELEASE-ubuntu18.04 /usr/share/swift && \ - rm swift-5.7-RELEASE-ubuntu18.04.tar.gz - -ENV PATH /usr/share/swift/usr/bin:$PATH -RUN swift --version - -# Locale(s) for cpp unit tests -RUN apt-get install -y --no-install-recommends \ - `# Locale dependencies` \ - locales && \ - locale-gen en_US.UTF-8 && \ - locale-gen de_DE.UTF-8 && \ - update-locale - -RUN apt-get install -y --no-install-recommends \ - `# Static Code Analysis dependencies` \ - cppcheck \ - sloccount && \ - pip install flake8 - -# NOTE: this does not reduce the image size but adds an additional layer. -# # Clean up -# RUN rm -rf /var/cache/apt/* && \ -# rm -rf /var/lib/apt/lists/* && \ -# rm -rf /tmp/* && \ -# rm -rf /var/tmp/* - -ARG user=build -ARG group=build -ARG uid=1000 -ARG gid=1000 - -RUN apt-get install -y --no-install-recommends sudo && \ - echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \ - if [ -z `cat /etc/group | grep "${group}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ - adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos "" && \ - echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers - -ENV THRIFT_ROOT /thrift -RUN mkdir -p $THRIFT_ROOT/src && \ - chown -R ${uid}:${uid} $THRIFT_ROOT/ -COPY Dockerfile $THRIFT_ROOT/ -WORKDIR $THRIFT_ROOT/src - -USER ${user} diff --git a/build/docker/old/ubuntu-disco/Dockerfile b/build/docker/old/ubuntu-disco/Dockerfile deleted file mode 100644 index 39642cf2b00..00000000000 --- a/build/docker/old/ubuntu-disco/Dockerfile +++ /dev/null @@ -1,296 +0,0 @@ -# Licensed 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. - -# -# Apache Thrift Docker build environment for Ubuntu Disco -# with some updated packages. -# - -FROM buildpack-deps:disco-scm -MAINTAINER Apache Thrift -ENV DEBIAN_FRONTEND noninteractive - -### Add apt repos - -RUN apt-get update && \ - apt-get dist-upgrade -y && \ - apt-get install -y --no-install-recommends \ - apt \ - apt-transport-https \ - apt-utils \ - curl \ - dirmngr \ - software-properties-common \ - wget - -# Dart -RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ - curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \ - /etc/apt/sources.list.d/dart_stable.list - -# dotnet (netcore) -RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \ - wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/18.04/prod.list && \ - chown root:root /etc/apt/trusted.gpg.d/microsoft.gpg && \ - chown root:root /etc/apt/sources.list.d/microsoft-prod.list - -# erlang -RUN wget -O- https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc | apt-key add - && \ - echo "deb https://packages.erlang-solutions.com/ubuntu disco contrib" | tee /etc/apt/sources.list.d/erlang.list - -# node.js -RUN curl -sL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \ - echo "deb https://deb.nodesource.com/node_10.x disco main" | tee /etc/apt/sources.list.d/nodesource.list - -### install general dependencies -RUN apt-get update && apt-get install -y --no-install-recommends \ - `# General dependencies` \ - bash-completion \ - bison \ - build-essential \ - clang \ - cmake \ - debhelper \ - flex \ - gdb \ - libasound2 \ - libatk-bridge2.0-0 \ - libgtk-3-0 \ - llvm \ - ninja-build \ - pkg-config \ - unzip \ - valgrind \ - vim -ENV PATH /usr/lib/llvm-6.0/bin:$PATH - -# lib/as3 (ActionScript) -RUN mkdir -p /usr/local/adobe/flex/4.6 && \ - cd /usr/local/adobe/flex/4.6 && \ - wget -q "http://download.macromedia.com/pub/flex/sdk/flex_sdk_4.6.zip" && \ - unzip flex_sdk_4.6.zip -ENV FLEX_HOME /usr/local/adobe/flex/4.6 - -RUN apt-get install -y --no-install-recommends \ - `# C++ dependencies` \ - libboost-all-dev \ - libevent-dev \ - libssl-dev \ - qt5-default \ - qtbase5-dev \ - qtbase5-dev-tools - -ENV SBCL_VERSION 1.5.3 -RUN \ - `# Common Lisp (sbcl) dependencies` \ - curl --version && \ - curl -o sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 -J -L https://sourceforge.net/projects/sbcl/files/sbcl/${SBCL_VERSION}/sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2/download?use_mirror=managedway# && \ - tar xjf sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 && \ - cd sbcl-${SBCL_VERSION}-x86-64-linux && \ - ./install.sh && \ - sbcl --version && \ - cd .. && \ - rm -rf sbcl* - -ENV D_VERSION 2.087.0 -ENV DMD_DEB dmd_2.087.0-0_amd64.deb -RUN \ - `# D dependencies` \ - wget -q http://downloads.dlang.org/releases/2.x/${D_VERSION}/${DMD_DEB} && \ - dpkg --install ${DMD_DEB} && \ - rm -f ${DMD_DEB} && \ - mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \ - git clone -b 'v2.0.2+2.0.16' https://github.com/D-Programming-Deimos/libevent.git deimos-libevent-2.0 && \ - mv deimos-libevent-2.0/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv deimos-libevent-2.0/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf deimos-libevent-2.0 && \ - git clone -b 'v2.0.0+1.1.0h' https://github.com/D-Programming-Deimos/openssl.git deimos-openssl-1.1.0h && \ - mv deimos-openssl-1.1.0h/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv deimos-openssl-1.1.0h/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf deimos-openssl-1.1.0h - -ENV DART_VERSION 2.7.2-1 -RUN apt-get install -y --no-install-recommends \ - `# Dart dependencies` \ - dart=$DART_VERSION -ENV PATH /usr/lib/dart/bin:$PATH - -RUN apt-get install -y --no-install-recommends \ - `# dotnet core dependencies` \ - dotnet-sdk-8.0 \ - dotnet-runtime-8.0 \ - aspnetcore-runtime-8.0 \ - dotnet-apphost-pack-8.0 - -RUN apt-get install -y --no-install-recommends \ - `# Erlang dependencies` \ - erlang && \ - wget https://s3.amazonaws.com/rebar3/rebar3 -O /usr/bin/rebar3 && \ - chmod 755 /usr/bin/rebar3 && \ - rebar3 --version - -RUN apt-get install -y --no-install-recommends \ - `# GlibC dependencies` \ - libglib2.0-dev - -# golang -ENV GOLANG_VERSION 1.19 -ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz -ENV GOLANG_DOWNLOAD_SHA256 464b6b66591f6cf055bc5df90a9750bf5fbc9d038722bb84a9d56a2bea974be6 -RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \ - echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - && \ - tar -C /usr/local -xzf golang.tar.gz && \ - ln -s /usr/local/go/bin/go /usr/local/bin && \ - rm golang.tar.gz - -RUN apt-get install -y --no-install-recommends \ - `# Haxe dependencies` \ - haxe \ - neko \ - neko-dev && \ - haxelib setup --always /usr/share/haxe/lib && \ - haxelib install --always hxcpp 2>&1 > /dev/null - -ENV GRADLE_VERSION="8.4" -RUN apt-get install -y --no-install-recommends \ - `# Java dependencies` \ - ant \ - ant-optional \ - maven \ - openjdk-11-jdk-headless && \ - `# Gradle` \ - wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \ - (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \ - unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \ - mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \ - ln -s /usr/local/gradle/bin/gradle /usr/local/bin - -RUN apt-get install -y --no-install-recommends \ - `# Lua dependencies` \ - lua5.2 \ - lua5.2-dev -# https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212 -# lua5.3 does not install alternatives! -# need to update our luasocket code, lua doesn't have luaL_openlib any more - -RUN apt-get install -y --no-install-recommends \ - `# Node.js dependencies` \ - nodejs - -# Test dependencies for running puppeteer -RUN apt-get install -y --no-install-recommends \ - `# JS dependencies` \ - libxss1 \ - libxtst6 - -# does not work on disco? -# RUN apt-get install -y --no-install-recommends \ -# `# OCaml dependencies` \ -# ocaml \ -# opam && \ -# opam init --yes && \ -# opam install --yes oasis - -RUN apt-get install -y --no-install-recommends \ - `# Perl dependencies` \ - libbit-vector-perl \ - libclass-accessor-class-perl \ - libcrypt-ssleay-perl \ - libio-socket-ssl-perl \ - libnet-ssleay-perl \ - libtest-exception-perl - -RUN apt-get install -y --no-install-recommends \ - `# Php dependencies` \ - php \ - php-cli \ - php-dev \ - php-json \ - php-pear \ - re2c \ - composer - -RUN apt-get install -y --no-install-recommends \ - `# Python dependencies` \ - python-all \ - python-all-dbg \ - python-all-dev \ - python-ipaddress \ - python-pip \ - python-setuptools \ - python-six \ - python-tornado \ - python-twisted \ - python-wheel \ - python-zope.interface && \ - pip install --upgrade backports.ssl_match_hostname - -RUN apt-get install -y --no-install-recommends \ - `# Python3 dependencies` \ - python3-all \ - python3-all-dbg \ - python3-all-dev \ - python3-pip \ - python3-setuptools \ - python3-six \ - python3-tornado \ - python3-twisted \ - python3-wheel \ - python3-zope.interface - -RUN apt-get install -y --no-install-recommends \ - `# Ruby dependencies` \ - ruby \ - ruby-dev \ - ruby-bundler - -# Rust dependencies -RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y -ENV PATH /root/.cargo/bin:$PATH - -# Swift on Linux for cross tests -# does not work on disco -# RUN cd / && \ -# wget --quiet https://swift.org/builds/swift-4.2.1-release/ubuntu1804/swift-4.2.1-RELEASE/swift-4.2.1-RELEASE-ubuntu18.04.tar.gz && \ -# tar xf swift-4.2.1-RELEASE-ubuntu18.04.tar.gz --strip-components=1 && \ -# rm swift-4.2.1-RELEASE-ubuntu18.04.tar.gz && \ -# swift --version - -# Locale(s) for cpp unit tests -RUN apt-get install -y --no-install-recommends \ - `# Locale dependencies` \ - locales && \ - locale-gen en_US.UTF-8 && \ - locale-gen de_DE.UTF-8 && \ - update-locale - -# cppcheck-1.82 has a nasty cpp parser bug, so we're using something newer -# don't need this on disco, nobody uses it -# RUN apt-get install -y --no-install-recommends \ -# `# Static Code Analysis dependencies` \ -# cppcheck \ -# sloccount && \ -# pip install flake8 && \ -# wget -q "https://launchpad.net/ubuntu/+source/cppcheck/1.83-2/+build/14874703/+files/cppcheck_1.83-2_amd64.deb" && \ -# dpkg -i cppcheck_1.83-2_amd64.deb && \ -# rm cppcheck_1.83-2_amd64.deb - -# Clean up -RUN rm -rf /var/cache/apt/* && \ - rm -rf /var/lib/apt/lists/* && \ - rm -rf /tmp/* && \ - rm -rf /var/tmp/* - -ENV THRIFT_ROOT /thrift -RUN mkdir -p $THRIFT_ROOT/src -COPY Dockerfile $THRIFT_ROOT/ -WORKDIR $THRIFT_ROOT/src diff --git a/build/docker/old/ubuntu-trusty/Dockerfile b/build/docker/old/ubuntu-trusty/Dockerfile deleted file mode 100644 index 89f683e4bcf..00000000000 --- a/build/docker/old/ubuntu-trusty/Dockerfile +++ /dev/null @@ -1,235 +0,0 @@ -# Licensed 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. - -# -# Apache Thrift Docker build environment for Ubuntu Trusty -# Using all stock Ubuntu Trusty packaging except for: -# - d: does not come with Ubuntu so we're installing 2.070.0 -# - dart: does not come with Ubuntu so we're installing 1.20.1 -# - dotnetcore, disabled because netcore is for 1.0.0-preview and 2.0.0 is out -# - haxe, disabled because the distro comes with 3.0.0 and it cores while installing -# - node.js, disabled because it is at 0.10.0 in the distro which is too old (need 4+) -# - ocaml, disabled because it fails to install properly -# - -FROM buildpack-deps:trusty-scm -MAINTAINER Apache Thrift -ENV DEBIAN_FRONTEND noninteractive - -### Add apt repos - -RUN apt-get update && \ - apt-get dist-upgrade -y && \ - apt-get install -y --no-install-recommends \ - apt \ - apt-transport-https \ - apt-utils \ - curl \ - dirmngr \ - software-properties-common \ - wget - -# D -RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EBCF975E5BA24D5E && \ - wget http://master.dl.sourceforge.net/project/d-apt/files/d-apt.list -O /etc/apt/sources.list.d/d-apt.list && \ - wget -qO - https://dlang.org/d-keyring.gpg | apt-key add - - -# Dart -RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ - curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \ - /etc/apt/sources.list.d/dart_stable.list - -RUN apt-get update && apt-get install -y --no-install-recommends \ -`# General dependencies` \ - bash-completion \ - bison \ - build-essential \ - clang \ - cmake \ - debhelper \ - flex \ - gdb \ - llvm \ - ninja-build \ - pkg-config \ - valgrind \ - vim -ENV PATH /usr/lib/llvm-3.8/bin:$PATH - -RUN apt-get install -y --no-install-recommends \ -`# C++ dependencies` \ - libboost-all-dev \ - libevent-dev \ - libssl-dev \ - qt5-default \ - qtbase5-dev \ - qtbase5-dev-tools - -RUN apt-get install -y --no-install-recommends \ -`# D dependencies` \ - dmd-bin=2.070.2-0 \ - libphobos2-dev=2.070.2-0 \ - dub \ - dfmt \ - dscanner \ - xdg-utils -RUN mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \ - curl -sSL https://github.com/D-Programming-Deimos/libevent/archive/master.tar.gz| tar xz && \ - mv libevent-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv libevent-master/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf libevent-master -RUN curl -sSL https://github.com/D-Programming-Deimos/openssl/archive/master.tar.gz| tar xz && \ - mv openssl-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv openssl-master/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf openssl-master - -RUN apt-get install -y --no-install-recommends \ -`# Dart dependencies` \ - dart=1.20.1-1 -ENV PATH /usr/lib/dart/bin:$PATH - -RUN apt-get install -y --no-install-recommends \ -`# Erlang dependencies` \ - erlang-base \ - erlang-eunit \ - erlang-dev \ - erlang-tools \ - rebar - -RUN apt-get install -y --no-install-recommends \ -`# GlibC dependencies` \ - libglib2.0-dev - -# golang -ENV GOLANG_VERSION 1.7.6 -ENV GOLANG_DOWNLOAD_URL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz -ENV GOLANG_DOWNLOAD_SHA256 ad5808bf42b014c22dd7646458f631385003049ded0bb6af2efc7f1f79fa29ea -RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \ - echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - && \ - tar -C /usr/local -xzf golang.tar.gz && \ - ln -s /usr/local/go/bin/go /usr/local/bin && \ - rm golang.tar.gz - -# disabled because it cores while installing -# RUN apt-get install -y --no-install-recommends \ -# `# Haxe dependencies` \ -# haxe \ -# neko \ -# neko-dev && \ -# haxelib setup /usr/share/haxe/lib && \ -# haxelib install hxcpp 3.2.102 - -RUN apt-get install -y --no-install-recommends \ -`# Java dependencies` \ - ant \ - ant-optional \ - openjdk-7-jdk \ - maven - -RUN apt-get install -y --no-install-recommends \ -`# Lua dependencies` \ - lua5.1 \ - lua5.1-dev - -# disabled because it is too old -# RUN apt-get install -y --no-install-recommends \ -# `# Node.js dependencies` \ -# nodejs \ -# npm - -# disabled because it fails to install properly -# RUN apt-get install -y --no-install-recommends \ -# `# OCaml dependencies` \ -# ocaml \ -# opam && \ -# opam init --yes && \ -# opam install --yes oasis - -RUN apt-get install -y --no-install-recommends \ -`# Perl dependencies` \ - libbit-vector-perl \ - libclass-accessor-class-perl \ - libcrypt-ssleay-perl \ - libio-socket-ssl-perl \ - libnet-ssleay-perl - -RUN apt-get install -y --no-install-recommends \ -`# Php dependencies` \ - php5 \ - php5-cli \ - php5-dev \ - php-pear \ - re2c && \ - wget https://getcomposer.org/installer -O - -q | php -- --quiet --install-dir=/usr/local/bin/ --filename=composer - -RUN apt-get install -y --no-install-recommends \ -`# Python dependencies` \ - python-all \ - python-all-dbg \ - python-all-dev \ - python-pip \ - python-setuptools \ - python-six \ - python-twisted \ - python-wheel \ - python-zope.interface \ - python3-all \ - python3-all-dbg \ - python3-all-dev \ - python3-pip \ - python3-setuptools \ - python3-six \ - python3-wheel \ - python3-zope.interface && \ - pip install -U ipaddress backports.ssl_match_hostname tornado && \ - pip3 install -U backports.ssl_match_hostname tornado -# installing tornado by pip/pip3 instead of debian package -# if we install the debian package, the build fails in py2 - -RUN apt-get install -y --no-install-recommends \ -`# Ruby dependencies` \ - ruby \ - ruby-dev \ - ruby-bundler -RUN gem install bundler --no-ri --no-rdoc - -RUN apt-get install -y --no-install-recommends \ -`# Rust dependencies` \ - cargo \ - rustc - -RUN apt-get install -y --no-install-recommends \ -`# Static Code Analysis dependencies` \ - cppcheck \ - sloccount && \ - pip install flake8 - -# Install BouncyCastle provider to fix Java builds issues with JDK 7 -# Builds accessing repote repositories fail as seen here: https://github.com/travis-ci/travis-ci/issues/8503 -RUN apt-get install -y --no-install-recommends \ -`# BouncyCastle JCE Provider dependencies` \ - libbcprov-java && \ - ln -s /usr/share/java/bcprov.jar /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext/bcprov.jar && \ - awk -F . -v OFS=. 'BEGIN{n=2}/^security\.provider/ {split($3, posAndEquals, "=");$3=n++"="posAndEquals[2];print;next} 1' /etc/java-7-openjdk/security/java.security > /tmp/java.security && \ - echo "security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider" >> /tmp/java.security && \ - mv /tmp/java.security /etc/java-7-openjdk/security/java.security - -# Clean up -RUN rm -rf /var/cache/apt/* && \ - rm -rf /var/lib/apt/lists/* && \ - rm -rf /tmp/* && \ - rm -rf /var/tmp/* - -ENV THRIFT_ROOT /thrift -RUN mkdir -p $THRIFT_ROOT/src -COPY Dockerfile $THRIFT_ROOT/ -WORKDIR $THRIFT_ROOT/src diff --git a/build/docker/old/ubuntu-xenial/Dockerfile b/build/docker/old/ubuntu-xenial/Dockerfile deleted file mode 100644 index d9d87ccaea3..00000000000 --- a/build/docker/old/ubuntu-xenial/Dockerfile +++ /dev/null @@ -1,273 +0,0 @@ -# Licensed 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. - -# -# Apache Thrift Docker build environment for Ubuntu Xenial -# Using all stock Ubuntu Xenial packaging except for: -# - d: does not come with Ubuntu so we're installing 2.087.0 for coverage -# - dart: does not come with Ubuntu so we're installing 2.0.0-1 for coverage -# - dotnet: does not come with Ubuntu -# - go: Xenial comes with 1.6, but we need 1.10 or later -# - nodejs: Xenial comes with 4.2.6 which exits LTS April 2018, so we're installing 10.x -# - ocaml: causes stack overflow error, just started March 2018 not sure why -# - -FROM buildpack-deps:xenial-scm -MAINTAINER Apache Thrift -ENV DEBIAN_FRONTEND noninteractive - -### Add apt repos - -RUN apt-get update && \ - apt-get dist-upgrade -y && \ - apt-get install -y --no-install-recommends \ - apt \ - apt-transport-https \ - apt-utils \ - curl \ - software-properties-common \ - wget && \ - - # Dart - curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ - curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \ - /etc/apt/sources.list.d/dart_stable.list && \ - - # dotnet (core) - curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \ - echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > \ - /etc/apt/sources.list.d/dotnetdev.list && \ - - # node.js - curl -sL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \ - echo "deb https://deb.nodesource.com/node_10.x xenial main" | tee /etc/apt/sources.list.d/nodesource.list && \ - - # ruby 2.4 - apt-add-repository ppa:brightbox/ruby-ng - -### install general dependencies -RUN apt-get update && apt-get install -y --no-install-recommends \ - `# General dependencies` \ - bash-completion \ - bison \ - build-essential \ - clang \ - cmake \ - debhelper \ - flex \ - gdb \ - llvm \ - ninja-build \ - pkg-config \ - valgrind \ - vim -ENV PATH /usr/lib/llvm-3.8/bin:$PATH - -### languages - -# TODO: "apt-get install" without "apt-get update" in the same "RUN" step can cause cache issues if modified later. -# See https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run -RUN apt-get install -y --no-install-recommends \ - `# C++ dependencies` \ - libboost-dev \ - libboost-filesystem-dev \ - libboost-program-options-dev \ - libboost-system-dev \ - libboost-test-dev \ - libboost-thread-dev \ - libevent-dev \ - libssl-dev \ - qt5-default \ - qtbase5-dev \ - qtbase5-dev-tools - -ENV D_VERSION 2.087.0 -ENV DMD_DEB dmd_2.087.0-0_amd64.deb -RUN \ - `# D dependencies` \ - wget -q http://downloads.dlang.org/releases/2.x/${D_VERSION}/${DMD_DEB} && \ - dpkg --install ${DMD_DEB} && \ - rm -f ${DMD_DEB} && \ - mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \ - git clone -b 'v2.0.2+2.0.16' https://github.com/D-Programming-Deimos/libevent.git deimos-libevent-2.0 && \ - mv deimos-libevent-2.0/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv deimos-libevent-2.0/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf deimos-libevent-2.0 && \ - git clone -b 'v1.1.6+1.0.1g' https://github.com/D-Programming-Deimos/openssl.git deimos-openssl-1.0.1g && \ - mv deimos-openssl-1.0.1g/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv deimos-openssl-1.0.1g/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf deimos-openssl-1.0.1g - -ENV DART_VERSION 2.7.2-1 -RUN apt-get install -y --no-install-recommends \ - `# Dart dependencies` \ - dart=$DART_VERSION -ENV PATH /usr/lib/dart/bin:$PATH - -RUN apt-get install -y --no-install-recommends \ - `# dotnet core dependencies` \ - dotnet-sdk-8.0 \ - dotnet-runtime-8.0 \ - aspnetcore-runtime-8.0 \ - dotnet-apphost-pack-8.0 - -# Erlang dependencies -ARG ERLANG_OTP_VERSION=20.3.8.9 -ARG ERLANG_REBAR_VERSION=3.13.2 -RUN apt-get update && apt-get install -y --no-install-recommends automake libncurses5-dev && \ - curl https://raw.githubusercontent.com/kerl/kerl/master/kerl -o /usr/local/bin/kerl && chmod +x /usr/local/bin/kerl && \ - kerl build $ERLANG_OTP_VERSION && kerl install $ERLANG_OTP_VERSION /usr/local/lib/otp/ && . /usr/local/lib/otp/activate && \ - curl https://s3.amazonaws.com/rebar3/rebar3 -o /usr/local/bin/rebar3 && chmod +x /usr/local/bin/rebar3 && \ - curl -ssLo /usr/local/bin/rebar3 https://github.com/erlang/rebar3/releases/download/${ERLANG_REBAR_VERSION}/rebar3 && chmod +x /usr/local/bin/rebar3 && \ - rebar3 --version -ENV PATH /usr/local/lib/otp/bin:$PATH - -RUN apt-get install -y --no-install-recommends \ - `# GlibC dependencies` \ - libglib2.0-dev - -# golang -ENV GOLANG_VERSION 1.18.5 -ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz -ENV GOLANG_DOWNLOAD_SHA256 9e5de37f9c49942c601b191ac5fba404b868bfc21d446d6960acc12283d6e5f2 -RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \ - echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - && \ - tar -C /usr/local -xzf golang.tar.gz && \ - ln -s /usr/local/go/bin/go /usr/local/bin && \ - rm golang.tar.gz - -RUN apt-get install -y --no-install-recommends \ - `# Haxe dependencies` \ - haxe \ - neko \ - neko-dev \ - libneko0 && \ - haxelib setup --always /usr/share/haxe/lib && \ - haxelib install --always hxcpp 3.4.64 2>&1 > /dev/null -# note: hxcpp 3.4.185 (latest) no longer ships static libraries, and caused a build failure - -ENV GRADLE_VERSION="8.4" -RUN apt-get install -y --no-install-recommends \ - `# Java dependencies` \ - ant \ - ant-optional \ - openjdk-8-jdk \ - maven \ - unzip && \ - `# Gradle` \ - wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \ - (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \ - unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \ - mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \ - ln -s /usr/local/gradle/bin/gradle /usr/local/bin - -# disabled: same as ubuntu-bionic jobs -# RUN apt-get install -y --no-install-recommends \ -# `# Lua dependencies` \ -# lua5.2 \ -# lua5.2-dev -# https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212 -# lua5.3 does not install alternatives so stick with 5.2 here - -RUN apt-get install -y --no-install-recommends \ - `# Node.js dependencies` \ - nodejs - -# Test dependencies for running puppeteer -RUN apt-get install -y --no-install-recommends \ - `# JS dependencies` \ - libxss1 \ - libxtst6 \ - libatk-bridge2.0-0 \ - libgtk-3-0 - -# THRIFT-4517: causes stack overflows; version too old; skip ocaml in xenial -# RUN apt-get install -y --no-install-recommends \ -# `# OCaml dependencies` \ -# ocaml \ -# opam && \ -# opam init --yes && \ -# opam install --yes oasis - -RUN apt-get install -y --no-install-recommends \ - `# Perl dependencies` \ - libbit-vector-perl \ - libclass-accessor-class-perl \ - libcrypt-ssleay-perl \ - libio-socket-ssl-perl \ - libnet-ssleay-perl \ - libtest-exception-perl - -RUN apt-get install -y --no-install-recommends \ - `# Php dependencies` \ - php7.0 \ - php7.0-cli \ - php7.0-dev \ - php-json \ - php-pear \ - re2c \ - composer - -RUN apt-get install -y --no-install-recommends \ - `# Python dependencies` \ - python-all \ - python-all-dbg \ - python-all-dev \ - python-backports.ssl-match-hostname \ - python-ipaddress \ - python-pip \ - python-setuptools \ - python-six \ - python-tornado \ - python-twisted \ - python-wheel \ - python-zope.interface \ - python3-all \ - python3-all-dbg \ - python3-all-dev \ - python3-setuptools \ - python3-six \ - python3-tornado \ - python3-twisted \ - python3-wheel \ - python3-zope.interface && \ - pip install --upgrade backports.ssl_match_hostname - -RUN apt-get install -y --no-install-recommends \ - `# Ruby dependencies` \ - ruby2.4 \ - ruby2.4-dev \ - ruby-bundler - -# Rust dependencies -RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y - -# Locale(s) for cpp unit tests -RUN apt-get install -y --no-install-recommends \ - `# Locale dependencies` \ - locales && \ - locale-gen en_US.UTF-8 && \ - locale-gen de_DE.UTF-8 && \ - update-locale - -# NOTE: this does not reduce the image size but adds an additional layer. -# # Clean up -# RUN rm -rf /var/cache/apt/* && \ -# rm -rf /var/lib/apt/lists/* && \ -# rm -rf /tmp/* && \ -# rm -rf /var/tmp/* - -ENV DOTNET_CLI_TELEMETRY_OPTOUT 1 -ENV THRIFT_ROOT /thrift -RUN mkdir -p $THRIFT_ROOT/src -COPY Dockerfile $THRIFT_ROOT/ -WORKDIR $THRIFT_ROOT/src From fd29ab160a18192cbb8eaa94201c2e095e1416d5 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 28 Feb 2024 20:40:30 +0900 Subject: [PATCH 041/430] Update GO in docker containers to 1.21 --- build/docker/ubuntu-focal/Dockerfile | 4 ++-- build/docker/ubuntu-jammy/Dockerfile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile index 00ab2be95b7..2c2b31229b6 100644 --- a/build/docker/ubuntu-focal/Dockerfile +++ b/build/docker/ubuntu-focal/Dockerfile @@ -145,9 +145,9 @@ RUN apt-get install -y --no-install-recommends \ libglib2.0-dev # golang -ENV GOLANG_VERSION 1.20 +ENV GOLANG_VERSION 1.21.7 ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz -ENV GOLANG_DOWNLOAD_SHA256 5a9ebcc65c1cce56e0d2dc616aff4c4cedcfbda8cc6f0288cc08cda3b18dcbf1 +ENV GOLANG_DOWNLOAD_SHA256 13b76a9b2a26823e53062fa841b07087d48ae2ef2936445dc34c4ae03293702c RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \ echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - && \ tar -C /usr/local -xzf golang.tar.gz && \ diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile index d214b9fc7aa..96f1990a54e 100644 --- a/build/docker/ubuntu-jammy/Dockerfile +++ b/build/docker/ubuntu-jammy/Dockerfile @@ -144,9 +144,9 @@ RUN apt-get install -y --no-install-recommends \ libglib2.0-dev # golang -ENV GOLANG_VERSION 1.20 +ENV GOLANG_VERSION 1.21.7 ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz -ENV GOLANG_DOWNLOAD_SHA256 5a9ebcc65c1cce56e0d2dc616aff4c4cedcfbda8cc6f0288cc08cda3b18dcbf1 +ENV GOLANG_DOWNLOAD_SHA256 13b76a9b2a26823e53062fa841b07087d48ae2ef2936445dc34c4ae03293702c RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \ echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - && \ tar -C /usr/local -xzf golang.tar.gz && \ From 6768584bbddf8ca081fdac1ed3a61f90265df2b5 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 4 Mar 2024 21:32:26 +0900 Subject: [PATCH 042/430] Add Haxe and fix rust --- build/docker/ubuntu-focal/Dockerfile | 56 +++++++++++++++++----------- build/docker/ubuntu-jammy/Dockerfile | 56 +++++++++++++++++----------- 2 files changed, 70 insertions(+), 42 deletions(-) diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile index 2c2b31229b6..d04ef70dac4 100644 --- a/build/docker/ubuntu-focal/Dockerfile +++ b/build/docker/ubuntu-focal/Dockerfile @@ -32,6 +32,18 @@ RUN apt-get update -yq && \ software-properties-common \ wget +# Create a user +ARG user=build +ARG group=build +ARG uid=1000 +ARG gid=1000 + +RUN apt-get install -y --no-install-recommends sudo && \ + echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \ + if [ -z `cat /etc/group | grep "${group}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ + adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos "" && \ + echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + # Dart RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \ @@ -154,13 +166,24 @@ RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \ ln -s /usr/local/go/bin/go /usr/local/bin && \ rm golang.tar.gz -RUN apt-get install -y --no-install-recommends \ - `# Haxe dependencies` \ - haxe \ - neko \ - neko-dev && \ - haxelib setup --always /usr/share/haxe/lib && \ - haxelib install --always hxcpp 2>&1 > /dev/null +# HAXE +ARG HAXE_VERSION=4.2.1 +ARG NEKO_VERSION=2.3.0 +RUN cd $HOME && \ + `# Haxe dependencies` && \ + wget https://github.com/HaxeFoundation/haxe/releases/download/${HAXE_VERSION}/haxe-${HAXE_VERSION}-linux64.tar.gz && \ + tar xvf haxe-${HAXE_VERSION}-linux64.tar.gz && \ + rm haxe-${HAXE_VERSION}-linux64.tar.gz && \ + mv haxe_* /opt/haxe && \ + wget https://github.com/HaxeFoundation/neko/releases/download/v`echo ${NEKO_VERSION} | sed "s/\./-/g"`/neko-${NEKO_VERSION}-linux64.tar.gz && \ + tar xvf neko-${NEKO_VERSION}-linux64.tar.gz && \ + rm neko-${NEKO_VERSION}-linux64.tar.gz && \ + mv neko-* /opt/neko +ENV PATH /opt/haxe:/opt/neko:$PATH +RUN echo "/opt/neko" > /etc/ld.so.conf.d/neko.conf && \ + ldconfig && \ + haxelib setup --always /usr/share/haxe/lib && \ + haxelib install --always hxcpp 2>&1 > /dev/null ENV GRADLE_VERSION="8.4" RUN apt-get install -y --no-install-recommends \ @@ -240,9 +263,11 @@ RUN apt-get install -y --no-install-recommends \ ruby-dev \ ruby-bundler -# Rust dependencies -RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y -ENV PATH /root/.cargo/bin:$PATH +USER ${user} +RUN `# Rust dependencies` \ + curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y +ENV PATH /home/${user}/.cargo/bin:$PATH +USER root # Swift on Linux for cross tests RUN apt-get install -yq \ @@ -280,17 +305,6 @@ RUN apt-get install -y --no-install-recommends \ # rm -rf /tmp/* && \ # rm -rf /var/tmp/* -ARG user=build -ARG group=build -ARG uid=1000 -ARG gid=1000 - -RUN apt-get install -y --no-install-recommends sudo && \ - echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \ - if [ -z `cat /etc/group | grep "${group}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ - adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos "" && \ - echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers - ENV THRIFT_ROOT /thrift RUN mkdir -p $THRIFT_ROOT/src && \ chown -R ${uid}:${uid} $THRIFT_ROOT/ diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile index 96f1990a54e..209cb8c4885 100644 --- a/build/docker/ubuntu-jammy/Dockerfile +++ b/build/docker/ubuntu-jammy/Dockerfile @@ -32,6 +32,18 @@ RUN apt-get update -yq && \ software-properties-common \ wget +# Create a user +ARG user=build +ARG group=build +ARG uid=1000 +ARG gid=1000 + +RUN apt-get install -y --no-install-recommends sudo && \ + echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \ + if [ -z `cat /etc/group | grep "${group}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ + adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos "" && \ + echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + # Dart RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \ @@ -153,13 +165,24 @@ RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \ ln -s /usr/local/go/bin/go /usr/local/bin && \ rm golang.tar.gz -RUN apt-get install -y --no-install-recommends \ - `# Haxe dependencies` \ - haxe \ - neko \ - neko-dev && \ - haxelib setup --always /usr/share/haxe/lib && \ - haxelib install --always hxcpp 2>&1 > /dev/null +# HAXE +ARG HAXE_VERSION=4.2.1 +ARG NEKO_VERSION=2.3.0 +RUN cd $HOME && \ + `# Haxe dependencies` && \ + wget https://github.com/HaxeFoundation/haxe/releases/download/${HAXE_VERSION}/haxe-${HAXE_VERSION}-linux64.tar.gz && \ + tar xvf haxe-${HAXE_VERSION}-linux64.tar.gz && \ + rm haxe-${HAXE_VERSION}-linux64.tar.gz && \ + mv haxe_* /opt/haxe && \ + wget https://github.com/HaxeFoundation/neko/releases/download/v`echo ${NEKO_VERSION} | sed "s/\./-/g"`/neko-${NEKO_VERSION}-linux64.tar.gz && \ + tar xvf neko-${NEKO_VERSION}-linux64.tar.gz && \ + rm neko-${NEKO_VERSION}-linux64.tar.gz && \ + mv neko-* /opt/neko +ENV PATH /opt/haxe:/opt/neko:$PATH +RUN echo "/opt/neko" > /etc/ld.so.conf.d/neko.conf && \ + ldconfig && \ + haxelib setup --always /usr/share/haxe/lib && \ + haxelib install --always hxcpp 2>&1 > /dev/null ENV GRADLE_VERSION="8.4" RUN apt-get install -y --no-install-recommends \ @@ -239,9 +262,11 @@ RUN apt-get install -y --no-install-recommends \ ruby-dev \ ruby-bundler -# Rust dependencies -RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y -ENV PATH /root/.cargo/bin:$PATH +USER ${user} +RUN `# Rust dependencies` \ + curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y +ENV PATH /home/${user}/.cargo/bin:$PATH +USER root # Swift on Linux for cross tests RUN apt-get install -yq \ @@ -279,17 +304,6 @@ RUN apt-get install -y --no-install-recommends \ # rm -rf /tmp/* && \ # rm -rf /var/tmp/* -ARG user=build -ARG group=build -ARG uid=1000 -ARG gid=1000 - -RUN apt-get install -y --no-install-recommends sudo && \ - echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \ - if [ -z `cat /etc/group | grep "${group}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ - adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos "" && \ - echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers - ENV THRIFT_ROOT /thrift RUN mkdir -p $THRIFT_ROOT/src && \ chown -R ${uid}:${uid} $THRIFT_ROOT/ From f515517951fde5a6b82306245498a2be159a0ca3 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 5 Mar 2024 22:13:22 +0900 Subject: [PATCH 043/430] Add specific PHP versions and additional dependencies --- build/docker/ubuntu-focal/Dockerfile | 11 +++++++---- build/docker/ubuntu-jammy/Dockerfile | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile index d04ef70dac4..4e975e7552f 100644 --- a/build/docker/ubuntu-focal/Dockerfile +++ b/build/docker/ubuntu-focal/Dockerfile @@ -236,10 +236,13 @@ RUN apt-get install -y --no-install-recommends \ RUN apt-get install -y --no-install-recommends \ `# Php dependencies` \ - php \ - php-cli \ - php-dev \ - php-json \ + php7.4 \ + php7.4-cli \ + php7.4-dev \ + php7.4-mbstring \ + php7.4-xml \ + php7.4-curl \ + php7.4-xdebug \ php-pear \ re2c \ composer diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile index 209cb8c4885..3d2326ebe26 100644 --- a/build/docker/ubuntu-jammy/Dockerfile +++ b/build/docker/ubuntu-jammy/Dockerfile @@ -235,10 +235,13 @@ RUN apt-get install -y --no-install-recommends \ RUN apt-get install -y --no-install-recommends \ `# Php dependencies` \ - php \ - php-cli \ - php-dev \ - php-json \ + php8.1 \ + php8.1-cli \ + php8.1-dev \ + php8.1-mbstring \ + php8.1-xml \ + php8.1-curl \ + php8.1-xdebug \ php-pear \ re2c \ composer From f8431856ed4f8c525b141397c2f1ae226c776b1f Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 5 Mar 2024 23:21:05 +0900 Subject: [PATCH 044/430] Update readme version table --- build/docker/README.md | 75 +++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/build/docker/README.md b/build/docker/README.md index 3cb1a32237c..2a338b4b4c1 100644 --- a/build/docker/README.md +++ b/build/docker/README.md @@ -150,53 +150,52 @@ Open a command prompt in the image: ## Core Tool Versions per Dockerfile ## -Last updated: October 1, 2017 +Last updated: March 5, 2024 -| Tool | ubuntu-xenial | ubuntu-bionic | Notes | +| Tool | ubuntu-focal | ubuntu-jammy | Notes | | :-------- | :------------ | :------------ | :---- | -| ant | 1.9.6 | 1.10.3 | | -| autoconf | 2.69 | 2.69 | | -| automake | 1.15 | 1.15.1 | | -| bison | 3.0.4 | 3.0.4 | | -| boost | 1.58.0 | 1.65.1 | | -| cmake | 3.5.1 | 3.10.2 | | -| cppcheck | 1.72 | 1.82 | | -| flex | 2.6.0 | 2.6.4 | | -| libc6 | 2.23 | 2.27 | glibc | -| libevent | 2.0.21 | 2.1.8 | | -| libstdc++ | 5.4.0 | 7.3.0 | | -| make | 4.1 | 4.1 | | -| openssl | 1.0.2g | 1.1.0g | | -| qt5 | 5.5.1 | 5.9.5 | | +| ant | 1.10.7 | 1.10.12 | | +| autoconf | 2.69 | 2.71 | | +| automake | 1.16.1 | 1.16.5 | | +| bison | 3.5.1 | 3.8.2 | | +| boost | 1.71.0 | 1.74.0 | | +| cmake | 3.16.3 | 3.22.1 | | +| cppcheck | 1.90 | 2.7 | | +| flex | 2.6.4 | 2.6.4 | | +| libc6 | 2.31 | 2.35 | glibc | +| libevent | 2.0.16 | 2.0.16 | | +| libstdc++ | 10.5.0 | 10.5.0 | | +| make | 4.2.1 | 4.3 | | +| openssl | 1.1.1f | 3.0.2 | | +| qt5 | 5.12.8 | 5.15.3 | | ## Compiler/Language Versions per Dockerfile ## -| Language | ubuntu-xenial | ubuntu-bionic | Notes | +| Language | ubuntu-focal | ubuntu-jammy | Notes | | :-------- | :------------ | :------------ | :---- | | as of | Mar 06, 2018 | Jul 1, 2019 | | -| as3 | | 4.6.0 | | -| C++ gcc | 5.4.0 | 7.4.0 | | -| C++ clang | 3.8 | 6.0 | | -| C# (mono) | 4.2.1.0 | 4.6.2.7 | | -| c\_glib | 2.48.2 | 2.56.4 | | +| as3 | 4.6.0 | 4.6.0 | | +| C++ gcc | 9.4.0 | 11.4.0 | | +| C++ clang | 13.0.0 | 13.0.0 | | +| c\_glib | 3.2.12 | 3.2.12 | | | cl (sbcl) | | 1.5.3 | | | d | 2.087.0 | 2.087.0 | | -| dart | 2.0.0 | 2.4.0 | | +| dart | 2.7.2-1 | 2.7.2-1 | | | delphi | | | Not in CI | -| erlang | OTP-20 | OTP-25 | | -| go | 1.15.10 | 1.16.2 | | -| haxe | 3.2.1 | 3.4.4 | THRIFT-4352: avoid 3.4.2 | -| java | 1.8.0\_191 | 17 | | -| js | Node.js 6.17.1, V8 5.1.281.111, npm 3.10.10 | Node.js 10.18.0, V8 6.8.275.32, npm 6.13.4 | | -| lua | | 5.2.4 | Lua 5.3: see THRIFT-4386 | -| netstd | 7.0 | 7.0 | | -| nodejs | 6.16.0 | 10.16.0 | | -| ocaml | | 4.05.0 | THRIFT-4517: ocaml 4.02.3 on xenial appears broken | -| perl | 5.22.1 | 5.26.1 | | -| php | 7.0.32 | 7.2.19 | | -| python | 2.7.12 | 2.7.15 | | -| python3 | 3.5.2 | 3.6.8 | | -| ruby | 2.3.1p112 | 2.5.1p57 | | +| erlang | OTP-25.3.2.9 | OTP-25.3.2.9 | | +| go | 1.21.7 | 1.21.7 | | +| haxe | 4.2.1 | 4.2.1 | | +| java | 17 | 17 | | +| js | Node.js 16.20.2, npm 8.19.4 | Node.js 16.20.2, npm 8.19.4 | | +| lua | 5.2.4 | 5.2.4 | Lua 5.3: see THRIFT-4386 | +| netstd | 8.0.200 | 8.0.200 | | +| nodejs | 16.20.2 | 16.20.2 | | +| ocaml | 4.08.1 | 4.13.1 | | +| perl | 5.30.0 | 5.34.0 | | +| php | 7.4.3 | 8.1.2 | | +| python2 | 2.7.18 | | | +| python3 | 3.8.10 | 3.10.12 | | +| ruby | 2.7.0p0 | 3.0.2p107 | | | rust | 1.65.0 | 1.65.0 | | | smalltalk | | | Not in CI | -| swift | | 5.1.4 | | +| swift | 5.7 | 5.7 | | From 5f563e9f8dd5bb047bfbabe21cd96fd391796983 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 6 Mar 2024 23:26:22 +0900 Subject: [PATCH 045/430] Fix haxe setup, allow root users to be used and check for existing users --- build/docker/ubuntu-focal/Dockerfile | 18 ++++++++++++------ build/docker/ubuntu-jammy/Dockerfile | 18 ++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile index 4e975e7552f..a29ec69531f 100644 --- a/build/docker/ubuntu-focal/Dockerfile +++ b/build/docker/ubuntu-focal/Dockerfile @@ -40,9 +40,11 @@ ARG gid=1000 RUN apt-get install -y --no-install-recommends sudo && \ echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \ - if [ -z `cat /etc/group | grep "${group}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ - adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos "" && \ - echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + if [ -z `cat /etc/group | grep "${group}:"` ] && [ -z `cat /etc/group | grep ":${gid}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ + if [ -z `cat /etc/passwd | grep "${user}:"` ] && [ -z `cat /etc/passwd | grep ":${uid}:"` ]; then adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos ""; fi && \ + echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ + mkdir -p /home/${user} && \ + chown -R ${user}:${group} /home/${user} # Dart RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ @@ -181,9 +183,13 @@ RUN cd $HOME && \ mv neko-* /opt/neko ENV PATH /opt/haxe:/opt/neko:$PATH RUN echo "/opt/neko" > /etc/ld.so.conf.d/neko.conf && \ - ldconfig && \ - haxelib setup --always /usr/share/haxe/lib && \ - haxelib install --always hxcpp 2>&1 > /dev/null + ldconfig +USER ${user} +RUN mkdir -p $HOME/haxe/lib && \ + haxelib setup --always $HOME/haxe/lib && \ + haxelib install --always hxcpp 2>&1 > /dev/null && \ + haxelib install --always uuid 2>&1 > /dev/null +USER root ENV GRADLE_VERSION="8.4" RUN apt-get install -y --no-install-recommends \ diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile index 3d2326ebe26..5fa6e6f889d 100644 --- a/build/docker/ubuntu-jammy/Dockerfile +++ b/build/docker/ubuntu-jammy/Dockerfile @@ -40,9 +40,11 @@ ARG gid=1000 RUN apt-get install -y --no-install-recommends sudo && \ echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \ - if [ -z `cat /etc/group | grep "${group}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ - adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos "" && \ - echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + if [ -z `cat /etc/group | grep "${group}:"` ] && [ -z `cat /etc/group | grep ":${gid}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ + if [ -z `cat /etc/passwd | grep "${user}:"` ] && [ -z `cat /etc/passwd | grep ":${uid}:"` ]; then adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos ""; fi && \ + echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ + mkdir -p /home/${user} && \ + chown -R ${user}:${group} /home/${user} # Dart RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ @@ -180,9 +182,13 @@ RUN cd $HOME && \ mv neko-* /opt/neko ENV PATH /opt/haxe:/opt/neko:$PATH RUN echo "/opt/neko" > /etc/ld.so.conf.d/neko.conf && \ - ldconfig && \ - haxelib setup --always /usr/share/haxe/lib && \ - haxelib install --always hxcpp 2>&1 > /dev/null + ldconfig +USER ${user} +RUN mkdir -p $HOME/haxe/lib && \ + haxelib setup --always $HOME/haxe/lib && \ + haxelib install --always hxcpp 2>&1 > /dev/null && \ + haxelib install --always uuid 2>&1 > /dev/null +USER root ENV GRADLE_VERSION="8.4" RUN apt-get install -y --no-install-recommends \ From f6972f1a29cb3c94929f5eecef816e65bed755ef Mon Sep 17 00:00:00 2001 From: Thomas Date: Sun, 17 Mar 2024 10:06:24 +0900 Subject: [PATCH 046/430] Fix EXTRA_DIST in php make file --- lib/php/Makefile.am | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/lib/php/Makefile.am b/lib/php/Makefile.am index 91944c48164..a618d24bfe8 100644 --- a/lib/php/Makefile.am +++ b/lib/php/Makefile.am @@ -149,18 +149,7 @@ EXTRA_DIST = \ coding_standards.md \ thrift_protocol.ini \ README.apache.md \ - README.md \ - test/Fixtures.php \ - test/TestValidators.thrift \ - test/JsonSerialize/JsonSerializeTest.php \ - test/Protocol/BinarySerializerTest.php \ - test/Protocol/TJSONProtocolFixtures.php \ - test/Protocol/TJSONProtocolTest.php \ - test/Protocol/TSimpleJSONProtocolFixtures.php \ - test/Protocol/TSimpleJSONProtocolTest.php \ - test/Validator/BaseValidatorTest.php \ - test/Validator/ValidatorTest.php \ - test/Validator/ValidatorTestOop.php + README.md MAINTAINERCLEANFILES = \ From 63f04583e389e7afee330f0341e045a73cdb1979 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 21 Mar 2024 22:51:07 +0900 Subject: [PATCH 047/430] Manually remove $(BUILT_SOURCES) since no-dist-built-sources doesnt work --- Makefile.am | 3 +++ compiler/cpp/Makefile.am | 3 +++ compiler/cpp/src/Makefile.am | 3 +++ compiler/cpp/test/Makefile.am | 3 +++ contrib/fb303/py/Makefile.am | 3 +++ lib/Makefile.am | 3 +++ lib/c_glib/Makefile.am | 3 +++ lib/c_glib/test/Makefile.am | 3 +++ lib/cl/Makefile.am | 3 +++ lib/cpp/Makefile.am | 3 +++ lib/cpp/test/Makefile.am | 3 +++ lib/d/Makefile.am | 3 +++ lib/d/test/Makefile.am | 2 ++ lib/dart/Makefile.am | 3 +++ lib/erl/Makefile.am | 3 +++ lib/go/Makefile.am | 3 +++ lib/go/test/Makefile.am | 3 +++ lib/go/test/fuzz/Makefile.am | 3 +++ lib/haxe/test/Makefile.am | 3 +++ lib/java/Makefile.am | 3 +++ lib/js/Makefile.am | 3 +++ lib/js/test/Makefile.am | 3 +++ lib/json/Makefile.am | 3 +++ lib/json/test/Makefile.am | 3 +++ lib/kotlin/Makefile.am | 3 +++ lib/lua/Makefile.am | 3 +++ lib/netstd/Makefile.am | 3 +++ lib/nodejs/Makefile.am | 3 +++ lib/nodets/Makefile.am | 3 +++ lib/perl/Makefile.am | 3 +++ lib/perl/t/Makefile.am | 3 +++ lib/php/Makefile.am | 5 ++++- lib/php/test/Makefile.am | 3 +++ lib/py/Makefile.am | 3 +++ lib/rb/Makefile.am | 3 +++ lib/rs/Makefile.am | 3 +++ lib/rs/test/Makefile.am | 3 +++ lib/rs/test_recursive/Makefile.am | 3 +++ lib/rs/test_recursive/src/Makefile.am | 3 +++ lib/rs/test_recursive/src/maintenance/Makefile.am | 3 +++ lib/rs/test_recursive/src/transit/Makefile.am | 3 +++ lib/rs/test_recursive/src/transit/light/Makefile.am | 3 +++ lib/rs/test_recursive/src/transit/services/Makefile.am | 3 +++ lib/swift/Makefile.am | 3 +++ lib/ts/Makefile.am | 3 +++ lib/xml/Makefile.am | 3 +++ lib/xml/test/Makefile.am | 3 +++ test/Makefile.am | 3 +++ test/c_glib/Makefile.am | 3 +++ test/cl/Makefile.am | 3 +++ test/cpp/Makefile.am | 3 +++ test/dart/Makefile.am | 3 +++ test/erl/Makefile.am | 3 +++ test/features/Makefile.am | 3 +++ test/go/Makefile.am | 3 +++ test/haxe/Makefile.am | 3 +++ test/lua/Makefile.am | 3 +++ test/netstd/Makefile.am | 3 +++ test/perl/Makefile.am | 3 +++ test/php/Makefile.am | 3 +++ test/py.tornado/Makefile.am | 3 +++ test/py.twisted/Makefile.am | 3 +++ test/py/Makefile.am | 2 ++ test/rb/Makefile.am | 3 +++ test/rs/Makefile.am | 3 +++ test/swift/CrossTests/Makefile.am | 3 +++ test/swift/Makefile.am | 3 +++ tutorial/Makefile.am | 3 +++ tutorial/c_glib/Makefile.am | 3 +++ tutorial/cl/Makefile.am | 3 +++ tutorial/cpp/Makefile.am | 3 +++ tutorial/d/Makefile.am | 3 +++ tutorial/dart/Makefile.am | 3 +++ tutorial/go/Makefile.am | 3 +++ tutorial/haxe/Makefile.am | 3 +++ tutorial/java/Makefile.am | 3 +++ tutorial/js/Makefile.am | 3 +++ tutorial/netstd/Makefile.am | 3 +++ tutorial/nodejs/Makefile.am | 3 +++ tutorial/perl/Makefile.am | 3 +++ tutorial/php/Makefile.am | 3 +++ tutorial/py.tornado/Makefile.am | 3 +++ tutorial/py.twisted/Makefile.am | 3 +++ tutorial/py/Makefile.am | 3 +++ tutorial/rb/Makefile.am | 3 +++ tutorial/rs/Makefile.am | 3 +++ tutorial/swift/Makefile.am | 3 +++ 87 files changed, 260 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 5b9e9709f2f..df7490424fa 100644 --- a/Makefile.am +++ b/Makefile.am @@ -131,6 +131,9 @@ skipped_files = $(subst $(space),$(comma),$(codespell_skip_files)) style-local: codespell --write-changes --skip=$(skipped_files) --disable-colors +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ .asf.yaml \ .clang-format \ diff --git a/compiler/cpp/Makefile.am b/compiler/cpp/Makefile.am index bb29d8c47e8..29ef1bd94ca 100644 --- a/compiler/cpp/Makefile.am +++ b/compiler/cpp/Makefile.am @@ -114,6 +114,9 @@ WINDOWS_DIST = \ compiler.vcxproj \ compiler.vcxproj.filters +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ coding_standards.md \ README.md \ diff --git a/compiler/cpp/src/Makefile.am b/compiler/cpp/src/Makefile.am index 5111fd55038..5b6802a4d84 100644 --- a/compiler/cpp/src/Makefile.am +++ b/compiler/cpp/src/Makefile.am @@ -39,6 +39,9 @@ clean-local: $(RM) thrift/thriftl.cc thrift/thrifty.cc thrift/thrifty.h thrift/thrifty.hh +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ thrift/logging.cc \ thrift/windows/config.h diff --git a/compiler/cpp/test/Makefile.am b/compiler/cpp/test/Makefile.am index 10efd073767..6d4d09e938d 100644 --- a/compiler/cpp/test/Makefile.am +++ b/compiler/cpp/test/Makefile.am @@ -23,5 +23,8 @@ AUTOMAKE_OPTIONS = subdir-objects serial-tests nostdinc +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + AM_CPPFLAGS = -I$(top_srcdir)/compiler/cpp/src AM_CXXFLAGS = -Wall -Wextra -pedantic diff --git a/contrib/fb303/py/Makefile.am b/contrib/fb303/py/Makefile.am index 060495e5819..706e10a35e2 100644 --- a/contrib/fb303/py/Makefile.am +++ b/contrib/fb303/py/Makefile.am @@ -18,6 +18,9 @@ # DESTDIR ?= / +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = setup.py src all: diff --git a/lib/Makefile.am b/lib/Makefile.am index 3f717f1afc8..19177ccb537 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -102,6 +102,9 @@ endif # All of the libs that don't use Automake need to go in here # so they will end up in our release tarballs. +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ d \ dart \ diff --git a/lib/c_glib/Makefile.am b/lib/c_glib/Makefile.am index b2061bbc789..80a51650a31 100644 --- a/lib/c_glib/Makefile.am +++ b/lib/c_glib/Makefile.am @@ -112,6 +112,9 @@ include_processor_HEADERS = src/thrift/c_glib/processor/thrift_processor.h \ src/thrift/c_glib/processor/thrift_multiplexed_processor.h +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ CMakeLists.txt \ coding_standards.md \ diff --git a/lib/c_glib/test/Makefile.am b/lib/c_glib/test/Makefile.am index f3a0c30df67..c7c67ab4c73 100644 --- a/lib/c_glib/test/Makefile.am +++ b/lib/c_glib/test/Makefile.am @@ -401,6 +401,9 @@ CLEANFILES = \ *.gcda \ *.gcov +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ CMakeLists.txt \ ContainerTest.thrift diff --git a/lib/cl/Makefile.am b/lib/cl/Makefile.am index 34b38861d23..a54eb922eb4 100644 --- a/lib/cl/Makefile.am +++ b/lib/cl/Makefile.am @@ -32,6 +32,9 @@ clean-local: $(RM) run-tests quicklisp.lisp backport-update.zip $(RM) -rf lib externals quicklisp +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ README.md \ READMES \ diff --git a/lib/cpp/Makefile.am b/lib/cpp/Makefile.am index c015b0db60f..2499fdbff6b 100644 --- a/lib/cpp/Makefile.am +++ b/lib/cpp/Makefile.am @@ -252,6 +252,9 @@ WINDOWS_DIST = \ libthriftnb.vcxproj.filters \ 3rdparty.props +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ CMakeLists.txt \ coding_standards.md \ diff --git a/lib/cpp/test/Makefile.am b/lib/cpp/test/Makefile.am index cd401c0f396..a7440392f85 100644 --- a/lib/cpp/test/Makefile.am +++ b/lib/cpp/test/Makefile.am @@ -424,6 +424,9 @@ AM_CXXFLAGS = -Wall -Wextra -pedantic clean-local: $(RM) gen-cpp/* +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ concurrency \ processor \ diff --git a/lib/d/Makefile.am b/lib/d/Makefile.am index 013721720b5..6f014c83189 100644 --- a/lib/d/Makefile.am +++ b/lib/d/Makefile.am @@ -192,6 +192,9 @@ TESTS = $(addprefix unittest/debug/, $(d_test_modules)) \ precross: all-local $(MAKE) -C test precross +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ src \ test \ diff --git a/lib/d/test/Makefile.am b/lib/d/test/Makefile.am index 44364f9d97c..28f3f3ec4a0 100644 --- a/lib/d/test/Makefile.am +++ b/lib/d/test/Makefile.am @@ -38,6 +38,8 @@ thrift_test_gen = $(addprefix gen-d/thrift/test/, SecondService.d \ $(thrift_test_gen): $(top_srcdir)/test/v0.16/ThriftTest.thrift $(THRIFT) --gen d $< +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am # The actual test targets. # There just must be some way to reassign a variable without warnings in diff --git a/lib/dart/Makefile.am b/lib/dart/Makefile.am index bd12a92f020..74f1404b663 100644 --- a/lib/dart/Makefile.am +++ b/lib/dart/Makefile.am @@ -28,6 +28,9 @@ clean-local: check-local: all +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + dist-hook: $(RM) -r $(distdir)/.pub find $(distdir) -type d -name ".dart_tool" | xargs $(RM) -r diff --git a/lib/erl/Makefile.am b/lib/erl/Makefile.am index 23ebb778908..4259a1f5a14 100644 --- a/lib/erl/Makefile.am +++ b/lib/erl/Makefile.am @@ -78,6 +78,9 @@ dist-hook: $(RM) -r $(distdir)/test/gen-erl/ $(RM) $(distdir)/$(THRIFT_OMIT_FILE) +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ include \ src \ diff --git a/lib/go/Makefile.am b/lib/go/Makefile.am index 18b6b75f46e..3bfefbc2209 100644 --- a/lib/go/Makefile.am +++ b/lib/go/Makefile.am @@ -48,6 +48,9 @@ clean-local: all-local: $(GO) build $(GOBUILDEXTRA) ./thrift +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ thrift \ coding_standards.md \ diff --git a/lib/go/test/Makefile.am b/lib/go/test/Makefile.am index 379971e99f9..d76f24815dd 100644 --- a/lib/go/test/Makefile.am +++ b/lib/go/test/Makefile.am @@ -136,6 +136,9 @@ clean-local: client: stubs $(GO) run TestClient.go +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ dontexportrwtest \ tests \ diff --git a/lib/go/test/fuzz/Makefile.am b/lib/go/test/fuzz/Makefile.am index 9677f4f0016..a481e9583d9 100644 --- a/lib/go/test/fuzz/Makefile.am +++ b/lib/go/test/fuzz/Makefile.am @@ -27,6 +27,9 @@ check: gopathfuzz clean-local: $(RM) -rf gopathfuzz gen-go +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ fuzz.go \ fuzz_test.go \ diff --git a/lib/haxe/test/Makefile.am b/lib/haxe/test/Makefile.am index 2b8b24524cc..8c658ae7c74 100644 --- a/lib/haxe/test/Makefile.am +++ b/lib/haxe/test/Makefile.am @@ -69,6 +69,9 @@ check: $(BIN_CPP) $(BIN_PHP) $(BIN_CPP) php -f $(BIN_PHP) +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ src \ cpp.hxml \ diff --git a/lib/java/Makefile.am b/lib/java/Makefile.am index 1dd42a7d2ba..fc63af4827f 100644 --- a/lib/java/Makefile.am +++ b/lib/java/Makefile.am @@ -56,6 +56,9 @@ maven-publish: -Pthrift.version=$(PACKAGE_VERSION) \ --console=plain +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ build.gradle \ gradle.properties \ diff --git a/lib/js/Makefile.am b/lib/js/Makefile.am index 4906d7ddbcc..9b7dfb6d30f 100644 --- a/lib/js/Makefile.am +++ b/lib/js/Makefile.am @@ -52,6 +52,9 @@ dist-hook: $(RM) -r $(distdir)/test/build/ $(RM) -r $(distdir)/test/gen-*/ +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ coding_standards.md \ Gruntfile.js \ diff --git a/lib/js/test/Makefile.am b/lib/js/test/Makefile.am index 14927c40a51..8a817b36621 100644 --- a/lib/js/test/Makefile.am +++ b/lib/js/test/Makefile.am @@ -24,6 +24,9 @@ clean-local: ANT=$(ANT) ; if test -z "$$ANT" ; then ANT=: ; fi ; \ $$ANT $(ANT_FLAGS) clean +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + check-local: all $(ANT) $(ANT_FLAGS) test diff --git a/lib/json/Makefile.am b/lib/json/Makefile.am index 6c8c0ce8116..3c7aa8f3d74 100644 --- a/lib/json/Makefile.am +++ b/lib/json/Makefile.am @@ -28,6 +28,9 @@ clean-local: dist-hook: $(RM) -r $(distdir)/test/build/ +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ schema.json \ test diff --git a/lib/json/test/Makefile.am b/lib/json/test/Makefile.am index bb87a52038f..16bcfae383f 100644 --- a/lib/json/test/Makefile.am +++ b/lib/json/test/Makefile.am @@ -20,6 +20,9 @@ check: $(ANT) $(ANT_FLAGS) test +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + # Make sure this doesn't fail if ant is not configured. clean-local: ANT=$(ANT) ; if test -z "$$ANT" ; then ANT=: ; fi ; \ diff --git a/lib/kotlin/Makefile.am b/lib/kotlin/Makefile.am index 720f8234fe0..e5685cf7162 100644 --- a/lib/kotlin/Makefile.am +++ b/lib/kotlin/Makefile.am @@ -40,6 +40,9 @@ check-local: $(THRIFT) -Pthrift.compiler=$(THRIFT) \ --console=plain +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ build.gradle.kts \ CMakeLists.txt \ diff --git a/lib/lua/Makefile.am b/lib/lua/Makefile.am index 3b272f56cbe..ae67d942e85 100644 --- a/lib/lua/Makefile.am +++ b/lib/lua/Makefile.am @@ -57,6 +57,9 @@ liblualongnumber_la_CPPFLAGS = $(AM_CPPFLAGS) $(LUA_INCLUDE) -DLUA_COMPAT_MODULE liblualongnumber_la_LDFLAGS = $(AM_LDFLAGS) liblualongnumber_la_LIBADD = $(LUA_LIB) -lm +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ coding_standards.md \ TBinaryProtocol.lua \ diff --git a/lib/netstd/Makefile.am b/lib/netstd/Makefile.am index 47b38030932..ccaef9e4c69 100644 --- a/lib/netstd/Makefile.am +++ b/lib/netstd/Makefile.am @@ -39,6 +39,9 @@ clean-local: $(RM) -r Tests/Thrift.PublicInterfaces.Compile.Tests/bin $(RM) -r Tests/Thrift.PublicInterfaces.Compile.Tests/obj +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ README.md \ Directory.Build.props \ diff --git a/lib/nodejs/Makefile.am b/lib/nodejs/Makefile.am index 6691579624c..9503f04c9e1 100644 --- a/lib/nodejs/Makefile.am +++ b/lib/nodejs/Makefile.am @@ -37,6 +37,9 @@ clean-local: $(RM) -r test/episodic-code-generation-test/gen* $(RM) -r test/episodic-code-generation-test/node_modules +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ examples \ lib \ diff --git a/lib/nodets/Makefile.am b/lib/nodets/Makefile.am index 02d0c11fee7..ac2aa6e1b17 100644 --- a/lib/nodets/Makefile.am +++ b/lib/nodets/Makefile.am @@ -41,6 +41,9 @@ clean-local: $(RM) -r $(top_srcdir)/node_modules $(RM) -r test-compiled +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ test \ coding_standards.md diff --git a/lib/perl/Makefile.am b/lib/perl/Makefile.am index 8b72436c500..9d762b41018 100644 --- a/lib/perl/Makefile.am +++ b/lib/perl/Makefile.am @@ -36,6 +36,9 @@ clean-local: $(RM) Makefile-perl.mk.old $(RM) -r gen-perl gen-perl2 +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ coding_standards.md \ build-cpan-dist.sh \ diff --git a/lib/perl/t/Makefile.am b/lib/perl/t/Makefile.am index de03971869f..7e9d8a0b987 100644 --- a/lib/perl/t/Makefile.am +++ b/lib/perl/t/Makefile.am @@ -17,4 +17,7 @@ # under the License. # +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = memory_buffer.t processor.t multiplex.t diff --git a/lib/php/Makefile.am b/lib/php/Makefile.am index a618d24bfe8..3851294604e 100644 --- a/lib/php/Makefile.am +++ b/lib/php/Makefile.am @@ -134,6 +134,8 @@ phptype_DATA = \ clean-local: if [ -f src/ext/thrift_protocol/Makefile ]; then cd src/ext/thrift_protocol/ && $(MAKE) clean; fi +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am EXTRA_DIST = \ lib \ @@ -149,7 +151,8 @@ EXTRA_DIST = \ coding_standards.md \ thrift_protocol.ini \ README.apache.md \ - README.md + README.md \ + test MAINTAINERCLEANFILES = \ diff --git a/lib/php/test/Makefile.am b/lib/php/test/Makefile.am index 00d51f628f8..1e534cad0f4 100644 --- a/lib/php/test/Makefile.am +++ b/lib/php/test/Makefile.am @@ -41,6 +41,9 @@ check: deps stubs distclean-local: +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + clean-local: $(RM) -r ./Resources/packages $(RM) test-log-junit.xml diff --git a/lib/py/Makefile.am b/lib/py/Makefile.am index 9b6d33b9acc..b76a7dc5dc8 100644 --- a/lib/py/Makefile.am +++ b/lib/py/Makefile.am @@ -69,6 +69,9 @@ dist-hook: find $(distdir) -type f \( -iname "*.pyc" \) | xargs rm -f find $(distdir) -type d \( -iname "__pycache__" -or -iname "_trial_temp" \) | xargs rm -rf +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ CMakeLists.txt \ MANIFEST.in \ diff --git a/lib/rb/Makefile.am b/lib/rb/Makefile.am index 1841065f5a3..ab5d903fe2a 100644 --- a/lib/rb/Makefile.am +++ b/lib/rb/Makefile.am @@ -42,6 +42,9 @@ endif dist-hook: $(RM) -r $(distdir)/spec/gen-rb/ +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ coding_standards.md \ Rakefile \ diff --git a/lib/rs/Makefile.am b/lib/rs/Makefile.am index 7a9b30a4feb..3a134034d50 100644 --- a/lib/rs/Makefile.am +++ b/lib/rs/Makefile.am @@ -45,6 +45,9 @@ clean-local: $(CARGO) clean -$(RM) Cargo.lock +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ src \ Cargo.toml \ diff --git a/lib/rs/test/Makefile.am b/lib/rs/test/Makefile.am index 017a2c4672f..73fe156cc5f 100644 --- a/lib/rs/test/Makefile.am +++ b/lib/rs/test/Makefile.am @@ -47,6 +47,9 @@ clean-local: -$(RM) src/identifiers.rs -$(RM) -r bin +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ Cargo.toml \ thrifts/Base_One.thrift \ diff --git a/lib/rs/test_recursive/Makefile.am b/lib/rs/test_recursive/Makefile.am index e676ccdca10..ec7d4fc413b 100644 --- a/lib/rs/test_recursive/Makefile.am +++ b/lib/rs/test_recursive/Makefile.am @@ -29,5 +29,8 @@ clean-local: $(CARGO) clean -$(RM) Cargo.lock +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ Cargo.toml diff --git a/lib/rs/test_recursive/src/Makefile.am b/lib/rs/test_recursive/src/Makefile.am index 4bfd557d00c..eeb81abc7ad 100644 --- a/lib/rs/test_recursive/src/Makefile.am +++ b/lib/rs/test_recursive/src/Makefile.am @@ -29,6 +29,9 @@ check: stubs clean-local: -$(RM) vehicles.rs +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ lib.rs \ Vehicles.thrift diff --git a/lib/rs/test_recursive/src/maintenance/Makefile.am b/lib/rs/test_recursive/src/maintenance/Makefile.am index e2526bdc984..a1f0ae8f228 100644 --- a/lib/rs/test_recursive/src/maintenance/Makefile.am +++ b/lib/rs/test_recursive/src/maintenance/Makefile.am @@ -29,6 +29,9 @@ check: stubs clean-local: -$(RM) maintenance_facility.rs +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ mod.rs \ MaintenanceFacility.thrift diff --git a/lib/rs/test_recursive/src/transit/Makefile.am b/lib/rs/test_recursive/src/transit/Makefile.am index 908becb25bf..217227a0e5d 100644 --- a/lib/rs/test_recursive/src/transit/Makefile.am +++ b/lib/rs/test_recursive/src/transit/Makefile.am @@ -34,6 +34,9 @@ clean-local: -$(RM) trains.rs -$(RM) transporters.rs +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ mod.rs \ Buses.thrift \ diff --git a/lib/rs/test_recursive/src/transit/light/Makefile.am b/lib/rs/test_recursive/src/transit/light/Makefile.am index 88fd5310c37..b0e3c76a32d 100644 --- a/lib/rs/test_recursive/src/transit/light/Makefile.am +++ b/lib/rs/test_recursive/src/transit/light/Makefile.am @@ -31,6 +31,9 @@ clean-local: -$(RM) light_rail.rs -$(RM) streetcars.rs +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ mod.rs \ LightRail.thrift \ diff --git a/lib/rs/test_recursive/src/transit/services/Makefile.am b/lib/rs/test_recursive/src/transit/services/Makefile.am index 12e9e293515..a141c6dd558 100644 --- a/lib/rs/test_recursive/src/transit/services/Makefile.am +++ b/lib/rs/test_recursive/src/transit/services/Makefile.am @@ -29,6 +29,9 @@ check: stubs clean-local: -$(RM) city_services.rs +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ mod.rs \ CityServices.thrift diff --git a/lib/swift/Makefile.am b/lib/swift/Makefile.am index 6a6644ac01b..ac61716d6dc 100644 --- a/lib/swift/Makefile.am +++ b/lib/swift/Makefile.am @@ -35,6 +35,9 @@ precross: check-local: swift test +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ Package.swift \ Sources \ diff --git a/lib/ts/Makefile.am b/lib/ts/Makefile.am index 62ea2069f16..05d71e4d364 100644 --- a/lib/ts/Makefile.am +++ b/lib/ts/Makefile.am @@ -48,6 +48,9 @@ dist-hook: $(RM) -r $(distdir)/test/build/ $(RM) -r $(distdir)/test/gen-*/ +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ coding_standards.md \ Gruntfile.js \ diff --git a/lib/xml/Makefile.am b/lib/xml/Makefile.am index bcad6bdd5af..6a1503a744f 100644 --- a/lib/xml/Makefile.am +++ b/lib/xml/Makefile.am @@ -24,6 +24,9 @@ if WITH_JAVA SUBDIRS += test endif +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ thrift-idl.xsd \ test diff --git a/lib/xml/test/Makefile.am b/lib/xml/test/Makefile.am index bb87a52038f..16bcfae383f 100644 --- a/lib/xml/test/Makefile.am +++ b/lib/xml/test/Makefile.am @@ -20,6 +20,9 @@ check: $(ANT) $(ANT_FLAGS) test +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + # Make sure this doesn't fail if ant is not configured. clean-local: ANT=$(ANT) ; if test -z "$$ANT" ; then ANT=: ; fi ; \ diff --git a/test/Makefile.am b/test/Makefile.am index d3d0075266a..bc0cd633412 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -120,6 +120,9 @@ dist-hook: find $(distdir) -type d -name "__pycache__" | xargs rm -rf find $(distdir) -type f -name "*.pyc" | xargs rm -f +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ audit \ c_glib \ diff --git a/test/c_glib/Makefile.am b/test/c_glib/Makefile.am index f55a977d4ed..44714253ed9 100644 --- a/test/c_glib/Makefile.am +++ b/test/c_glib/Makefile.am @@ -78,5 +78,8 @@ dist-hook: $(RM) $(distdir)/libtestcglib.la find $(distdir) -type f -iname "*.o" | xargs rm -f +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ src diff --git a/test/cl/Makefile.am b/test/cl/Makefile.am index b5e72bcbbb9..c9705f15740 100755 --- a/test/cl/Makefile.am +++ b/test/cl/Makefile.am @@ -35,6 +35,9 @@ clean-local: $(RM) TestServer $(RM) TestClient +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ implementation.lisp \ make-test-client.lisp \ diff --git a/test/cpp/Makefile.am b/test/cpp/Makefile.am index 9e8b6765b45..595f7a4fc73 100644 --- a/test/cpp/Makefile.am +++ b/test/cpp/Makefile.am @@ -116,6 +116,9 @@ clean-local: style-local: $(CPPSTYLE_CMD) +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ src/TestClient.cpp \ src/TestServer.cpp \ diff --git a/test/dart/Makefile.am b/test/dart/Makefile.am index 81f2f5b1088..3552668f3d8 100644 --- a/test/dart/Makefile.am +++ b/test/dart/Makefile.am @@ -48,5 +48,8 @@ dist-hook: client: stubs ${DART} test_client/bin/main.dart +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ test_client diff --git a/test/erl/Makefile.am b/test/erl/Makefile.am index 5bc90fa8814..665cb7ba051 100644 --- a/test/erl/Makefile.am +++ b/test/erl/Makefile.am @@ -40,6 +40,9 @@ clean: $(RM) -r .rebar/ $(RM) -r src/gen-erl/ +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + dist-hook: $(RM) $(distdir)/.generated $(RM) -r $(distdir)/.rebar/ diff --git a/test/features/Makefile.am b/test/features/Makefile.am index 337d78950ef..4ee56f016fb 100644 --- a/test/features/Makefile.am +++ b/test/features/Makefile.am @@ -14,6 +14,9 @@ # under the License. # +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ local_thrift \ index.html \ diff --git a/test/go/Makefile.am b/test/go/Makefile.am index 92ddc93c955..a00fc379431 100644 --- a/test/go/Makefile.am +++ b/test/go/Makefile.am @@ -60,6 +60,9 @@ check: gopath genmock genmock: gopath sh genmock.sh +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ src/bin \ src/common \ diff --git a/test/haxe/Makefile.am b/test/haxe/Makefile.am index d37aaa77aca..6274f29bf4e 100644 --- a/test/haxe/Makefile.am +++ b/test/haxe/Makefile.am @@ -84,6 +84,9 @@ check_php_web: $(BIN_PHP_WEB) $(BIN_CPP) sleep 10 +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ src \ cpp.hxml \ diff --git a/test/lua/Makefile.am b/test/lua/Makefile.am index a3ab3e26ad3..00bdf3d2bfb 100644 --- a/test/lua/Makefile.am +++ b/test/lua/Makefile.am @@ -30,5 +30,8 @@ precross: stubs clean-local: $(RM) -r gen-lua/ +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + dist-hook: $(RM) -r $(distdir)/gen-lua/ diff --git a/test/netstd/Makefile.am b/test/netstd/Makefile.am index 9712fc2a431..bd06cd4b496 100644 --- a/test/netstd/Makefile.am +++ b/test/netstd/Makefile.am @@ -32,6 +32,9 @@ clean-local: $(RM) -r Server/obj $(RM) -r ThriftTest/ThriftTest +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ Client \ README.md \ diff --git a/test/perl/Makefile.am b/test/perl/Makefile.am index 589fe624bf5..0064a6e7355 100644 --- a/test/perl/Makefile.am +++ b/test/perl/Makefile.am @@ -27,5 +27,8 @@ check: stubs clean-local: $(RM) -r gen-perl/ +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + dist-hook: $(RM) -r $(distdir)/gen-perl/ diff --git a/test/php/Makefile.am b/test/php/Makefile.am index b1ac68683ca..1cffdd4f503 100644 --- a/test/php/Makefile.am +++ b/test/php/Makefile.am @@ -37,6 +37,9 @@ clean-local: $(RM) -r gen-*/ $(RM) -r php_ext_dir +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + dist-hook: $(RM) -r $(distdir)/gen-*/ $(RM) -r $(distdir)/php_ext_dir/ diff --git a/test/py.tornado/Makefile.am b/test/py.tornado/Makefile.am index 3b78793f772..214ded2067d 100644 --- a/test/py.tornado/Makefile.am +++ b/test/py.tornado/Makefile.am @@ -32,6 +32,9 @@ clean-local: find . -type d \( -iname "__pycache__" -or -iname "_trial_temp" \) | xargs rm -rf $(RM) -r gen-py*/ +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + dist-hook: find $(distdir) -type f \( -iname "*.pyc" \) | xargs rm -f find $(distdir) -type d \( -iname "__pycache__" -or -iname "_trial_temp" \) | xargs rm -rf diff --git a/test/py.twisted/Makefile.am b/test/py.twisted/Makefile.am index bd0cdb1a45a..6461d12f13a 100644 --- a/test/py.twisted/Makefile.am +++ b/test/py.twisted/Makefile.am @@ -32,6 +32,9 @@ clean-local: find . -type d \( -iname "__pycache__" -or -iname "_trial_temp" \) | xargs rm -rf $(RM) -r gen-py*/ +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + dist-hook: find $(distdir) -type f \( -iname "*.pyc" \) | xargs rm -f find $(distdir) -type d \( -iname "__pycache__" -or -iname "_trial_temp" \) | xargs rm -rf diff --git a/test/py/Makefile.am b/test/py/Makefile.am index 7c78f17da22..e02607758bd 100644 --- a/test/py/Makefile.am +++ b/test/py/Makefile.am @@ -54,6 +54,8 @@ thrift_gen = \ gen-py-enum/DoubleConstantsTest/__init__.py \ gen-py-enum/Recursive/__init__.py +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am precross: $(thrift_gen) BUILT_SOURCES = $(thrift_gen) diff --git a/test/rb/Makefile.am b/test/rb/Makefile.am index 5dd75594618..9c5d557fd0d 100644 --- a/test/rb/Makefile.am +++ b/test/rb/Makefile.am @@ -33,5 +33,8 @@ endif clean-local: $(RM) -r gen-rb/ +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + dist-hook: $(RM) -r $(distdir)/gen-rb/ diff --git a/test/rs/Makefile.am b/test/rs/Makefile.am index 78db5ee0c5c..6f5cf932052 100644 --- a/test/rs/Makefile.am +++ b/test/rs/Makefile.am @@ -34,6 +34,9 @@ clean-local: -$(RM) src/thrift_test.rs -$(RM) -r bin +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ Cargo.toml \ src/lib.rs \ diff --git a/test/swift/CrossTests/Makefile.am b/test/swift/CrossTests/Makefile.am index b7d8fbb4902..5b332328af4 100644 --- a/test/swift/CrossTests/Makefile.am +++ b/test/swift/CrossTests/Makefile.am @@ -30,5 +30,8 @@ check: stubs clean-local: $(RM) -r Sources/Common/gen-swift/ +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + dist-hook: $(RM) -r $(distdir)/gen-swift/ diff --git a/test/swift/Makefile.am b/test/swift/Makefile.am index 20c2fe5c912..f81fba8786c 100644 --- a/test/swift/Makefile.am +++ b/test/swift/Makefile.am @@ -19,6 +19,9 @@ SUBDIRS = CrossTests +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + precross: $(MAKE) -C CrossTests precross diff --git a/tutorial/Makefile.am b/tutorial/Makefile.am index 24969d13b62..ab87c95eec3 100644 --- a/tutorial/Makefile.am +++ b/tutorial/Makefile.am @@ -101,6 +101,9 @@ clean-local: endif +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + # Any folders or files not listed above being added to SUBDIR need to be placed here in # EXTRA_DIST to be included in the release EXTRA_DIST = \ diff --git a/tutorial/c_glib/Makefile.am b/tutorial/c_glib/Makefile.am index f37649495f4..253f96261f0 100644 --- a/tutorial/c_glib/Makefile.am +++ b/tutorial/c_glib/Makefile.am @@ -79,6 +79,9 @@ tutorialserver: all tutorialclient: all ./tutorial_client +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ c_glib_server.c \ c_glib_client.c diff --git a/tutorial/cl/Makefile.am b/tutorial/cl/Makefile.am index 70c5e0730a5..aef5840f57a 100755 --- a/tutorial/cl/Makefile.am +++ b/tutorial/cl/Makefile.am @@ -57,6 +57,9 @@ clean-local: -$(RM) TutorialServer -$(RM) TutorialClient +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ tutorial-implementation.lisp \ shared-implementation.lisp \ diff --git a/tutorial/cpp/Makefile.am b/tutorial/cpp/Makefile.am index 77fd6d579cd..d093df3efc0 100644 --- a/tutorial/cpp/Makefile.am +++ b/tutorial/cpp/Makefile.am @@ -78,6 +78,9 @@ tutorialclient: all style-local: $(CPPSTYLE_CMD) +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ CMakeLists.txt \ CppClient.cpp \ diff --git a/tutorial/d/Makefile.am b/tutorial/d/Makefile.am index 358294ce56d..3db3d15513f 100644 --- a/tutorial/d/Makefile.am +++ b/tutorial/d/Makefile.am @@ -47,6 +47,9 @@ clean: $(RM) -r gen-d/ find . -type f -name '*.o' | xargs rm -f +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + dist-hook: $(RM) -f $(distdir)/$(PROGS) $(RM) -r $(distdir)/gen-d/ diff --git a/tutorial/dart/Makefile.am b/tutorial/dart/Makefile.am index 860f292b762..e29e3c57caa 100644 --- a/tutorial/dart/Makefile.am +++ b/tutorial/dart/Makefile.am @@ -66,6 +66,9 @@ tutorialclient: pub-get-gen pub-get-client tutorialconsoleclient: pub-get-console-client ${DART} console_client/bin/main.dart +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ client/web/client.dart \ client/web/index.html \ diff --git a/tutorial/go/Makefile.am b/tutorial/go/Makefile.am index b2f70ce120c..16385b00c34 100644 --- a/tutorial/go/Makefile.am +++ b/tutorial/go/Makefile.am @@ -45,6 +45,9 @@ tutorialsecureclient: all clean-local: $(RM) -r gen-* go-tutorial calculator-remote +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ src/client.go \ src/handler.go \ diff --git a/tutorial/haxe/Makefile.am b/tutorial/haxe/Makefile.am index e6f27134680..d2c84f4c7af 100644 --- a/tutorial/haxe/Makefile.am +++ b/tutorial/haxe/Makefile.am @@ -79,6 +79,9 @@ tutorialclient_http: all clean-local: $(RM) -r gen-haxe bin +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ src \ cpp.hxml \ diff --git a/tutorial/java/Makefile.am b/tutorial/java/Makefile.am index 59e68bab2b1..afad8f557e9 100644 --- a/tutorial/java/Makefile.am +++ b/tutorial/java/Makefile.am @@ -39,6 +39,9 @@ tutorialserver: all tutorialclient: all $(ANT) $(ANT_FLAGS) tutorialclient +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ build.properties \ build.xml \ diff --git a/tutorial/js/Makefile.am b/tutorial/js/Makefile.am index 26a3c836ea7..ac0283f9c84 100644 --- a/tutorial/js/Makefile.am +++ b/tutorial/js/Makefile.am @@ -33,6 +33,9 @@ check-local: all tutorialserver: all $(ANT) $(ANT_FLAGS) tutorialserver +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ build.properties \ build.xml \ diff --git a/tutorial/netstd/Makefile.am b/tutorial/netstd/Makefile.am index f295cc0729b..522601d2e3d 100644 --- a/tutorial/netstd/Makefile.am +++ b/tutorial/netstd/Makefile.am @@ -31,6 +31,9 @@ clean-local: $(RM) -r Interfaces/bin $(RM) -r Interfaces/obj +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ Client \ Interfaces \ diff --git a/tutorial/nodejs/Makefile.am b/tutorial/nodejs/Makefile.am index 1516fec2cce..3798a31cb26 100644 --- a/tutorial/nodejs/Makefile.am +++ b/tutorial/nodejs/Makefile.am @@ -38,6 +38,9 @@ tutorialclient_promise: all clean-local: $(RM) -r gen-* +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ NodeServer.js \ NodeClient.js \ diff --git a/tutorial/perl/Makefile.am b/tutorial/perl/Makefile.am index fe77213bbf3..d28165afcba 100644 --- a/tutorial/perl/Makefile.am +++ b/tutorial/perl/Makefile.am @@ -31,6 +31,9 @@ tutorialclient: all clean-local: $(RM) -r gen-* +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ PerlServer.pl \ PerlClient.pl diff --git a/tutorial/php/Makefile.am b/tutorial/php/Makefile.am index 3d30ad999e6..1d11e05cba8 100644 --- a/tutorial/php/Makefile.am +++ b/tutorial/php/Makefile.am @@ -31,6 +31,9 @@ tutorialclient: all clean-local: $(RM) -r gen-* +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ PhpServer.php \ PhpClient.php \ diff --git a/tutorial/py.tornado/Makefile.am b/tutorial/py.tornado/Makefile.am index 4b73c1e72db..d8996a70826 100644 --- a/tutorial/py.tornado/Makefile.am +++ b/tutorial/py.tornado/Makefile.am @@ -31,6 +31,9 @@ tutorialclient: all clean-local: $(RM) -r gen-* +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ PythonServer.py \ PythonClient.py diff --git a/tutorial/py.twisted/Makefile.am b/tutorial/py.twisted/Makefile.am index 50cd3429d9a..f617d7cff56 100644 --- a/tutorial/py.twisted/Makefile.am +++ b/tutorial/py.twisted/Makefile.am @@ -31,6 +31,9 @@ tutorialclient: all clean-local: $(RM) -r gen-* +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ PythonClient.py \ PythonServer.py \ diff --git a/tutorial/py/Makefile.am b/tutorial/py/Makefile.am index 7db816d3bcf..da59815fe7c 100644 --- a/tutorial/py/Makefile.am +++ b/tutorial/py/Makefile.am @@ -31,6 +31,9 @@ tutorialclient: all clean-local: $(RM) -r gen-* +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ setup.cfg \ PythonServer.py \ diff --git a/tutorial/rb/Makefile.am b/tutorial/rb/Makefile.am index 885cd92318e..3dd4e313328 100644 --- a/tutorial/rb/Makefile.am +++ b/tutorial/rb/Makefile.am @@ -31,6 +31,9 @@ tutorialclient: all clean-local: $(RM) -r gen-* +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ RubyServer.rb \ RubyClient.rb diff --git a/tutorial/rs/Makefile.am b/tutorial/rs/Makefile.am index 13f670794f5..bbdf7cb085a 100644 --- a/tutorial/rs/Makefile.am +++ b/tutorial/rs/Makefile.am @@ -45,6 +45,9 @@ clean-local: -$(RM) src/tutorial.rs -$(RM) -r bin +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + EXTRA_DIST = \ Cargo.toml \ src/lib.rs \ diff --git a/tutorial/swift/Makefile.am b/tutorial/swift/Makefile.am index e8b8b2284cb..bb1e61244c6 100644 --- a/tutorial/swift/Makefile.am +++ b/tutorial/swift/Makefile.am @@ -23,6 +23,9 @@ gen_swift: $(THRIFT) --gen swift -r -o Sources/Common $(top_srcdir)/tutorial/tutorial.thrift +distdir: + $(MAKE) $(AM_MAKEFLAGS) distdir-am + tutorial: gen_swift swift run TutorialRunner From 85ea59366d75b92eb6f42c09406f15071c50b89c Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 2 Apr 2024 14:23:42 +0200 Subject: [PATCH 048/430] Updated ReleaseManagement.md according to THRIFT-5755 changes --- doc/ReleaseManagement.md | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/doc/ReleaseManagement.md b/doc/ReleaseManagement.md index 51ecead5345..7b6f0083a6d 100644 --- a/doc/ReleaseManagement.md +++ b/doc/ReleaseManagement.md @@ -126,12 +126,12 @@ All Apache Thrift releases go through a 72-hour final release candidate voting p THRIFT-123 C++ - Library Drop C++03 [THRIFT-123](https://issues.apache.org/jira/browse/THRIFT-3978) - Drop C++03 ``` - For example, if the row above was row "B" in EXCEL it would look something like: + For example, if the row above was row "1" in EXCEL it would look something like: ```text - =CONCAT("[", B1, "]", + =CONCAT("[", A1, "]", "https://issues.apache.org/jira/browse/", - B1, " - ", B3) + A1, " - ", C1) ``` 1. Create a level 3 section in `CHANGES.md` under the release for each component and copy the items from the RelNote column into the changes file. @@ -148,12 +148,16 @@ All Apache Thrift releases go through a 72-hour final release candidate voting p ~$ git clone -b "release/1.0.0" git@github.com:apache/thrift.git thrift-1.0.0-src ``` - 1. In the clean copy of the release branch, start a docker build container and run `make dist`: - - ```code - ~$ cd thrift-1.0.0-src - ~/thrift-1.0.0-src$ docker run -v $(pwd):/thrift/src:rw \ - -it thrift/thrift-build:ubuntu-bionic /bin/bash + 1. In the clean copy of the release branch, build the container image: + + ```bash + ~$ docker build -t thrift build/docker/ubuntu-jammy + ``` + + 1. Run the container and `make dist`: + + ```bash + ~$ docker run -v $(pwd):/thrift/src -it thrift /bin/bash root@8b4101188aa2:/thrift/src# ./bootstrap.sh && ./configure && make dist ``` From 381d86e71e9f2352bca48af918ca790e5b50889a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 20:39:41 +0800 Subject: [PATCH 049/430] Bump org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 in /lib/kotlin (#2941) Bumps [org.jetbrains.kotlinx:kotlinx-coroutines-jdk8](https://github.com/Kotlin/kotlinx.coroutines) from 1.7.3 to 1.8.0. - [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases) - [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md) - [Commits](https://github.com/Kotlin/kotlinx.coroutines/compare/1.7.3...1.8.0) --- updated-dependencies: - dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- lib/kotlin/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/kotlin/build.gradle.kts b/lib/kotlin/build.gradle.kts index 5c9929bd987..94d39b9bdf0 100644 --- a/lib/kotlin/build.gradle.kts +++ b/lib/kotlin/build.gradle.kts @@ -29,7 +29,7 @@ repositories { dependencies { implementation(platform("org.jetbrains.kotlin:kotlin-bom")) implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.7.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.8.0") implementation("org.apache.thrift:libthrift:INCLUDED") testImplementation(kotlin("test")) } From 1d886ca4afc1a52b03f09a526f0a354722a5621c Mon Sep 17 00:00:00 2001 From: CJCombrink Date: Sat, 23 Mar 2024 21:32:28 +0100 Subject: [PATCH 050/430] THRIFT-5772: UUID support for c++ #2952 Client: cpp Patch: CJCombrink This closes #2952 --- .../src/thrift/generate/t_cpp_generator.cc | 51 +++++++++++------ lib/cpp/CMakeLists.txt | 1 + lib/cpp/Makefile.am | 1 + lib/cpp/libthrift.vcxproj | 1 + lib/cpp/libthrift.vcxproj.filters | 3 + lib/cpp/src/thrift/protocol/TBinaryProtocol.h | 4 ++ .../src/thrift/protocol/TBinaryProtocol.tcc | 25 ++++++++- .../src/thrift/protocol/TDebugProtocol.cpp | 25 +++++++-- lib/cpp/src/thrift/protocol/TDebugProtocol.h | 2 + lib/cpp/src/thrift/protocol/TEnum.h | 7 +-- lib/cpp/src/thrift/protocol/TJSONProtocol.cpp | 24 +++++++- lib/cpp/src/thrift/protocol/TJSONProtocol.h | 4 ++ lib/cpp/src/thrift/protocol/TProtocol.h | 14 +++++ .../src/thrift/protocol/TProtocolDecorator.h | 2 + lib/cpp/src/thrift/protocol/TUuidUtils.cpp | 56 +++++++++++++++++++ lib/cpp/src/thrift/protocol/TUuidUtils.hpp | 45 +++++++++++++++ .../src/thrift/protocol/TVirtualProtocol.h | 8 +++ lib/cpp/test/Benchmark.cpp | 1 + lib/cpp/test/CMakeLists.txt | 4 +- lib/cpp/test/DebugProtoTest.cpp | 21 +++++++ lib/cpp/test/JSONProtoTest.cpp | 21 +++++-- lib/cpp/test/SpecializationTest.cpp | 3 + lib/cpp/test/ToStringTest.cpp | 9 +++ test/cpp/CMakeLists.txt | 2 +- test/cpp/src/TestClient.cpp | 23 +++++++- test/cpp/src/TestServer.cpp | 10 ++++ 26 files changed, 329 insertions(+), 38 deletions(-) create mode 100644 lib/cpp/src/thrift/protocol/TUuidUtils.cpp create mode 100644 lib/cpp/src/thrift/protocol/TUuidUtils.hpp diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc index a085ada0e7b..e21252e8f6e 100644 --- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc @@ -296,7 +296,7 @@ class t_cpp_generator : public t_oop_generator { (ttype->annotations_.find("cpp.customostream") != ttype->annotations_.end()); } - /** + /** * Determine if all fields of t_struct's storage do not throw * Move/Copy Constructors and Assignments applicable for 'noexcept' * Move defaults to 'noexcept' @@ -318,7 +318,7 @@ class t_cpp_generator : public t_oop_generator { /** * Returns the legal program name to use for a file generated by program, if the - * program name contains dots then replace it with underscores, otherwise return the + * program name contains dots then replace it with underscores, otherwise return the * original program name. */ std::string get_legal_program_name(std::string program_name); @@ -981,7 +981,7 @@ bool t_cpp_generator::has_field_with_default_value(t_struct* tstruct) for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_type* t = get_true_type((*m_iter)->get_type()); - if (is_reference(*m_iter) || t->is_string()) { + if (is_reference(*m_iter) || t->is_string() || t->is_uuid()) { t_const_value* cv = (*m_iter)->get_value(); if (cv != nullptr) { return true; @@ -1032,7 +1032,7 @@ void t_cpp_generator::generate_default_constructor(ostream& out, } else if (t->is_enum()) { dval += "static_cast<" + type_name(t) + ">(0)"; } else { - dval += (t->is_string() || is_reference(*m_iter)) ? "" : "0"; + dval += (t->is_string() || is_reference(*m_iter) || t->is_uuid()) ? "" : "0"; } if (!init_ctor) { init_ctor = true; @@ -1127,7 +1127,7 @@ void t_cpp_generator::generate_constructor_helper(ostream& out, has_nonrequired_fields = true; indent(out) << (*f_iter)->get_name() << " = " << maybeMove( - tmp_name + "." + (*f_iter)->get_name(), + tmp_name + "." + (*f_iter)->get_name(), is_move && is_complex_type((*f_iter)->get_type())) << ";" << endl; } @@ -1177,7 +1177,7 @@ void t_cpp_generator::generate_assignment_helper(ostream& out, t_struct* tstruct has_nonrequired_fields = true; indent(out) << (*f_iter)->get_name() << " = " << maybeMove( - tmp_name + "." + (*f_iter)->get_name(), + tmp_name + "." + (*f_iter)->get_name(), is_move && is_complex_type((*f_iter)->get_type())) << ";" << endl; } @@ -1276,7 +1276,7 @@ void t_cpp_generator::generate_struct_declaration(ostream& out, // Move constructor if (gen_moveable_) { - indent(out) << tstruct->get_name() << "(" << tstruct->get_name() << "&&) noexcept;" + indent(out) << tstruct->get_name() << "(" << tstruct->get_name() << "&&) noexcept;" << endl; } @@ -1286,12 +1286,12 @@ void t_cpp_generator::generate_struct_declaration(ostream& out, // Move assignment operator if (gen_moveable_) { - indent(out) << tstruct->get_name() << "& operator=(" << tstruct->get_name() << "&&) noexcept;" + indent(out) << tstruct->get_name() << "& operator=(" << tstruct->get_name() << "&&) noexcept;" << endl; } bool has_default_value = has_field_with_default_value(tstruct); - + // Default constructor std::string clsname_ctor = tstruct->get_name() + "()"; indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept") << ";" << endl; @@ -1732,7 +1732,7 @@ void t_cpp_generator::generate_struct_result_writer(ostream& out, void t_cpp_generator::generate_struct_swap(ostream& out, t_struct* tstruct) { if (tstruct->get_name() == "a" || tstruct->get_name() == "b") { out << indent() << "void swap(" << tstruct->get_name() << " &a1, " << tstruct->get_name() - << " &a2) {" << endl; + << " &a2) {" << endl; } else { out << indent() << "void swap(" << tstruct->get_name() << " &a, " << tstruct->get_name() << " &b) {" << endl; @@ -1763,7 +1763,7 @@ void t_cpp_generator::generate_struct_swap(ostream& out, t_struct* tstruct) { if (has_nonrequired_fields) { if (tstruct->get_name() == "a" || tstruct->get_name() == "b") { - out << indent() << "swap(a1.__isset, a2.__isset);" << endl; + out << indent() << "swap(a1.__isset, a2.__isset);" << endl; } else { out << indent() << "swap(a.__isset, b.__isset);" << endl; } @@ -1942,7 +1942,7 @@ void t_cpp_generator::generate_service(t_service* tservice) { << endl; if (gen_cob_style_) { f_header_ << "#include " << endl // TMemoryBuffer - << "#include " << endl + << "#include " << endl << "namespace apache { namespace thrift { namespace async {" << endl << "class TAsyncChannel;" << endl << "}}}" << endl; } @@ -2578,7 +2578,7 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) f_header_ << ", std::shared_ptr< ::apache::thrift::async::TConcurrentClientSyncInfo> sync"; } f_header_ << ") "; - + if (extends.empty()) { if (style == "Concurrent") { f_header_ << ": sync_(sync)" << endl; @@ -2677,7 +2677,7 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) vector::const_iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_java_doc(f_header_, *f_iter); - indent(f_header_) << function_signature(*f_iter, ifstyle) + indent(f_header_) << function_signature(*f_iter, ifstyle) << " override;" << endl; // TODO(dreiss): Use private inheritance to avoid generating thise in cob-style. if (style == "Concurrent" && !(*f_iter)->is_oneway()) { @@ -3227,7 +3227,7 @@ void ProcessorGenerator::generate_class_definition() { f_header_ << indent() << "virtual " << ret_type_ << "dispatchCall(" << finish_cob_ << "::apache::thrift::protocol::TProtocol* iprot, " << "::apache::thrift::protocol::TProtocol* oprot, " - << "const std::string& fname, int32_t seqid" << call_context_ + << "const std::string& fname, int32_t seqid" << call_context_ << ") override;" << endl; if (generator_->gen_templates_) { f_header_ << indent() << "virtual " << ret_type_ << "dispatchCallTemplated(" << finish_cob_ @@ -4046,6 +4046,9 @@ void t_cpp_generator::generate_deserialize_field(ostream& out, case t_base_type::TYPE_VOID: throw "compiler error: cannot serialize void field in a struct: " + name; break; + case t_base_type::TYPE_UUID: + out << "readUUID(" << name << ");"; + break; case t_base_type::TYPE_STRING: if (type->is_binary()) { out << "readBinary(" << name << ");"; @@ -4072,13 +4075,13 @@ void t_cpp_generator::generate_deserialize_field(ostream& out, out << "readDouble(" << name << ");"; break; default: - throw "compiler error: no C++ reader for base type " + t_base_type::t_base_name(tbase) + name; + throw "compiler error: no C++ reader for base type " + t_base_type::t_base_name(tbase) + " " + name; } out << endl; } else if (type->is_enum()) { string t = tmp("ecast"); out << indent() << "int32_t " << t << ";" << endl << indent() << "xfer += iprot->readI32(" << t - << ");" << endl << indent() << name << " = static_cast<" + << ");" << endl << indent() << name << " = static_cast<" << type_name(type) << ">(" << t << ");" << endl; } else { printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", @@ -4254,6 +4257,9 @@ void t_cpp_generator::generate_serialize_field(ostream& out, case t_base_type::TYPE_VOID: throw "compiler error: cannot serialize void field in a struct: " + name; break; + case t_base_type::TYPE_UUID: + out << "writeUUID(" << name << ");"; + break; case t_base_type::TYPE_STRING: if (type->is_binary()) { out << "writeBinary(" << name << ");"; @@ -4281,7 +4287,7 @@ void t_cpp_generator::generate_serialize_field(ostream& out, break; default: throw "compiler error: no C++ writer for base type " + t_base_type::t_base_name(tbase) - + name; + + " " + name; } } else if (type->is_enum()) { out << "writeI32(static_cast(" << name << "));"; @@ -4568,6 +4574,9 @@ string t_cpp_generator::base_type_name(t_base_type::t_base tbase) { return "int64_t"; case t_base_type::TYPE_DOUBLE: return "double"; + case t_base_type::TYPE_UUID: + // TODO: discuss possibility of a class TUuid; + return "std::string"; default: throw "compiler error: no C++ base type name for base type " + t_base_type::t_base_name(tbase); } @@ -4609,6 +4618,9 @@ string t_cpp_generator::declare_field(t_field* tfield, case t_base_type::TYPE_VOID: case t_base_type::TYPE_STRING: break; + case t_base_type::TYPE_UUID: + result += " = std::string(\"00000000-0000-0000-0000-000000000000\")"; + break; case t_base_type::TYPE_BOOL: result += " = false"; break; @@ -4735,6 +4747,8 @@ string t_cpp_generator::type_to_enum(t_type* type) { return "::apache::thrift::protocol::T_I64"; case t_base_type::TYPE_DOUBLE: return "::apache::thrift::protocol::T_DOUBLE"; + case t_base_type::TYPE_UUID: + return "::apache::thrift::protocol::T_UUID"; default: break; } @@ -4776,6 +4790,7 @@ bool t_cpp_generator::is_struct_storage_not_throwing(t_struct* tstruct) const { continue; case t_base_type::TYPE_VOID: case t_base_type::TYPE_STRING: + case t_base_type::TYPE_UUID: default: return false; } diff --git a/lib/cpp/CMakeLists.txt b/lib/cpp/CMakeLists.txt index 6a66e5ad1a7..c2f15dd5728 100644 --- a/lib/cpp/CMakeLists.txt +++ b/lib/cpp/CMakeLists.txt @@ -43,6 +43,7 @@ set(thriftcpp_SOURCES src/thrift/protocol/TJSONProtocol.cpp src/thrift/protocol/TMultiplexedProtocol.cpp src/thrift/protocol/TProtocol.cpp + src/thrift/protocol/TUuidUtils.cpp src/thrift/transport/TTransportException.cpp src/thrift/transport/TFDTransport.cpp src/thrift/transport/TSimpleFileTransport.cpp diff --git a/lib/cpp/Makefile.am b/lib/cpp/Makefile.am index 2499fdbff6b..12b8d82498d 100644 --- a/lib/cpp/Makefile.am +++ b/lib/cpp/Makefile.am @@ -69,6 +69,7 @@ libthrift_la_SOURCES = src/thrift/TApplicationException.cpp \ src/thrift/protocol/TBase64Utils.cpp \ src/thrift/protocol/TMultiplexedProtocol.cpp \ src/thrift/protocol/TProtocol.cpp \ + src/thrift/protocol/TUuidUtils.cpp \ src/thrift/transport/TTransportException.cpp \ src/thrift/transport/TFDTransport.cpp \ src/thrift/transport/TFileTransport.cpp \ diff --git a/lib/cpp/libthrift.vcxproj b/lib/cpp/libthrift.vcxproj index 0b5e16de7c4..1b413f8ae8e 100644 --- a/lib/cpp/libthrift.vcxproj +++ b/lib/cpp/libthrift.vcxproj @@ -49,6 +49,7 @@ + diff --git a/lib/cpp/libthrift.vcxproj.filters b/lib/cpp/libthrift.vcxproj.filters index 98426fac85b..fb94f608730 100644 --- a/lib/cpp/libthrift.vcxproj.filters +++ b/lib/cpp/libthrift.vcxproj.filters @@ -30,6 +30,9 @@ protocol + + protocol + transport diff --git a/lib/cpp/src/thrift/protocol/TBinaryProtocol.h b/lib/cpp/src/thrift/protocol/TBinaryProtocol.h index 7b829c76833..24e51f75f4d 100644 --- a/lib/cpp/src/thrift/protocol/TBinaryProtocol.h +++ b/lib/cpp/src/thrift/protocol/TBinaryProtocol.h @@ -119,6 +119,8 @@ class TBinaryProtocolT : public TVirtualProtocol +#include #include #include @@ -193,6 +194,20 @@ uint32_t TBinaryProtocolT::writeBinary(const std::string return TBinaryProtocolT::writeString(str); } +template +uint32_t TBinaryProtocolT::writeUUID(const std::string& str) { + std::string out; + const bool encoded = uuid_encode(str, out); + if(!encoded) + throw TProtocolException(TProtocolException::INVALID_DATA); + // This should not happen, but check for now + if(out.size() != 16) + throw TProtocolException(TProtocolException::UNKNOWN); + // TODO: Consider endian swapping, see lib/delphi/src/Thrift.Utils.pas:377 + this->trans_->write((uint8_t*)out.data(), 16); + return 16; +} + /** * Reading functions */ @@ -286,7 +301,7 @@ uint32_t TBinaryProtocolT::readMapBegin(TType& keyType, throw TProtocolException(TProtocolException::SIZE_LIMIT); } size = (uint32_t)sizei; - + TMap map(keyType, valType, size); checkReadBytesAvailable(map); @@ -428,6 +443,14 @@ uint32_t TBinaryProtocolT::readBinary(std::string& str) return TBinaryProtocolT::readString(str); } +template +uint32_t TBinaryProtocolT::readUUID(std::string& str) { + std::string in; + readStringBody(in, 16); + uuid_decode(in, str); + return 16; +} + template template uint32_t TBinaryProtocolT::readStringBody(StrType& str, int32_t size) { diff --git a/lib/cpp/src/thrift/protocol/TDebugProtocol.cpp b/lib/cpp/src/thrift/protocol/TDebugProtocol.cpp index 0e6d4a2aac3..0a2eaeda035 100644 --- a/lib/cpp/src/thrift/protocol/TDebugProtocol.cpp +++ b/lib/cpp/src/thrift/protocol/TDebugProtocol.cpp @@ -18,6 +18,7 @@ */ #include +#include #include #include @@ -70,10 +71,8 @@ string TDebugProtocol::fieldTypeName(TType type) { return "set"; case T_LIST: return "list"; - case T_UTF8: - return "utf8"; - case T_UTF16: - return "utf16"; + case T_UUID: + return "uuid"; default: return "unknown"; } @@ -388,6 +387,24 @@ uint32_t TDebugProtocol::writeBinary(const string& str) { // XXX Hex? return TDebugProtocol::writeString(str); } + +uint32_t TDebugProtocol::writeUUID(const string& str) { + std::string out_raw; + uuid_encode(str, out_raw); + + std::string out_encoded; + uuid_decode(out_raw, out_encoded); + + size_t size = writePlain("{\n"); + indentUp(); + size += writeIndented("[in ] = \"" + str + "\",\n"); + size += writeIndented("[raw] = "); + size += writeString(out_raw); + size += writeIndented("[enc] = \"" + out_encoded + "\"\n"); + indentDown(); + size += writeIndented("}\n"); + return size; +} } } } // apache::thrift::protocol diff --git a/lib/cpp/src/thrift/protocol/TDebugProtocol.h b/lib/cpp/src/thrift/protocol/TDebugProtocol.h index 41bb0d4ec94..af89cc5679d 100644 --- a/lib/cpp/src/thrift/protocol/TDebugProtocol.h +++ b/lib/cpp/src/thrift/protocol/TDebugProtocol.h @@ -110,6 +110,8 @@ class TDebugProtocol : public TVirtualProtocol { uint32_t writeBinary(const std::string& str); + uint32_t writeUUID(const std::string& str); + private: void indentUp(); void indentDown(); diff --git a/lib/cpp/src/thrift/protocol/TEnum.h b/lib/cpp/src/thrift/protocol/TEnum.h index 9636785e327..bbd1247dc19 100644 --- a/lib/cpp/src/thrift/protocol/TEnum.h +++ b/lib/cpp/src/thrift/protocol/TEnum.h @@ -18,7 +18,7 @@ */ #ifndef _THRIFT_ENUM_H_ -#define _THRIFT_ENUM_H_ +#define _THRIFT_ENUM_H_ namespace apache { namespace thrift { @@ -46,8 +46,7 @@ enum TType { T_MAP = 13, T_SET = 14, T_LIST = 15, - T_UTF8 = 16, - T_UTF16 = 17 + T_UUID = 16, }; /** @@ -63,4 +62,4 @@ enum TMessageType { }}} // apache::thrift::protocol -#endif // #define _THRIFT_ENUM_H_ +#endif // #define _THRIFT_ENUM_H_ diff --git a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp index 6e4e8ef0db6..0899f00eefa 100644 --- a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp +++ b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp @@ -18,6 +18,7 @@ */ #include +#include #include @@ -68,6 +69,7 @@ static const std::string kTypeNameString("str"); static const std::string kTypeNameMap("map"); static const std::string kTypeNameList("lst"); static const std::string kTypeNameSet("set"); +static const std::string kTypeNameUuid("uid"); static const std::string& getTypeNameForTypeID(TType typeID) { switch (typeID) { @@ -93,6 +95,8 @@ static const std::string& getTypeNameForTypeID(TType typeID) { return kTypeNameSet; case T_LIST: return kTypeNameList; + case T_UUID: + return kTypeNameUuid; default: throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, "Unrecognized type"); } @@ -140,6 +144,9 @@ static TType getTypeIDForTypeName(const std::string& name) { case 't': result = T_BOOL; break; + case 'u': + result = T_UUID; + break; } } if (result == T_STOP) { @@ -710,6 +717,16 @@ uint32_t TJSONProtocol::writeBinary(const std::string& str) { return writeJSONBase64(str); } +uint32_t TJSONProtocol::writeUUID(const std::string& str) { + std::string out_raw; + uuid_encode(str, out_raw); + + std::string out_encoded; + uuid_decode(out_raw, out_encoded); + + return writeJSONString(out_encoded); +} + /** * Reading functions */ @@ -1106,6 +1123,10 @@ uint32_t TJSONProtocol::readBinary(std::string& str) { return readJSONBase64(str); } +uint32_t TJSONProtocol::readUUID(std::string& str) { + return readJSONString(str); +} + // Return the minimum number of bytes a type will consume on the wire int TJSONProtocol::getMinSerializedSize(TType type) { @@ -1113,7 +1134,7 @@ int TJSONProtocol::getMinSerializedSize(TType type) { case T_STOP: return 0; case T_VOID: return 0; - case T_BOOL: return 1; // written as int + case T_BOOL: return 1; // written as int case T_BYTE: return 1; case T_DOUBLE: return 1; case T_I16: return 1; @@ -1124,6 +1145,7 @@ int TJSONProtocol::getMinSerializedSize(TType type) case T_MAP: return 2; // empty map case T_SET: return 2; // empty set case T_LIST: return 2; // empty list + case T_UUID: return 16; // empty UUID default: throw TProtocolException(TProtocolException::UNKNOWN, "unrecognized type code"); } } diff --git a/lib/cpp/src/thrift/protocol/TJSONProtocol.h b/lib/cpp/src/thrift/protocol/TJSONProtocol.h index d01bdf80141..069a9905f53 100644 --- a/lib/cpp/src/thrift/protocol/TJSONProtocol.h +++ b/lib/cpp/src/thrift/protocol/TJSONProtocol.h @@ -198,6 +198,8 @@ class TJSONProtocol : public TVirtualProtocol { uint32_t writeBinary(const std::string& str); + uint32_t writeUUID(const std::string& str); + /** * Reading functions */ @@ -245,6 +247,8 @@ class TJSONProtocol : public TVirtualProtocol { uint32_t readBinary(std::string& str); + uint32_t readUUID(std::string& str); + int getMinSerializedSize(TType type) override; void checkReadBytesAvailable(TSet& set) override diff --git a/lib/cpp/src/thrift/protocol/TProtocol.h b/lib/cpp/src/thrift/protocol/TProtocol.h index 237c1e56883..d29df1c8d32 100644 --- a/lib/cpp/src/thrift/protocol/TProtocol.h +++ b/lib/cpp/src/thrift/protocol/TProtocol.h @@ -275,6 +275,8 @@ class TProtocol { virtual uint32_t writeBinary_virt(const std::string& str) = 0; + virtual uint32_t writeUUID_virt(const std::string& str) = 0; + uint32_t writeMessageBegin(const std::string& name, const TMessageType messageType, const int32_t seqid) { @@ -382,6 +384,11 @@ class TProtocol { return writeBinary_virt(str); } + uint32_t writeUUID(const std::string& str) { + T_VIRTUAL_CALL(); + return writeUUID_virt(str); + } + /** * Reading functions */ @@ -430,6 +437,8 @@ class TProtocol { virtual uint32_t readBinary_virt(std::string& str) = 0; + virtual uint32_t readUUID_virt(std::string& str) = 0; + uint32_t readMessageBegin(std::string& name, TMessageType& messageType, int32_t& seqid) { T_VIRTUAL_CALL(); return readMessageBegin_virt(name, messageType, seqid); @@ -530,6 +539,11 @@ class TProtocol { return readBinary_virt(str); } + uint32_t readUUID(std::string& str) { + T_VIRTUAL_CALL(); + return readUUID_virt(str); + } + /* * std::vector is specialized for bool, and its elements are individual bits * rather than bools. We need to define a different version of readBool() diff --git a/lib/cpp/src/thrift/protocol/TProtocolDecorator.h b/lib/cpp/src/thrift/protocol/TProtocolDecorator.h index 5258159f149..9eb1566ab75 100644 --- a/lib/cpp/src/thrift/protocol/TProtocolDecorator.h +++ b/lib/cpp/src/thrift/protocol/TProtocolDecorator.h @@ -92,6 +92,7 @@ class TProtocolDecorator : public TProtocol { uint32_t writeDouble_virt(const double dub) override { return protocol->writeDouble(dub); } uint32_t writeString_virt(const std::string& str) override { return protocol->writeString(str); } uint32_t writeBinary_virt(const std::string& str) override { return protocol->writeBinary(str); } + uint32_t writeUUID_virt(const std::string& str) override { return protocol->writeUUID(str); } uint32_t readMessageBegin_virt(std::string& name, TMessageType& messageType, @@ -140,6 +141,7 @@ class TProtocolDecorator : public TProtocol { uint32_t readString_virt(std::string& str) override { return protocol->readString(str); } uint32_t readBinary_virt(std::string& str) override { return protocol->readBinary(str); } + uint32_t readUUID_virt(std::string& str) override { return protocol->readUUID(str); } private: shared_ptr protocol; diff --git a/lib/cpp/src/thrift/protocol/TUuidUtils.cpp b/lib/cpp/src/thrift/protocol/TUuidUtils.cpp new file mode 100644 index 00000000000..e1eab22cb11 --- /dev/null +++ b/lib/cpp/src/thrift/protocol/TUuidUtils.cpp @@ -0,0 +1,56 @@ +/* + * 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 + +#include +#include +#include + +namespace apache { +namespace thrift { +namespace protocol { + +bool uuid_encode(const std::string& in, std::string& out) { + static const boost::uuids::string_generator gen; + static const std::string empty_uuid(boost::uuids::uuid::static_size(), '\0'); + out = empty_uuid; + if (in.empty()) { + return true; + } + try { + const boost::uuids::uuid uuid{gen(in)}; + std::copy(uuid.begin(), uuid.end(), out.begin()); + return true; + } catch (const std::runtime_error&) { + // Invalid string most probably + return false; + } +} + +void uuid_decode(const std::string& in, std::string& out) { + boost::uuids::uuid uuid{}; + const size_t to_copy = std::min(in.size(), uuid.size()); + std::copy(in.begin(), in.begin() + to_copy, uuid.begin()); + out = boost::uuids::to_string(uuid); +} + +} +} +} // apache::thrift::protocol diff --git a/lib/cpp/src/thrift/protocol/TUuidUtils.hpp b/lib/cpp/src/thrift/protocol/TUuidUtils.hpp new file mode 100644 index 00000000000..583147ffd38 --- /dev/null +++ b/lib/cpp/src/thrift/protocol/TUuidUtils.hpp @@ -0,0 +1,45 @@ +/* + * 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 _THRIFT_PROTOCOL_TUUIDUTILS_H_ +#define _THRIFT_PROTOCOL_TUUIDUTILS_H_ + +#include + +namespace apache { +namespace thrift { +namespace protocol { + +// Encode canonical UUID string to a 16 char representation +// Supported formats for in: +// - "hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh" +// - "{hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh}" +// - "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh" +// - "{hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh}" +// Returns false if the string was invalid and the value was not encoded. +bool uuid_encode(const std::string& in, std::string& out); + +// Decode 16 char UUID buffer to 36 characted string +void uuid_decode(const std::string& in, std::string& out); + +} +} +} // apache::thrift::protocol + +#endif // #define _THRIFT_PROTOCOL_TUUIDUTILS_H_ diff --git a/lib/cpp/src/thrift/protocol/TVirtualProtocol.h b/lib/cpp/src/thrift/protocol/TVirtualProtocol.h index b7fe929af20..4698081d241 100644 --- a/lib/cpp/src/thrift/protocol/TVirtualProtocol.h +++ b/lib/cpp/src/thrift/protocol/TVirtualProtocol.h @@ -393,6 +393,10 @@ class TVirtualProtocol : public Super_ { return static_cast(this)->writeBinary(str); } + uint32_t writeUUID_virt(const std::string& str) override { + return static_cast(this)->writeUUID(str); + } + /** * Reading functions */ @@ -471,6 +475,10 @@ class TVirtualProtocol : public Super_ { return static_cast(this)->readBinary(str); } + uint32_t readUUID_virt(std::string& str) override { + return static_cast(this)->readUUID(str); + } + uint32_t skip_virt(TType type) override { return static_cast(this)->skip(type); } /* diff --git a/lib/cpp/test/Benchmark.cpp b/lib/cpp/test/Benchmark.cpp index 56adac0b203..97a531767d0 100644 --- a/lib/cpp/test/Benchmark.cpp +++ b/lib/cpp/test/Benchmark.cpp @@ -66,6 +66,7 @@ int main() { ooe.some_characters = "JSON THIS! \"\1"; ooe.zomg_unicode = "\xd7\n\a\t"; ooe.base64 = "\1\2\3\255"; + ooe.rfc4122_uuid = "{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"; int num = 100000; std::shared_ptr buf(new TMemoryBuffer(num*1000)); diff --git a/lib/cpp/test/CMakeLists.txt b/lib/cpp/test/CMakeLists.txt index 1117cd9f36a..87ed1094cb4 100644 --- a/lib/cpp/test/CMakeLists.txt +++ b/lib/cpp/test/CMakeLists.txt @@ -360,7 +360,7 @@ add_custom_command(OUTPUT gen-cpp/AnnotationTest_constants.cpp ) add_custom_command(OUTPUT gen-cpp/DebugProtoTest_types.cpp gen-cpp/DebugProtoTest_types.h gen-cpp/EmptyService.cpp gen-cpp/EmptyService.h - COMMAND ${THRIFT_COMPILER} --gen cpp ${PROJECT_SOURCE_DIR}/test/v0.16/DebugProtoTest.thrift + COMMAND ${THRIFT_COMPILER} --gen cpp ${PROJECT_SOURCE_DIR}/test/DebugProtoTest.thrift ) add_custom_command(OUTPUT gen-cpp/EnumTest_types.cpp gen-cpp/EnumTest_types.h @@ -384,7 +384,7 @@ add_custom_command(OUTPUT gen-cpp/Service.cpp gen-cpp/StressTest_types.cpp ) add_custom_command(OUTPUT gen-cpp/SecondService.cpp gen-cpp/ThriftTest_constants.cpp gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_types.cpp gen-cpp/ThriftTest_types.h - COMMAND ${THRIFT_COMPILER} --gen cpp ${PROJECT_SOURCE_DIR}/test/v0.16/ThriftTest.thrift + COMMAND ${THRIFT_COMPILER} --gen cpp ${PROJECT_SOURCE_DIR}/test/ThriftTest.thrift ) add_custom_command(OUTPUT gen-cpp/OneWayService.cpp gen-cpp/OneWayTest_types.h gen-cpp/OneWayService.h diff --git a/lib/cpp/test/DebugProtoTest.cpp b/lib/cpp/test/DebugProtoTest.cpp index 060f3547dd7..cc4e5ff9558 100644 --- a/lib/cpp/test/DebugProtoTest.cpp +++ b/lib/cpp/test/DebugProtoTest.cpp @@ -74,6 +74,11 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_1) { " [1] = 2,\n" " [2] = 3,\n" " },\n" + " 15: rfc4122_uuid (uuid) = {\n" + " [in ] = \"\",\n" + " [raw] = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\",\n" + " [enc] = \"00000000-0000-0000-0000-000000000000\"\n" + " }\n" "}"); const std::string result(apache::thrift::ThriftDebugString(*ooe)); @@ -98,6 +103,7 @@ void testCaseSetup_2() { "\xb0\xcf\x81\xe2\x84\x8e\x20\xce\x91\x74\x74" "\xce\xb1\xe2\x85\xbd\xce\xba\xc7\x83\xe2\x80" "\xbc"; + n->my_ooe.rfc4122_uuid = "{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"; n->my_bonk.type = 31337; n->my_bonk.message = "I am a bonk... xor!"; } @@ -141,6 +147,11 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_2) { " [1] = 2,\n" " [2] = 3,\n" " },\n" + " 15: rfc4122_uuid (uuid) = {\n" + " [in ] = \"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}\",\n" + " [raw] = \"^*\\xb1\\x88\\x17&Nu\\xa0O\\x1e\\xd9\\xa6\\xa8\\x9cL\",\n" + " [enc] = \"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c\"\n" + " }\n" " },\n" "}"); const std::string result(apache::thrift::ThriftDebugString(*n)); @@ -228,6 +239,11 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_3) { " [1] = 2,\n" " [2] = 3,\n" " },\n" + " 15: rfc4122_uuid (uuid) = {\n" + " [in ] = \"\",\n" + " [raw] = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\",\n" + " [enc] = \"00000000-0000-0000-0000-000000000000\"\n" + " }\n" " },\n" " [1] = OneOfEach {\n" " 01: im_true (bool) = true,\n" @@ -259,6 +275,11 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_3) { " [1] = 2,\n" " [2] = 3,\n" " },\n" + " 15: rfc4122_uuid (uuid) = {\n" + " [in ] = \"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}\",\n" + " [raw] = \"^*\\xb1\\x88\\x17&Nu\\xa0O\\x1e\\xd9\\xa6\\xa8\\x9cL\",\n" + " [enc] = \"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c\"\n" + " }\n" " },\n" " },\n" " 02: contain (set) = set[3] {\n" diff --git a/lib/cpp/test/JSONProtoTest.cpp b/lib/cpp/test/JSONProtoTest.cpp index 082c8a28b75..fedf99e4821 100644 --- a/lib/cpp/test/JSONProtoTest.cpp +++ b/lib/cpp/test/JSONProtoTest.cpp @@ -48,6 +48,7 @@ void testCaseSetup_1() { ooe->some_characters = "JSON THIS! \"\1"; ooe->zomg_unicode = "\xd7\n\a\t"; ooe->base64 = "\1\2\3\255"; + ooe->rfc4122_uuid = "00000000-0000-0000-0000-000000000000"; } BOOST_AUTO_TEST_CASE(test_json_proto_1) { @@ -59,7 +60,7 @@ BOOST_AUTO_TEST_CASE(test_json_proto_1) { "535897931},\"8\":{\"str\":\"JSON THIS! \\\"\\u0001\"},\"9\":{\"str\":\"\xd7\\" "n\\u0007\\t\"},\"10\":{\"tf\":0},\"11\":{\"str\":\"AQIDrQ\"},\"12\":{\"lst\"" ":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16\",3,1,2,3]},\"14\":{\"lst\":[\"i64" - "\",3,1,2,3]}}"); + "\",3,1,2,3]},\"15\":{\"uid\":\"00000000-0000-0000-0000-000000000000\"}}"); const std::string result(apache::thrift::ThriftJSONString(*ooe)); @@ -84,6 +85,7 @@ void testCaseSetup_2() { "\xb0\xcf\x81\xe2\x84\x8e\x20\xce\x91\x74\x74" "\xce\xb1\xe2\x85\xbd\xce\xba\xc7\x83\xe2\x80" "\xbc"; + n->my_ooe.rfc4122_uuid = "5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"; n->my_bonk.type = 31337; n->my_bonk.message = "I am a bonk... xor!"; } @@ -98,7 +100,8 @@ BOOST_AUTO_TEST_CASE(test_json_proto_2) { "1.6180339887498949},\"8\":{\"str\":\":R (me going \\\"rrrr\\\")\"},\"9\":{" "\"str\":\"ӀⅮΝ Нοⅿоɡгаρℎ Αttαⅽκǃ‼\"},\"10\":{\"tf\":0},\"11\":{\"str\":\"" "AQIDrQ\"},\"12\":{\"lst\":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16\",3,1,2" - ",3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]}}}}" + ",3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]},\"15\":{\"uid\":\"5e2ab188-1726-" + "4e75-a04f-1ed9a6a89c4c\"}}}}" ); const std::string result(apache::thrift::ThriftJSONString(*n)); @@ -162,12 +165,14 @@ BOOST_AUTO_TEST_CASE(test_json_proto_3) { "},\"7\":{\"dbl\":3.1415926535897931},\"8\":{\"str\":\"JSON THIS! \\\"\\u0001" "\"},\"9\":{\"str\":\"\xd7\\n\\u0007\\t\"},\"10\":{\"tf\":0},\"11\":{\"str\":" "\"AQIDrQ\"},\"12\":{\"lst\":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16\",3,1,2" - ",3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]}},{\"1\":{\"tf\":1},\"2\":{\"tf\":0}," + ",3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]},\"15\":{\"uid\":\"00000000-0000-0000" + "-0000-000000000000\"}},{\"1\":{\"tf\":1},\"2\":{\"tf\":0}," "\"3\":{\"i8\":51},\"4\":{\"i16\":16},\"5\":{\"i32\":32},\"6\":{\"i64\":64}," "\"7\":{\"dbl\":1.6180339887498949},\"8\":{\"str\":\":R (me going \\\"rrrr\\\"" ")\"},\"9\":{\"str\":\"ӀⅮΝ Нοⅿоɡгаρℎ Αttαⅽκǃ‼\"},\"10\":{\"tf\":0},\"11\":{" "\"str\":\"AQIDrQ\"},\"12\":{\"lst\":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16" - "\",3,1,2,3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]}}]},\"2\":{\"set\":[\"lst\",3" + "\",3,1,2,3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]},\"15\":{\"uid\":\"5e2ab188-" + "1726-4e75-a04f-1ed9a6a89c4c\"}}]},\"2\":{\"set\":[\"lst\",3" ",[\"str\",0],[\"str\",2,\"and a one\",\"and a two\"],[\"str\",3,\"then a one" ", two\",\"three!\",\"FOUR!!\"]]},\"3\":{\"map\":[\"str\",\"lst\",3,{\"nothin" "g\":[\"rec\",0],\"poe\":[\"rec\",3,{\"1\":{\"i32\":3},\"2\":{\"str\":\"quoth" @@ -192,6 +197,8 @@ BOOST_AUTO_TEST_CASE(test_json_proto_4) { OneOfEach ooe2; ooe2.read(proto.get()); + BOOST_TEST_INFO("written: " << *ooe); + BOOST_TEST_INFO("read : " << ooe2); BOOST_CHECK(*ooe == ooe2); } @@ -205,6 +212,8 @@ BOOST_AUTO_TEST_CASE(test_json_proto_5) { HolyMoley hm2; hm2.read(proto.get()); + BOOST_TEST_INFO("written: " << *hm); + BOOST_TEST_INFO("read : " << hm2); BOOST_CHECK(*hm == hm2); hm2.big[0].a_bite = 0x00; @@ -230,14 +239,14 @@ BOOST_AUTO_TEST_CASE(test_json_proto_6) { ); std::shared_ptr buffer(new TMemoryBuffer()); - std::shared_ptr proto(new TJSONProtocol(buffer)); + std::shared_ptr proto(new TJSONProtocol(buffer)); dub.write(proto.get()); Doubles dub_1; dub_1.read(proto.get()); const std::string result(apache::thrift::ThriftJSONString(dub)); const std::string result_1(apache::thrift::ThriftJSONString(dub_1)); - + BOOST_CHECK_MESSAGE(!expected_result.compare(result), "Expected:\n" << expected_result << "\nGotten:\n" << result); BOOST_CHECK_MESSAGE(!expected_result.compare(result_1), diff --git a/lib/cpp/test/SpecializationTest.cpp b/lib/cpp/test/SpecializationTest.cpp index 008837d319c..097611284a7 100644 --- a/lib/cpp/test/SpecializationTest.cpp +++ b/lib/cpp/test/SpecializationTest.cpp @@ -26,6 +26,7 @@ BOOST_AUTO_TEST_CASE(test_specialization_1) { ooe.some_characters = "JSON THIS! \"\1"; ooe.zomg_unicode = "\xd7\n\a\t"; ooe.base64 = "\1\2\3\255"; + ooe.rfc4122_uuid = "00000000-0000-0000-0000-000000000000"; Nesting n; n.my_ooe = ooe; @@ -89,6 +90,8 @@ BOOST_AUTO_TEST_CASE(test_specialization_1) { OneOfEach ooe2; ooe2.read(proto.get()); + BOOST_TEST_INFO("Write: " << ooe); + BOOST_TEST_INFO("Read : " << ooe2); BOOST_CHECK(ooe == ooe2); hm.write(proto.get()); diff --git a/lib/cpp/test/ToStringTest.cpp b/lib/cpp/test/ToStringTest.cpp index 736b33c0a5b..68c82ad4be1 100644 --- a/lib/cpp/test/ToStringTest.cpp +++ b/lib/cpp/test/ToStringTest.cpp @@ -160,4 +160,13 @@ BOOST_AUTO_TEST_CASE(generated_nested_list_object_to_string) { "ListBonks(bonk=[Bonk(message=a, type=0), Bonk(message=b, type=0)])"); } +BOOST_AUTO_TEST_CASE(generated_uuid_to_string) { + thrift::test::CrazyNesting l; + l.uuid_field = "{4b686716-5f20-4deb-8ce0-9eaf379e8a3d}"; + + BOOST_CHECK_EQUAL(to_string(l), + "CrazyNesting(string_field=, set_field=, list_field=[], binary_field=, " + "uuid_field={4b686716-5f20-4deb-8ce0-9eaf379e8a3d})"); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/test/cpp/CMakeLists.txt b/test/cpp/CMakeLists.txt index f693a273daf..a6c1fd5cf4e 100644 --- a/test/cpp/CMakeLists.txt +++ b/test/cpp/CMakeLists.txt @@ -100,7 +100,7 @@ add_test(NAME SpecificNameTest COMMAND SpecificNameTest) # add_custom_command(OUTPUT gen-cpp/SecondService.cpp gen-cpp/SecondService.h gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest.h gen-cpp/ThriftTest_types.cpp gen-cpp/ThriftTest_constants.cpp - COMMAND ${THRIFT_COMPILER} --gen cpp:templates,cob_style -r ${PROJECT_SOURCE_DIR}/test/v0.16/ThriftTest.thrift + COMMAND ${THRIFT_COMPILER} --gen cpp:templates,cob_style -r ${PROJECT_SOURCE_DIR}/test/ThriftTest.thrift ) add_custom_command(OUTPUT gen-cpp/Service.cpp diff --git a/test/cpp/src/TestClient.cpp b/test/cpp/src/TestClient.cpp index c4146cc5cf5..fd04ed87063 100644 --- a/test/cpp/src/TestClient.cpp +++ b/test/cpp/src/TestClient.cpp @@ -70,7 +70,7 @@ using namespace thrift::test; // template -class TPedanticProtocol : public Proto +class TPedanticProtocol : public Proto { public: TPedanticProtocol(std::shared_ptr& transport) @@ -178,6 +178,18 @@ bool print_eq(T expected, T actual) { return_code |= ERR_BASETYPES; \ } +#define UUID_TEST(func, value, expected) \ + cout << #func "(" << value << ") = "; \ + try { \ + if (!print_eq(expected, testClient.func(value))) \ + return_code |= ERR_BASETYPES; \ + } catch (TTransportException&) { \ + throw; \ + } catch (exception & ex) { \ + cout << "*** FAILED ***" << endl << ex.what() << endl; \ + return_code |= ERR_BASETYPES; \ + } + int binary_test(ThriftTestClient& testClient, string::size_type siz); BOOST_CONSTEXPR_OR_CONST int ERR_BASETYPES = 1; @@ -638,6 +650,15 @@ int main(int argc, char** argv) { if (i > 0) { i *= 2; } else { ++i; } } + /** + * UUID TEST + */ + const std::string expected_uuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}; + UUID_TEST(testUuid, std::string{"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"}, expected_uuid); + UUID_TEST(testUuid, std::string{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}, expected_uuid); + UUID_TEST(testUuid, std::string{"5e2ab18817264e75a04f1ed9a6a89c4c"}, expected_uuid); + UUID_TEST(testUuid, std::string{"{5e2ab18817264e75a04f1ed9a6a89c4c}"}, expected_uuid); + UUID_TEST(testUuid, std::string{}, std::string{"00000000-0000-0000-0000-000000000000"}); /** * STRUCT TEST diff --git a/test/cpp/src/TestServer.cpp b/test/cpp/src/TestServer.cpp index 65317f89c13..6c61f402f8d 100644 --- a/test/cpp/src/TestServer.cpp +++ b/test/cpp/src/TestServer.cpp @@ -132,6 +132,11 @@ class TestHandler : public ThriftTestIf { _return = thing; } + std::string testUuid(const std::string thing) override { + printf("testUuid(\"{%s}\")\n", thing.c_str()); + return thing; + } + void testStruct(Xtruct& out, const Xtruct& thing) override { printf("testStruct({\"%s\", %d, %d, %" PRId64 "})\n", thing.string_thing.c_str(), @@ -442,6 +447,11 @@ class TestHandlerAsync : public ThriftTestCobSvIf { cob(res); } + void testUuid(::std::function cob, const std::string thing) override { + std::string res = _delegate->testUuid(thing); + cob(res); + } + void testStruct(std::function cob, const Xtruct& thing) override { Xtruct res; _delegate->testStruct(res, thing); From 68139d117fdf4d287a78819a5bb4b0f9cab8160c Mon Sep 17 00:00:00 2001 From: Volodymyr Panivko Date: Tue, 19 Mar 2024 23:14:07 +0100 Subject: [PATCH 051/430] [THRIFT-5757] Unit tests for php lib Client: php Patch: Volodymyr Panivko This closes #2951 --- .github/workflows/build.yml | 10 +- lib/php/lib/Protocol/TCompactProtocol.php | 1 + lib/php/lib/Protocol/TJSONProtocol.php | 88 +- lib/php/lib/Protocol/TSimpleJSONProtocol.php | 1 + lib/php/phpunit.xml | 7 +- lib/php/test/Fixtures/Fixtures.php | 192 ---- .../test/Fixtures/TJSONProtocolFixtures.php | 72 -- .../Fixtures/TSimpleJSONProtocolFixtures.php | 65 -- .../BaseValidatorTest.php | 37 +- .../Lib/ClassLoader/ThriftClassLoaderTest.php | 139 +++ .../Lib/Protocol/TJSONProtocolTest.php | 646 +++++++++++ .../Lib/Protocol/TSimpleJSONProtocolTest.php | 319 ++++++ .../Lib/Serializer}/BinarySerializerTest.php | 19 +- .../Lib/Serializer}/JsonSerializeTest.php | 36 +- .../ValidatorOopTest.php} | 17 +- .../{Unit => Integration}/ValidatorTest.php | 15 +- lib/php/test/Makefile.am | 10 +- .../Lib/ClassLoader/ThriftClassLoaderTest.php | 108 -- .../TBinaryProtocolAcceleratedTest.php | 73 ++ .../Unit/Lib/Protocol/TBinaryProtocolTest.php | 1009 +++++++++++++++++ .../Lib/Protocol/TCompactProtocolTest.php | 843 ++++++++++++++ .../Lib/Protocol/TMultiplexedProtocolTest.php | 85 ++ .../Lib/Protocol/TProtocolDecoratorTest.php | 96 ++ .../Lib/Protocol/TSimpleJSONProtocolTest.php | 133 +++ .../Lib/Serializer/TBinarySerializerTest.php | 38 + lib/php/test/Unit/TJSONProtocolTest.php | 514 --------- lib/php/test/Unit/TSimpleJSONProtocolTest.php | 247 ---- lib/php/test/bootstrap.php | 16 + test/php/Client.php | 26 + test/php/Handler.php | 114 ++ test/php/TestServer.php | 87 ++ test/php/test_php.ini | 6 +- test/tests.json | 25 + 33 files changed, 3722 insertions(+), 1372 deletions(-) delete mode 100644 lib/php/test/Fixtures/Fixtures.php delete mode 100644 lib/php/test/Fixtures/TJSONProtocolFixtures.php delete mode 100644 lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php rename lib/php/test/{Unit => Integration}/BaseValidatorTest.php (76%) create mode 100644 lib/php/test/Integration/Lib/ClassLoader/ThriftClassLoaderTest.php create mode 100644 lib/php/test/Integration/Lib/Protocol/TJSONProtocolTest.php create mode 100644 lib/php/test/Integration/Lib/Protocol/TSimpleJSONProtocolTest.php rename lib/php/test/{Unit => Integration/Lib/Serializer}/BinarySerializerTest.php (66%) rename lib/php/test/{Unit => Integration/Lib/Serializer}/JsonSerializeTest.php (71%) rename lib/php/test/{Unit/ValidatorTestOop.php => Integration/ValidatorOopTest.php} (59%) rename lib/php/test/{Unit => Integration}/ValidatorTest.php (62%) create mode 100644 lib/php/test/Unit/Lib/Protocol/TBinaryProtocolAcceleratedTest.php create mode 100644 lib/php/test/Unit/Lib/Protocol/TBinaryProtocolTest.php create mode 100644 lib/php/test/Unit/Lib/Protocol/TCompactProtocolTest.php create mode 100644 lib/php/test/Unit/Lib/Protocol/TMultiplexedProtocolTest.php create mode 100644 lib/php/test/Unit/Lib/Protocol/TProtocolDecoratorTest.php create mode 100644 lib/php/test/Unit/Lib/Protocol/TSimpleJSONProtocolTest.php create mode 100644 lib/php/test/Unit/Lib/Serializer/TBinarySerializerTest.php delete mode 100644 lib/php/test/Unit/TJSONProtocolTest.php delete mode 100644 lib/php/test/Unit/TSimpleJSONProtocolTest.php create mode 100644 lib/php/test/bootstrap.php create mode 100644 test/php/Client.php create mode 100644 test/php/Handler.php create mode 100644 test/php/TestServer.php diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0b29ddb906e..2472029cafa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -120,11 +120,11 @@ jobs: mkdir -p ./lib/php/test/Resources/packages/phpvo mkdir -p ./lib/php/test/Resources/packages/phpjs mkdir -p ./lib/php/test/Resources/packages/phpcm - compiler/cpp/thrift --gen php -r --out ./lib/php/test/Resources/packages/php lib/php/test/Resources/ThriftTest.thrift - compiler/cpp/thrift --gen php:validate -r --out ./lib/php/test/Resources/packages/phpv lib/php/test/Resources/ThriftTest.thrift - compiler/cpp/thrift --gen php:validate,oop -r --out ./lib/php/test/Resources/packages/phpvo lib/php/test/Resources/ThriftTest.thrift - compiler/cpp/thrift --gen php:json -r --out ./lib/php/test/Resources/packages/phpjs lib/php/test/Resources/ThriftTest.thrift - compiler/cpp/thrift --gen php:classmap,server,rest -r --out ./lib/php/test/Resources/packages/phpcm lib/php/test/Resources/ThriftTest.thrift + compiler/cpp/thrift --gen php:nsglobal="Basic" -r --out ./lib/php/test/Resources/packages/php lib/php/test/Resources/ThriftTest.thrift + compiler/cpp/thrift --gen php:validate,nsglobal="Validate" -r --out ./lib/php/test/Resources/packages/phpv lib/php/test/Resources/ThriftTest.thrift + compiler/cpp/thrift --gen php:validate,oop,nsglobal="ValidateOop" -r --out ./lib/php/test/Resources/packages/phpvo lib/php/test/Resources/ThriftTest.thrift + compiler/cpp/thrift --gen php:json,nsglobal="Json" -r --out ./lib/php/test/Resources/packages/phpjs lib/php/test/Resources/ThriftTest.thrift + compiler/cpp/thrift --gen php:classmap,server,rest,nsglobal="Classmap" -r --out ./lib/php/test/Resources/packages/phpcm lib/php/test/Resources/ThriftTest.thrift - name: Run Tests run: vendor/bin/phpunit -c lib/php/phpunit.xml diff --git a/lib/php/lib/Protocol/TCompactProtocol.php b/lib/php/lib/Protocol/TCompactProtocol.php index 1af2a274a24..ebe32e52819 100644 --- a/lib/php/lib/Protocol/TCompactProtocol.php +++ b/lib/php/lib/Protocol/TCompactProtocol.php @@ -154,6 +154,7 @@ public function readVarint(&$result) $shift += 7; } + #unreachable statement return $idx; } diff --git a/lib/php/lib/Protocol/TJSONProtocol.php b/lib/php/lib/Protocol/TJSONProtocol.php index e1412cc3acb..cfd3c8b2b53 100644 --- a/lib/php/lib/Protocol/TJSONProtocol.php +++ b/lib/php/lib/Protocol/TJSONProtocol.php @@ -23,6 +23,7 @@ namespace Thrift\Protocol; +use Thrift\Exception\TException; use Thrift\Type\TType; use Thrift\Exception\TProtocolException; use Thrift\Protocol\JSON\BaseContext; @@ -186,8 +187,6 @@ public function reset() $this->reader_ = new LookaheadReader($this); } - private $tmpbuf_ = array(4); - public function readJSONSyntaxChar($b) { $ch = $this->reader_->read(); @@ -197,68 +196,6 @@ public function readJSONSyntaxChar($b) } } - private function hexVal($s) - { - for ($i = 0; $i < strlen($s); $i++) { - $ch = substr($s, $i, 1); - - if (!($ch >= "a" && $ch <= "f") && !($ch >= "0" && $ch <= "9")) { - throw new TProtocolException("Expected hex character " . $ch, TProtocolException::INVALID_DATA); - } - } - - return hexdec($s); - } - - private function hexChar($val) - { - return dechex($val); - } - - private function hasJSONUnescapedUnicode() - { - if (PHP_MAJOR_VERSION > 5 || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 4)) { - return true; - } - - return false; - } - - private function unescapedUnicode($str) - { - if ($this->hasJSONUnescapedUnicode()) { - return json_encode($str, JSON_UNESCAPED_UNICODE); - } - - $json = json_encode($str); - - /* - * Unescaped character outside the Basic Multilingual Plane - * High surrogate: 0xD800 - 0xDBFF - * Low surrogate: 0xDC00 - 0xDFFF - */ - $json = preg_replace_callback( - '/\\\\u(d[89ab][0-9a-f]{2})\\\\u(d[cdef][0-9a-f]{2})/i', - function ($matches) { - return mb_convert_encoding(pack('H*', $matches[1] . $matches[2]), 'UTF-8', 'UTF-16BE'); - }, - $json - ); - - /* - * Unescaped characters within the Basic Multilingual Plane - */ - $json = preg_replace_callback( - '/\\\\u([0-9a-f]{4})/i', - function ($matches) { - return mb_convert_encoding(pack('H*', $matches[1]), 'UTF-8', 'UTF-16BE'); - }, - $json - ); - - return $json; - } - private function writeJSONString($b) { $this->context_->write(); @@ -267,7 +204,7 @@ private function writeJSONString($b) $this->trans_->write(self::QUOTE); } - $this->trans_->write($this->unescapedUnicode($b)); + $this->trans_->write(json_encode($b, JSON_UNESCAPED_UNICODE)); if (is_numeric($b) && $this->context_->escapeNum()) { $this->trans_->write(self::QUOTE); @@ -297,6 +234,7 @@ private function writeJSONDouble($num) $this->trans_->write(self::QUOTE); } + #TODO add compatibility with NAN and INF $this->trans_->write(json_encode($num)); if ($this->context_->escapeNum()) { @@ -304,14 +242,6 @@ private function writeJSONDouble($num) } } - private function writeJSONBase64($data) - { - $this->context_->write(); - $this->trans_->write(self::QUOTE); - $this->trans_->write(json_encode(base64_encode($data))); - $this->trans_->write(self::QUOTE); - } - private function writeJSONObjectStart() { $this->context_->write(); @@ -481,18 +411,6 @@ private function readJSONDouble() } } - private function readJSONBase64() - { - $arr = $this->readJSONString(false); - $data = base64_decode($arr, true); - - if ($data === false) { - throw new TProtocolException("Invalid base64 data " . $arr, TProtocolException::INVALID_DATA); - } - - return $data; - } - private function readJSONObjectStart() { $this->context_->read(); diff --git a/lib/php/lib/Protocol/TSimpleJSONProtocol.php b/lib/php/lib/Protocol/TSimpleJSONProtocol.php index 1cf1f640745..22f17423bc4 100644 --- a/lib/php/lib/Protocol/TSimpleJSONProtocol.php +++ b/lib/php/lib/Protocol/TSimpleJSONProtocol.php @@ -115,6 +115,7 @@ private function writeJSONDouble($num) $this->trans_->write(self::QUOTE); } + #TODO add compatibility with NAN and INF $this->trans_->write(json_encode((float)$num)); if ($isMapKey) { diff --git a/lib/php/phpunit.xml b/lib/php/phpunit.xml index 2cbea95d345..58e8f5dc2a9 100644 --- a/lib/php/phpunit.xml +++ b/lib/php/phpunit.xml @@ -18,7 +18,7 @@ under the License. --> - + ./test/Unit + + ./test/Integration + diff --git a/lib/php/test/Fixtures/Fixtures.php b/lib/php/test/Fixtures/Fixtures.php deleted file mode 100644 index d48be4061c8..00000000000 --- a/lib/php/test/Fixtures/Fixtures.php +++ /dev/null @@ -1,192 +0,0 @@ -<><"; - - self::$testArgs['testString3'] = - "string that ends in double-backslash \\\\"; - - self::$testArgs['testUnicodeStringWithNonBMP'] = - "สวัสดี/𝒯"; - - self::$testArgs['testDouble'] = 3.1415926535898; - - // TODO: add testBinary() call - - self::$testArgs['testByte'] = 0x01; - - self::$testArgs['testI32'] = pow(2, 30); - - if (PHP_INT_SIZE == 8) { - self::$testArgs['testI64'] = pow(2, 60); - } else { - self::$testArgs['testI64'] = "1152921504606847000"; - } - - self::$testArgs['testStruct'] = - new Xtruct( - array( - 'string_thing' => 'worked', - 'byte_thing' => 0x01, - 'i32_thing' => pow(2, 30), - 'i64_thing' => self::$testArgs['testI64'] - ) - ); - - self::$testArgs['testNestNested'] = - new Xtruct( - array( - 'string_thing' => 'worked', - 'byte_thing' => 0x01, - 'i32_thing' => pow(2, 30), - 'i64_thing' => self::$testArgs['testI64'] - ) - ); - - self::$testArgs['testNest'] = - new Xtruct2( - array( - 'byte_thing' => 0x01, - 'struct_thing' => self::$testArgs['testNestNested'], - 'i32_thing' => pow(2, 15) - ) - ); - - self::$testArgs['testMap'] = - array( - 7 => 77, - 8 => 88, - 9 => 99 - ); - - self::$testArgs['testStringMap'] = - array( - "a" => "123", - "a b" => "with spaces ", - "same" => "same", - "0" => "numeric key", - "longValue" => self::$testArgs['testString1'], - self::$testArgs['testString1'] => "long key" - ); - - self::$testArgs['testSet'] = array(1 => true, 5 => true, 6 => true); - - self::$testArgs['testList'] = array(1, 2, 3); - - self::$testArgs['testEnum'] = Numberz::ONE; - - self::$testArgs['testTypedef'] = 69; - - self::$testArgs['testMapMapExpectedResult'] = - array( - 4 => array( - 1 => 1, - 2 => 2, - 3 => 3, - 4 => 4, - ), - -4 => array( - -4 => -4, - -3 => -3, - -2 => -2, - -1 => -1 - ) - ); - - // testInsanity ... takes a few steps to set up! - - $xtruct1 = - new Xtruct( - array( - 'string_thing' => 'Goodbye4', - 'byte_thing' => 4, - 'i32_thing' => 4, - 'i64_thing' => 4 - ) - ); - - $xtruct2 = - new Xtruct( - array( - 'string_thing' => 'Hello2', - 'byte_thing' => 2, - 'i32_thing' => 2, - 'i64_thing' => 2 - ) - ); - - $userMap = - array( - Numberz::FIVE => 5, - Numberz::EIGHT => 8 - ); - - $insanity2 = - new Insanity( - array( - 'userMap' => $userMap, - 'xtructs' => array($xtruct1, $xtruct2) - ) - ); - - $insanity3 = $insanity2; - - $insanity6 = - new Insanity( - array( - 'userMap' => null, - 'xtructs' => null - ) - ); - - self::$testArgs['testInsanityExpectedResult'] = - array( - "1" => array( - Numberz::TWO => $insanity2, - Numberz::THREE => $insanity3 - ), - "2" => array( - Numberz::SIX => $insanity6 - ) - ); - } -} diff --git a/lib/php/test/Fixtures/TJSONProtocolFixtures.php b/lib/php/test/Fixtures/TJSONProtocolFixtures.php deleted file mode 100644 index 77fb270a796..00000000000 --- a/lib/php/test/Fixtures/TJSONProtocolFixtures.php +++ /dev/null @@ -1,72 +0,0 @@ -<><"}}'; - - self::$testArgsJSON['testString3'] = '{"1":{"str":"string that ends in double-backslash \\\\\\\\"}}'; - - self::$testArgsJSON['testUnicodeStringWithNonBMP'] = '{"1":{"str":"สวัสดี\/𝒯"}}'; - - self::$testArgsJSON['testDouble'] = '{"1":{"dbl":3.1415926535898}}'; - - self::$testArgsJSON['testByte'] = '{"1":{"i8":1}}'; - - self::$testArgsJSON['testI32'] = '{"1":{"i32":1073741824}}'; - - if (PHP_INT_SIZE == 8) { - self::$testArgsJSON['testI64'] = '{"1":{"i64":' . pow(2, 60) . '}}'; - self::$testArgsJSON['testStruct'] = '{"1":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":' . pow(2, 60) . '}}}}'; - self::$testArgsJSON['testNest'] = '{"1":{"rec":{"1":{"i8":1},"2":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":' . pow(2, 60) . '}}},"3":{"i32":32768}}}}'; - } else { - self::$testArgsJSON['testI64'] = '{"1":{"i64":1152921504606847000}}'; - self::$testArgsJSON['testStruct'] = '{"1":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":1152921504606847000}}}}'; - self::$testArgsJSON['testNest'] = '{"1":{"rec":{"1":{"i8":1},"2":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":1152921504606847000}}},"3":{"i32":32768}}}}'; - } - - self::$testArgsJSON['testMap'] = '{"1":{"map":["i32","i32",3,{"7":77,"8":88,"9":99}]}}'; - - self::$testArgsJSON['testStringMap'] = '{"1":{"map":["str","str",6,{"a":"123","a b":"with spaces ","same":"same","0":"numeric key","longValue":"Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e","Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e":"long key"}]}}'; - - self::$testArgsJSON['testSet'] = '{"1":{"set":["i32",3,1,5,6]}}'; - - self::$testArgsJSON['testList'] = '{"1":{"lst":["i32",3,1,2,3]}}'; - - self::$testArgsJSON['testEnum'] = '{"1":{"i32":1}}'; - - self::$testArgsJSON['testTypedef'] = '{"1":{"i64":69}}'; - - self::$testArgsJSON['testMapMap'] = '{"0":{"map":["i32","map",2,{"4":["i32","i32",4,{"1":1,"2":2,"3":3,"4":4}],"-4":["i32","i32",4,{"-4":-4,"-3":-3,"-2":-2,"-1":-1}]}]}}'; - - self::$testArgsJSON['testInsanity'] = '{"0":{"map":["i64","map",2,{"1":["i32","rec",2,{"2":{"1":{"map":["i32","i64",2,{"5":5,"8":8}]},"2":{"lst":["rec",2,{"1":{"str":"Goodbye4"},"4":{"i8":4},"9":{"i32":4},"11":{"i64":4}},{"1":{"str":"Hello2"},"4":{"i8":2},"9":{"i32":2},"11":{"i64":2}}]}},"3":{"1":{"map":["i32","i64",2,{"5":5,"8":8}]},"2":{"lst":["rec",2,{"1":{"str":"Goodbye4"},"4":{"i8":4},"9":{"i32":4},"11":{"i64":4}},{"1":{"str":"Hello2"},"4":{"i8":2},"9":{"i32":2},"11":{"i64":2}}]}}}],"2":["i32","rec",1,{"6":{}}]}]}}'; - } -} diff --git a/lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php b/lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php deleted file mode 100644 index 0281a879b7e..00000000000 --- a/lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php +++ /dev/null @@ -1,65 +0,0 @@ -<><"}'; - - self::$testArgsJSON['testDouble'] = '{"thing":3.1415926535898}'; - - self::$testArgsJSON['testByte'] = '{"thing":1}'; - - self::$testArgsJSON['testI32'] = '{"thing":1073741824}'; - - if (PHP_INT_SIZE == 8) { - self::$testArgsJSON['testI64'] = '{"thing":' . pow(2, 60) . '}'; - self::$testArgsJSON['testStruct'] = '{"thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":' . pow(2, 60) . '}}'; - self::$testArgsJSON['testNest'] = '{"thing":{"byte_thing":1,"struct_thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":' . pow(2, 60) . '},"i32_thing":32768}}'; - } else { - self::$testArgsJSON['testI64'] = '{"thing":1152921504606847000}'; - - self::$testArgsJSON['testStruct'] = '{"thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":1152921504606847000}}'; - self::$testArgsJSON['testNest'] = '{"thing":{"byte_thing":1,"struct_thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":1152921504606847000},"i32_thing":32768}}'; - } - - self::$testArgsJSON['testMap'] = '{"thing":{"7":77,"8":88,"9":99}}'; - - self::$testArgsJSON['testStringMap'] = '{"thing":{"a":"123","a b":"with spaces ","same":"same","0":"numeric key","longValue":"Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e","Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e":"long key"}}'; - - self::$testArgsJSON['testSet'] = '{"thing":[1,5,6]}'; - - self::$testArgsJSON['testList'] = '{"thing":[1,2,3]}'; - - self::$testArgsJSON['testEnum'] = '{"thing":1}'; - - self::$testArgsJSON['testTypedef'] = '{"thing":69}'; - } -} diff --git a/lib/php/test/Unit/BaseValidatorTest.php b/lib/php/test/Integration/BaseValidatorTest.php similarity index 76% rename from lib/php/test/Unit/BaseValidatorTest.php rename to lib/php/test/Integration/BaseValidatorTest.php index 4404e72ce98..ae9d5844d2e 100644 --- a/lib/php/test/Unit/BaseValidatorTest.php +++ b/lib/php/test/Integration/BaseValidatorTest.php @@ -19,7 +19,7 @@ * under the License. */ -namespace Test\Thrift\Unit; +namespace Test\Thrift\Integration; use PHPUnit\Framework\TestCase; use Thrift\Exception\TProtocolException; @@ -28,38 +28,41 @@ abstract class BaseValidatorTest extends TestCase { + abstract public function getNsGlobal(); + public function testEmptyStructValidator() { - $this->assertNoReadValidator('ThriftTest\EmptyStruct'); - $this->assertNoWriteValidator('ThriftTest\EmptyStruct'); + $this->assertNoReadValidator($this->getNsGlobal() . '\ThriftTest\EmptyStruct'); + $this->assertNoWriteValidator($this->getNsGlobal() . '\ThriftTest\EmptyStruct'); } public function testBonkValidator() { - $this->assertNoReadValidator('ThriftTest\Bonk'); - $this->assertHasWriteValidator('ThriftTest\Bonk'); + $this->assertNoReadValidator($this->getNsGlobal() . '\ThriftTest\Bonk'); + $this->assertHasWriteValidator($this->getNsGlobal() . '\ThriftTest\Bonk'); } public function testStructAValidator() { - $this->assertHasReadValidator('ThriftTest\StructA'); - $this->assertHasWriteValidator('ThriftTest\StructA'); + $this->assertHasReadValidator($this->getNsGlobal() . '\ThriftTest\StructA'); + $this->assertHasWriteValidator($this->getNsGlobal() . '\ThriftTest\StructA'); } public function testUnionOfStringsValidator() { - $this->assertNoWriteValidator('TestValidators\UnionOfStrings'); + $this->assertNoWriteValidator($this->getNsGlobal() . '\TestValidators\UnionOfStrings'); } public function testServiceResultValidator() { - $this->assertNoReadValidator('TestValidators\TestService_test_result'); - $this->assertNoWriteValidator('TestValidators\TestService_test_result'); + $this->assertNoReadValidator($this->getNsGlobal() . '\TestValidators\TestService_test_result'); + $this->assertNoWriteValidator($this->getNsGlobal() . '\TestValidators\TestService_test_result'); } public function testReadEmpty() { - $bonk = new \ThriftTest\Bonk(); + $className = $this->getNsGlobal() . '\ThriftTest\Bonk'; + $bonk = new $className(); $transport = new TMemoryBuffer("\000"); $protocol = new TBinaryProtocol($transport); $bonk->read($protocol); @@ -68,7 +71,8 @@ public function testReadEmpty() public function testWriteEmpty() { - $bonk = new \ThriftTest\Bonk(); + $className = $this->getNsGlobal() . '\ThriftTest\Bonk'; + $bonk = new $className(); $transport = new TMemoryBuffer(); $protocol = new TBinaryProtocol($transport); try { @@ -83,7 +87,8 @@ public function testWriteEmpty() public function testWriteWithMissingRequired() { // Check that we are not able to write StructA with a missing required field - $structa = new \ThriftTest\StructA(); + $className = $this->getNsGlobal() . '\ThriftTest\StructA'; + $structa = new $className(); $transport = new TMemoryBuffer(); $protocol = new TBinaryProtocol($transport); @@ -100,7 +105,8 @@ public function testReadStructA() { $transport = new TMemoryBuffer(base64_decode('CwABAAAAA2FiYwA=')); $protocol = new TBinaryProtocol($transport); - $structa = new \ThriftTest\StructA(); + $className = $this->getNsGlobal() . '\ThriftTest\StructA'; + $structa = new $className(); $structa->read($protocol); $this->assertEquals("abc", $structa->s); } @@ -109,7 +115,8 @@ public function testWriteStructA() { $transport = new TMemoryBuffer(); $protocol = new TBinaryProtocol($transport); - $structa = new \ThriftTest\StructA(); + $className = $this->getNsGlobal() . '\ThriftTest\StructA'; + $structa = new $className(); $structa->s = "abc"; $structa->write($protocol); $writeResult = base64_encode($transport->getBuffer()); diff --git a/lib/php/test/Integration/Lib/ClassLoader/ThriftClassLoaderTest.php b/lib/php/test/Integration/Lib/ClassLoader/ThriftClassLoaderTest.php new file mode 100644 index 00000000000..a43f5c68685 --- /dev/null +++ b/lib/php/test/Integration/Lib/ClassLoader/ThriftClassLoaderTest.php @@ -0,0 +1,139 @@ +getFunctionMock('Thrift\ClassLoader', 'apcu_fetch') + ->expects($useApcu ? $this->any() : $this->never()) + ->with($apcuPrefix . $class) + ->willReturn(false); + + $this->getFunctionMock('Thrift\ClassLoader', 'apcu_store') + ->expects($useApcu ? $this->any() : $this->never()) + ->with($apcuPrefix . $class, $this->anything()) + ->willReturn(true); + + $loader = new ThriftClassLoader($useApcu, $apcuPrefix); + foreach ($definitions as $namespace => $paths) { + $loader->registerDefinition($namespace, $paths); + } + $loader->register(); + + $loader->loadClass($class); + if ($checkInterfaceExist) { + $this->assertTrue(interface_exists($class, false), "->loadClass() loads '$class'"); + } else { + $this->assertTrue(class_exists($class, false), "->loadClass() loads '$class'"); + } + } + + public function registerDefinitionDataProvider() + { + yield 'loadType' => [ + 'definitions' => [ + 'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => 'Classmap\ThriftTest\Xtruct', + ]; + yield 'loadInterface' => [ + 'definitions' => [ + 'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => '\Classmap\ThriftTest\ThriftTestIf', + 'checkInterfaceExist' => true, + ]; + yield 'loadClient' => [ + 'definitions' => [ + 'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => '\Classmap\ThriftTest\ThriftTestClient', + ]; + yield 'loadProcessor' => [ + 'definitions' => [ + 'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => '\Classmap\ThriftTest\ThriftTestProcessor', + ]; + yield 'loadRest' => [ + 'definitions' => [ + 'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => '\Classmap\ThriftTest\ThriftTestRest', + ]; + yield 'load_args' => [ + 'definitions' => [ + 'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => '\Classmap\ThriftTest\ThriftTest_testVoid_args', + ]; + yield 'load_result' => [ + 'definitions' => [ + 'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm', + ], + 'class' => '\Classmap\ThriftTest\ThriftTest_testVoid_result', + ]; + yield 'pathAsArray' => [ + 'definitions' => [ + 'Classmap' => [__DIR__ . '/../../../Resources/packages/phpcm'], + ], + 'class' => 'Classmap\ThriftTest\Xtruct', + ]; + yield 'severalDefinitions' => [ + 'definitions' => [ + 'Classmap\ThriftTest' => [__DIR__ . '/../../../Resources/packages/phpcm'], + 'Classmap\TestValidators' => [__DIR__ . '/../../../Resources/packages/phpcm'], + ], + 'class' => '\Classmap\TestValidators\TestServiceClient', + ]; + yield 'useApcu' => [ + 'definitions' => [ + 'Classmap\ThriftTest' => [__DIR__ . '/../../../Resources/packages/phpcm'], + 'Classmap\TestValidators' => [__DIR__ . '/../../../Resources/packages/phpcm'], + ], + 'class' => '\Classmap\TestValidators\TestServiceClient', + 'checkInterfaceExist' => false, + 'useApcu' => true, + 'apcuPrefix' => 'APCU_PREFIX', + ]; + } +} diff --git a/lib/php/test/Integration/Lib/Protocol/TJSONProtocolTest.php b/lib/php/test/Integration/Lib/Protocol/TJSONProtocolTest.php new file mode 100644 index 00000000000..515cbdb3419 --- /dev/null +++ b/lib/php/test/Integration/Lib/Protocol/TJSONProtocolTest.php @@ -0,0 +1,646 @@ +transport = new TMemoryBuffer(); + $this->protocol = new TJSONProtocol($this->transport); + $this->transport->open(); + } + + public function testMessageReadWrite() + { + $input = new TJSONProtocol(new TMemoryBuffer('[1,"testString",1,0,{"0":{"str":"successResponse"}}]')); + $service = new \Basic\ThriftTest\ThriftTestClient($input, $this->protocol); + $result = $service->testString('test'); + $this->assertSame('successResponse', $result); + } + + /** + * @dataProvider writeDataProvider + */ + public function testWrite( + $argsClassName, + $argsValues, + $expected + ) { + $args = new $argsClassName($argsValues); + $args->write($this->protocol); + + $actual = $this->transport->read(self::BUFFER_SIZE); + + $this->assertEquals($expected, $actual); + } + + public function writeDataProvider() + { + if (!is_dir(__DIR__ . '/../../../Resources/packages/php')) { + throw new \RuntimeException( + 'Before running Integration test suite, you must run the Thrift compiler against the ThriftTest.thrift file in the ./Resources directory.' + ); + } + + yield 'void' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testVoid_args::class, + 'argsValues' => [], + 'expected' => '{}', + ]; + yield 'bool true' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testBool_args::class, + 'argsValues' => [ + 'thing' => true, + ], + 'expected' => '{"1":{"tf":1}}', + ]; + yield 'bool false' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testBool_args::class, + 'argsValues' => [ + 'thing' => false, + ], + 'expected' => '{"1":{"tf":0}}', + ]; + yield 'string1' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class, + 'argsValues' => [ + 'thing' => "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語", + ], + 'expected' => '{"1":{"str":"Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ \/ ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe\'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски \/ Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча\/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語"}}', + ]; + yield 'string2' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class, + 'argsValues' => [ + 'thing' => "quote: \\\" backslash:" . + " forwardslash-escaped: \\/ " . + " backspace: \b formfeed: \f newline: \n return: \r tab: " . + " now-all-of-them-together: \"\\\/\b\n\r\t" . + " now-a-bunch-of-junk: !@#\$%&()(&%$#{}{}<><><", + ], + 'expected' => '{"1":{"str":"quote: \\\\\" backslash: forwardslash-escaped: \\\\\/ backspace: \\\\b formfeed: \f newline: \n return: \r tab: now-all-of-them-together: \"\\\\\\\\\/\\\\b\n\r\t now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><"}}', + ]; + yield 'string3' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class, + 'argsValues' => [ + 'thing' => "string that ends in double-backslash \\\\", + ], + 'expected' => '{"1":{"str":"string that ends in double-backslash \\\\\\\\"}}', + ]; + yield 'string4 testUnicodeStringWithNonBMP' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class, + 'argsValues' => [ + 'thing' => "สวัสดี/𝒯", + ], + 'expected' => '{"1":{"str":"สวัสดี\/𝒯"}}', + ]; + yield 'double' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class, + 'argsValues' => [ + 'thing' => 3.1415926535898, + ], + 'expected' => '{"1":{"dbl":3.1415926535898}}', + ]; + #TODO Should be fixed in future + yield 'double Nan' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class, + 'argsValues' => [ + 'thing' => NAN, + ], + 'expected' => '{"1":{"dbl":}}', + ]; + #TODO Should be fixed in future + yield 'double Infinity' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class, + 'argsValues' => [ + 'thing' => INF, + ], + 'expected' => '{"1":{"dbl":}}', + ]; + yield 'byte' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testByte_args::class, + 'argsValues' => [ + 'thing' => 0x01, + ], + 'expected' => '{"1":{"i8":1}}', + ]; + yield 'i32' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testI32_args::class, + 'argsValues' => [ + 'thing' => pow(2, 30), + ], + 'expected' => '{"1":{"i32":1073741824}}', + ]; + if (PHP_INT_SIZE == 8) { + yield 'i64_64Architecture' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testI64_args::class, + 'argsValues' => [ + 'thing' => pow(2, 60), + ], + 'expected' => '{"1":{"i64":' . pow(2, 60) . '}}', + ]; + yield 'struct_64Architecture' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testStruct_args::class, + 'argsValues' => [ + 'thing' => new Xtruct( + [ + 'string_thing' => 'worked', + 'byte_thing' => 0x01, + 'i32_thing' => pow(2, 30), + 'i64_thing' => pow(2, 60), + ] + ), + ], + 'expected' => '{"1":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":' . pow(2, 60) . '}}}}', + ]; + yield 'nest_64Architecture' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testNest_args::class, + 'argsValues' => [ + 'thing' => new Xtruct2( + [ + 'byte_thing' => 0x01, + 'struct_thing' => new Xtruct( + [ + 'string_thing' => 'worked', + 'byte_thing' => 0x01, + 'i32_thing' => pow(2, 30), + 'i64_thing' => pow(2, 60), + ] + ), + 'i32_thing' => pow(2, 15), + ] + ), + ], + 'expected' => '{"1":{"rec":{"1":{"i8":1},"2":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":' . pow(2, 60) . '}}},"3":{"i32":32768}}}}', + ]; + } else { + yield 'i64_32Architecture' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testI64_args::class, + 'argsValues' => [ + 'thing' => "1152921504606847000", + ], + 'expected' => '{"1":{"i64":1152921504606847000}}', + ]; + yield 'struct_32Architecture' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testStruct_args::class, + 'argsValues' => [ + 'thing' => new Xtruct( + [ + 'string_thing' => 'worked', + 'byte_thing' => 0x01, + 'i32_thing' => pow(2, 30), + 'i64_thing' => pow(2, 60), + ] + ), + ], + 'expected' => '{"1":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":1152921504606847000}}}}', + ]; + yield 'nest_32Architecture' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testNest_args::class, + 'argsValues' => [ + 'thing' => new Xtruct2( + [ + 'byte_thing' => 0x01, + 'struct_thing' => new Xtruct( + [ + 'string_thing' => 'worked', + 'byte_thing' => 0x01, + 'i32_thing' => pow(2, 30), + 'i64_thing' => '1152921504606847000', + ] + ), + 'i32_thing' => pow(2, 15), + ] + ), + ], + 'expected' => '{"1":{"rec":{"1":{"i8":1},"2":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":1152921504606847000}}},"3":{"i32":32768}}}}', + ]; + } + yield 'map' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testMap_args::class, + 'argsValues' => [ + 'thing' => [ + 7 => 77, + 8 => 88, + 9 => 99, + ], + ], + 'expected' => '{"1":{"map":["i32","i32",3,{"7":77,"8":88,"9":99}]}}', + ]; + yield 'stringMap' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testStringMap_args::class, + 'argsValues' => [ + 'thing' => [ + "a" => "123", + "a b" => "with spaces ", + "same" => "same", + "0" => "numeric key", + "longValue" => "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語", + "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語" => "long key", + ], + ], + 'expected' => '{"1":{"map":["str","str",6,{"a":"123","a b":"with spaces ","same":"same","0":"numeric key","longValue":"Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ \/ ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe\'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски \/ Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча\/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語","Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ \/ ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe\'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски \/ Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча\/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語":"long key"}]}}', + ]; + yield 'set' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testSet_args::class, + 'argsValues' => [ + 'thing' => [1 => true, 5 => true, 6 => true], + ], + 'expected' => '{"1":{"set":["i32",3,1,5,6]}}', + ]; + yield 'list' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testList_args::class, + 'argsValues' => [ + 'thing' => [1, 2, 3], + ], + 'expected' => '{"1":{"lst":["i32",3,1,2,3]}}', + ]; + yield 'enum' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testEnum_args::class, + 'argsValues' => [ + 'thing' => \Basic\ThriftTest\Numberz::SIX, + ], + 'expected' => '{"1":{"i32":6}}', + ]; + yield 'typedef' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testTypedef_args::class, + 'argsValues' => [ + 'thing' => 69, + ], + 'expected' => '{"1":{"i64":69}}', + ]; + } + + /** + * @dataProvider readDataProvider + */ + public function testRead( + $buffer, + $argsClassName, + $argsPropertyName, + $expectedValue, + $expectedResult + ): void { + $this->transport->write($buffer); + $args = new $argsClassName(); + $result = $args->read($this->protocol); + + $this->assertEquals($expectedResult, $result); + + if (is_null($argsPropertyName)) { + $this->assertNull($argsPropertyName); + } elseif (is_float($expectedValue) && is_nan($expectedValue)) { + $this->assertNan($args->{$argsPropertyName}); + } elseif (is_float($expectedValue) && is_infinite($expectedValue)) { + $this->assertEquals($expectedValue, $args->{$argsPropertyName}); + } else { + $this->assertEquals($expectedValue, $args->{$argsPropertyName}); + } + } + + public function readDataProvider() + { + yield 'void' => [ + 'buffer' => '{}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testVoid_args::class, + 'argsPropertyName' => null, + 'expectedValue' => null, + 'expectedResult' => 0, + ]; + yield 'bool true' => [ + 'buffer' => '{"1":{"tf":1}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testBool_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => true, + 'expectedResult' => 1, + ]; + yield 'bool false' => [ + 'buffer' => '{"1":{"tf":0}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testBool_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => false, + 'expectedResult' => 1, + ]; + yield 'string1' => [ + 'buffer' => '{"1":{"str":"Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ \/ ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe\'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски \/ Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча\/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語"}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語", + 'expectedResult' => 1, + ]; + yield 'string2' => [ + 'buffer' => '{"1":{"str":"quote: \\\\\" backslash: forwardslash-escaped: \\\\\/ backspace: \\\\b formfeed: \f newline: \n return: \r tab: now-all-of-them-together: \"\\\\\\\\\/\\\\b\n\r\t now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><"}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => "quote: \\\" backslash:" . + " forwardslash-escaped: \\/ " . + " backspace: \b formfeed: \f newline: \n return: \r tab: " . + " now-all-of-them-together: \"\\\/\b\n\r\t" . + " now-a-bunch-of-junk: !@#\$%&()(&%$#{}{}<><><", + 'expectedResult' => 1, + ]; + yield 'string3' => [ + 'buffer' => '{"1":{"str":"string that ends in double-backslash \\\\\\\\"}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => "string that ends in double-backslash \\\\", + 'expectedResult' => 1, + ]; + yield 'string4' => [ + 'buffer' => '{"1":{"str":"สวัสดี\/𝒯"}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => "สวัสดี/𝒯", + 'expectedResult' => 1, + ]; + yield 'double' => [ + 'buffer' => '{"1":{"dbl":3.1415926535898}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => 3.1415926535898, + 'expectedResult' => 1, + ]; + yield 'double Nan' => [ + 'buffer' => '{"1":{"dbl":"NaN"}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => NAN, + 'expectedResult' => 1, + ]; + yield 'double Infinity' => [ + 'buffer' => '{"1":{"dbl":"Infinity"}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => INF, + 'expectedResult' => 1, + ]; + yield 'byte' => [ + 'buffer' => '{"1":{"i8":1}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testByte_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => 0x01, + 'expectedResult' => 1, + ]; + yield 'i32' => [ + 'buffer' => '{"1":{"i32":1073741824}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testI32_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => pow(2, 30), + 'expectedResult' => 1, + ]; + if (PHP_INT_SIZE == 8) { + yield 'i64_64Architecture' => [ + 'buffer' => '{"1":{"i64":' . pow(2, 60) . '}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testI64_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => pow(2, 60), + 'expectedResult' => 1, + ]; + yield 'struct_64Architecture' => [ + 'buffer' => '{"1":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":' . pow(2, 60) . '}}}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testStruct_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => new Xtruct( + array( + 'string_thing' => 'worked', + 'byte_thing' => 0x01, + 'i32_thing' => pow(2, 30), + 'i64_thing' => pow(2, 60), + ) + ), + 'expectedResult' => 4, + ]; + yield 'nest_64Architecture' => [ + 'buffer' => '{"1":{"rec":{"1":{"i8":1},"2":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":' . pow(2, 60) . '}}},"3":{"i32":32768}}}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testNest_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => new Xtruct2( + array( + 'byte_thing' => 0x01, + 'struct_thing' => new Xtruct( + array( + 'string_thing' => 'worked', + 'byte_thing' => 0x01, + 'i32_thing' => pow(2, 30), + 'i64_thing' => pow(2, 60), + ) + ), + 'i32_thing' => pow(2, 15) + ) + ), + 'expectedResult' => 6, + ]; + } else { + yield 'i64_32Architecture' => [ + 'buffer' => '{"1":{"i64":1152921504606847000}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testI64_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => "1152921504606847000", + 'expectedResult' => 1, + ]; + yield 'struct_32Architecture' => [ + 'buffer' => '{"1":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":1152921504606847000}}}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testStruct_args::class, + 'expectedValue' => new Xtruct( + array( + 'string_thing' => 'worked', + 'byte_thing' => 0x01, + 'i32_thing' => pow(2, 30), + 'i64_thing' => "1152921504606847000", + ) + ), + 'expectedResult' => 4, + ]; + yield 'nest_32Architecture' => [ + 'buffer' => '{"1":{"rec":{"1":{"i8":1},"2":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":1152921504606847000}}},"3":{"i32":32768}}}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testNest_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => new Xtruct2( + array( + 'byte_thing' => 0x01, + 'struct_thing' => new Xtruct( + array( + 'string_thing' => 'worked', + 'byte_thing' => 0x01, + 'i32_thing' => pow(2, 30), + 'i64_thing' => "1152921504606847000", + ) + ), + 'i32_thing' => pow(2, 15) + ) + ), + 'expectedResult' => 6, + ]; + } + yield 'map' => [ + 'buffer' => '{"1":{"map":["i32","i32",3,{"7":77,"8":88,"9":99}]}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testMap_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => [ + 7 => 77, + 8 => 88, + 9 => 99 + ], + 'expectedResult' => 6, + ]; + yield 'stringMap' => [ + 'buffer' => '{"1":{"map":["str","str",6,{"a":"123","a b":"with spaces ","same":"same","0":"numeric key","longValue":"Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e","Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e":"long key"}]}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testStringMap_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => [ + "a" => "123", + "a b" => "with spaces ", + "same" => "same", + "0" => "numeric key", + "longValue" => "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語", + "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語" => "long key" + ], + 'expectedResult' => 12, + ]; + yield 'set' => [ + 'buffer' => '{"1":{"set":["i32",3,1,5,6]}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testSet_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => [1 => true, 5 => true, 6 => true], + 'expectedResult' => 4, + ]; + yield 'list' => [ + 'buffer' => '{"1":{"lst":["i32",3,1,2,3]}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testList_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => [1, 2, 3], + 'expectedResult' => 4, + ]; + yield 'enum' => [ + 'buffer' => '{"1":{"i32":6}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testEnum_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => Numberz::SIX, + 'expectedResult' => 1, + ]; + yield 'typedef' => [ + 'buffer' => '{"1":{"i64":69}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testTypedef_args::class, + 'argsPropertyName' => 'thing', + 'expectedValue' => 69, + 'expectedResult' => 1, + ]; + yield 'mapmap' => [ + 'buffer' => '{"0":{"map":["i32","map",2,{"4":["i32","i32",4,{"1":1,"2":2,"3":3,"4":4}],"-4":["i32","i32",4,{"-4":-4,"-3":-3,"-2":-2,"-1":-1}]}]}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testMapMap_result::class, + 'argsPropertyName' => 'success', + 'expectedValue' => [ + 4 => [ + 1 => 1, + 2 => 2, + 3 => 3, + 4 => 4, + ], + -4 => [ + -4 => -4, + -3 => -3, + -2 => -2, + -1 => -1 + ] + ], + 'expectedResult' => 18, + ]; + + $xtruct1 = new Xtruct( + [ + 'string_thing' => 'Goodbye4', + 'byte_thing' => 4, + 'i32_thing' => 4, + 'i64_thing' => 4, + ] + ); + + $xtruct2 = new Xtruct( + [ + 'string_thing' => 'Hello2', + 'byte_thing' => 2, + 'i32_thing' => 2, + 'i64_thing' => 2, + ] + ); + + $userMap = [Numberz::FIVE => 5, Numberz::EIGHT => 8]; + + $insanity2 = new Insanity( + [ + 'userMap' => $userMap, + 'xtructs' => [$xtruct1, $xtruct2], + ] + ); + + $insanity3 = $insanity2; + + $insanity6 = + new Insanity( + [ + 'userMap' => null, + 'xtructs' => null, + ] + ); + yield 'insanity' => [ + 'buffer' => '{"0":{"map":["i64","map",2,{"1":["i32","rec",2,{"2":{"1":{"map":["i32","i64",2,{"5":5,"8":8}]},"2":{"lst":["rec",2,{"1":{"str":"Goodbye4"},"4":{"i8":4},"9":{"i32":4},"11":{"i64":4}},{"1":{"str":"Hello2"},"4":{"i8":2},"9":{"i32":2},"11":{"i64":2}}]}},"3":{"1":{"map":["i32","i64",2,{"5":5,"8":8}]},"2":{"lst":["rec",2,{"1":{"str":"Goodbye4"},"4":{"i8":4},"9":{"i32":4},"11":{"i64":4}},{"1":{"str":"Hello2"},"4":{"i8":2},"9":{"i32":2},"11":{"i64":2}}]}}}],"2":["i32","rec",1,{"6":{}}]}]}}', + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testInsanity_result::class, + 'argsPropertyName' => 'success', + 'expectedValue' => [ + "1" => [ + Numberz::TWO => $insanity2, + Numberz::THREE => $insanity3, + ], + "2" => [ + Numberz::SIX => $insanity6, + ], + ], + 'expectedResult' => 31, + ]; + } +} diff --git a/lib/php/test/Integration/Lib/Protocol/TSimpleJSONProtocolTest.php b/lib/php/test/Integration/Lib/Protocol/TSimpleJSONProtocolTest.php new file mode 100644 index 00000000000..e108ffcb7f5 --- /dev/null +++ b/lib/php/test/Integration/Lib/Protocol/TSimpleJSONProtocolTest.php @@ -0,0 +1,319 @@ +transport = new TMemoryBuffer(); + $this->protocol = new TSimpleJSONProtocol($this->transport); + $this->transport->open(); + } + + public function testMessageWrite() + { + $input = new TJSONProtocol(new TMemoryBuffer('[1,"testString",1,0,{"0":{"str":"successResponse"}}]')); + $service = new \Basic\ThriftTest\ThriftTestClient($input, $this->protocol); + $result = $service->testString('test'); + $this->assertSame('successResponse', $result); + $this->assertSame('["testString",1,0,{"thing":"test"}]', $this->protocol->getTransport()->getBuffer()); + } + + /** + * @dataProvider writeDataProvider + */ + public function testWrite( + $argsClassName, + $argsValues, + $expected + ) { + $args = new $argsClassName($argsValues); + $args->write($this->protocol); + + $actual = $this->transport->read(self::BUFFER_SIZE); + + $this->assertEquals($expected, $actual); + } + + public function writeDataProvider() + { + if (!is_dir(__DIR__ . '/../../../Resources/packages/php')) { + throw new \RuntimeException( + 'Before running Integration test suite, you must run the Thrift compiler against the ThriftTest.thrift file in the ./Resources directory.' + ); + } + + yield 'void' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testVoid_args::class, + 'argsValues' => [], + 'expected' => '{}', + ]; + yield 'bool true' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testBool_args::class, + 'argsValues' => [ + 'thing' => true, + ], + 'expected' => '{"thing":1}', + ]; + yield 'bool false' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testBool_args::class, + 'argsValues' => [ + 'thing' => false, + ], + 'expected' => '{"thing":0}', + ]; + yield 'string1' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class, + 'argsValues' => [ + 'thing' => "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語", + ], + 'expected' => '{"thing":"Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e"}', + ]; + yield 'string2' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class, + 'argsValues' => [ + 'thing' => "quote: \\\" backslash:" . + " forwardslash-escaped: \\/ " . + " backspace: \b formfeed: \f newline: \n return: \r tab: " . + " now-all-of-them-together: \"\\\/\b\n\r\t" . + " now-a-bunch-of-junk: !@#\$%&()(&%$#{}{}<><><", + ], + 'expected' => '{"thing":"quote: \\\\\" backslash: forwardslash-escaped: \\\\\/ backspace: \\\\b formfeed: \f newline: \n return: \r tab: now-all-of-them-together: \"\\\\\\\\\/\\\\b\n\r\t now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><"}', + ]; + + yield 'string3' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class, + 'argsValues' => [ + 'thing' => "string that ends in double-backslash \\\\", + ], + 'expected' => '{"thing":"string that ends in double-backslash \\\\\\\\"}', + ]; + yield 'string4 testUnicodeStringWithNonBMP' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class, + 'argsValues' => [ + 'thing' => "สวัสดี/𝒯", + ], + 'expected' => '{"thing":"\u0e2a\u0e27\u0e31\u0e2a\u0e14\u0e35\/\ud835\udcaf"}', + ]; + yield 'double' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class, + 'argsValues' => [ + 'thing' => 3.1415926535898, + ], + 'expected' => '{"thing":3.1415926535898}', + ]; + #TODO Should be fixed in future + yield 'double Nan' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class, + 'argsValues' => [ + 'thing' => NAN, + ], + 'expected' => '{"thing":}', + ]; + #TODO Should be fixed in future + yield 'double Infinity' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class, + 'argsValues' => [ + 'thing' => INF, + ], + 'expected' => '{"thing":}', + ]; + yield 'byte' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testByte_args::class, + 'argsValues' => [ + 'thing' => 0x01, + ], + 'expected' => '{"thing":1}', + ]; + yield 'i32' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testI32_args::class, + 'argsValues' => [ + 'thing' => pow(2, 30), + ], + 'expected' => '{"thing":1073741824}', + ]; + if (PHP_INT_SIZE == 8) { + yield 'i64_64Architecture' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testI64_args::class, + 'argsValues' => [ + 'thing' => pow(2, 60), + ], + 'expected' => '{"thing":' . pow(2, 60) . '}', + ]; + yield 'struct_64Architecture' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testStruct_args::class, + 'argsValues' => [ + 'thing' => new Xtruct( + [ + 'string_thing' => 'worked', + 'byte_thing' => 0x01, + 'i32_thing' => pow(2, 30), + 'i64_thing' => pow(2, 60), + ] + ), + ], + 'expected' => '{"thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":' . pow(2, 60) . '}}', + ]; + yield 'nest_64Architecture' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testNest_args::class, + 'argsValues' => [ + 'thing' => new Xtruct2( + [ + 'byte_thing' => 0x01, + 'struct_thing' => new Xtruct( + [ + 'string_thing' => 'worked', + 'byte_thing' => 0x01, + 'i32_thing' => pow(2, 30), + 'i64_thing' => pow(2, 60), + ] + ), + 'i32_thing' => pow(2, 15), + ] + ), + ], + 'expected' => '{"thing":{"byte_thing":1,"struct_thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":' . pow(2, 60) . '},"i32_thing":32768}}', + ]; + } else { + yield 'i64_32Architecture' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testI64_args::class, + 'argsValues' => [ + 'thing' => "1152921504606847000", + ], + 'expected' => '{"thing":1152921504606847000}', + ]; + yield 'struct_32Architecture' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testStruct_args::class, + 'argsValues' => [ + 'thing' => new Xtruct( + [ + 'string_thing' => 'worked', + 'byte_thing' => 0x01, + 'i32_thing' => pow(2, 30), + 'i64_thing' => pow(2, 60), + ] + ), + ], + 'expected' => '{"thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":1152921504606847000}}', + ]; + yield 'nest_32Architecture' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testNest_args::class, + 'argsValues' => [ + 'thing' => new Xtruct2( + [ + 'byte_thing' => 0x01, + 'struct_thing' => new Xtruct( + [ + 'string_thing' => 'worked', + 'byte_thing' => 0x01, + 'i32_thing' => pow(2, 30), + 'i64_thing' => '1152921504606847000', + ] + ), + 'i32_thing' => pow(2, 15), + ] + ), + ], + 'expected' => '{"thing":{"byte_thing":1,"struct_thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":1152921504606847000},"i32_thing":32768}}', + ]; + } + yield 'map' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testMap_args::class, + 'argsValues' => [ + 'thing' => [ + 7 => 77, + 8 => 88, + 9 => 99, + ], + ], + 'expected' => '{"thing":{"7":77,"8":88,"9":99}}', + ]; + yield 'stringMap' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testStringMap_args::class, + 'argsValues' => [ + 'thing' => [ + "a" => "123", + "a b" => "with spaces ", + "same" => "same", + "0" => "numeric key", + "longValue" => "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語", + "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語" => "long key" + ], + ], + 'expected' => '{"thing":{"a":"123","a b":"with spaces ","same":"same","0":"numeric key","longValue":"Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e","Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e":"long key"}}', + ]; + yield 'set' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testSet_args::class, + 'argsValues' => [ + 'thing' => [1 => true, 5 => true, 6 => true], + ], + 'expected' => '{"thing":[1,5,6]}', + ]; + yield 'list' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testList_args::class, + 'argsValues' => [ + 'thing' => [1, 2, 3], + ], + 'expected' => '{"thing":[1,2,3]}', + ]; + yield 'enum' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testEnum_args::class, + 'argsValues' => [ + 'thing' => \Basic\ThriftTest\Numberz::SIX, + ], + 'expected' => '{"thing":6}', + ]; + yield 'typedef' => [ + 'argsClassName' => \Basic\ThriftTest\ThriftTest_testTypedef_args::class, + 'argsValues' => [ + 'thing' => 69, + ], + 'expected' => '{"thing":69}', + ]; + } +} diff --git a/lib/php/test/Unit/BinarySerializerTest.php b/lib/php/test/Integration/Lib/Serializer/BinarySerializerTest.php similarity index 66% rename from lib/php/test/Unit/BinarySerializerTest.php rename to lib/php/test/Integration/Lib/Serializer/BinarySerializerTest.php index 744ca7ad130..44eef937c51 100644 --- a/lib/php/test/Unit/BinarySerializerTest.php +++ b/lib/php/test/Integration/Lib/Serializer/BinarySerializerTest.php @@ -19,35 +19,26 @@ * under the License. */ -namespace Test\Thrift\Unit; +namespace Test\Thrift\Integration\Lib\Serializer; use PHPUnit\Framework\TestCase; -use Thrift\ClassLoader\ThriftClassLoader; use Thrift\Serializer\TBinarySerializer; /*** * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file: - * lib/php/test$ ../../../compiler/cpp/thrift --gen php -r --out ./Resources/packages/php ./Resources/ThriftTest.thrift + * lib/php/test$ ../../../compiler/cpp/thrift --gen php:nsglobal="Basic" -r --out ./Resources/packages/php ./Resources/ThriftTest.thrift */ class BinarySerializerTest extends TestCase { - public function setUp(): void - { - $loader = new ThriftClassLoader(); - $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/php'); - $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/php'); - $loader->register(); - } - /** * We try to serialize and deserialize a random object to make sure no exceptions are thrown. * @see THRIFT-1579 */ public function testBinarySerializer() { - $struct = new \ThriftTest\Xtruct(array('string_thing' => 'abc')); - $serialized = TBinarySerializer::serialize($struct, 'ThriftTest\\Xtruct'); - $deserialized = TBinarySerializer::deserialize($serialized, 'ThriftTest\\Xtruct'); + $struct = new \Basic\ThriftTest\Xtruct(array('string_thing' => 'abc')); + $serialized = TBinarySerializer::serialize($struct, '\\Basic\\ThriftTest\\Xtruct'); + $deserialized = TBinarySerializer::deserialize($serialized, '\\Basic\\ThriftTest\\Xtruct'); $this->assertEquals($struct, $deserialized); } } diff --git a/lib/php/test/Unit/JsonSerializeTest.php b/lib/php/test/Integration/Lib/Serializer/JsonSerializeTest.php similarity index 71% rename from lib/php/test/Unit/JsonSerializeTest.php rename to lib/php/test/Integration/Lib/Serializer/JsonSerializeTest.php index 66e4d5e376f..d3fe3f78cc1 100644 --- a/lib/php/test/Unit/JsonSerializeTest.php +++ b/lib/php/test/Integration/Lib/Serializer/JsonSerializeTest.php @@ -19,7 +19,7 @@ * under the License. */ -namespace Test\Thrift\Unit; +namespace Test\Thrift\Integration\Lib\Serializer; use PHPUnit\Framework\TestCase; use stdClass; @@ -27,21 +27,13 @@ /*** * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file: - * lib/php/test$ ../../../compiler/cpp/thrift --gen php:json -r --out ./Resources/packages/phpjs ./Resources/ThriftTest.thrift + * lib/php/test$ ../../../compiler/cpp/thrift --gen php:json,nsglobal="Json" -r --out ./Resources/packages/phpjs ./Resources/ThriftTest.thrift */ class JsonSerializeTest extends TestCase { - protected function setUp(): void - { - $loader = new ThriftClassLoader(); - $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/phpjs'); - $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/phpjs'); - $loader->register(); - } - public function testEmptyStruct() { - $empty = new \ThriftTest\EmptyStruct(array('non_existing_key' => 'bar')); + $empty = new \Json\ThriftTest\EmptyStruct(array('non_existing_key' => 'bar')); $this->assertEquals(new stdClass(), json_decode(json_encode($empty))); } @@ -51,7 +43,7 @@ public function testStringsAndInts() 'string_thing' => 'foo', 'i64_thing' => 1234567890, ); - $xtruct = new \ThriftTest\Xtruct($input); + $xtruct = new \Json\ThriftTest\Xtruct($input); // Xtruct's 'i32_thing' and 'byte_thing' fields should not be present here! $expected = new stdClass(); @@ -62,9 +54,9 @@ public function testStringsAndInts() public function testNestedStructs() { - $xtruct2 = new \ThriftTest\Xtruct2(array( + $xtruct2 = new \Json\ThriftTest\Xtruct2(array( 'byte_thing' => 42, - 'struct_thing' => new \ThriftTest\Xtruct(array( + 'struct_thing' => new \Json\ThriftTest\Xtruct(array( 'i32_thing' => 123456, )), )); @@ -79,8 +71,8 @@ public function testNestedStructs() public function testInsanity() { $xinput = array('string_thing' => 'foo'); - $xtruct = new \ThriftTest\Xtruct($xinput); - $insanity = new \ThriftTest\Insanity(array( + $xtruct = new \Json\ThriftTest\Xtruct($xinput); + $insanity = new \Json\ThriftTest\Insanity(array( 'xtructs' => array($xtruct, $xtruct, $xtruct) )); $expected = new stdClass(); @@ -90,8 +82,8 @@ public function testInsanity() public function testNestedLists() { - $bonk = new \ThriftTest\Bonk(array('message' => 'foo')); - $nested = new \ThriftTest\NestedListsBonk(array('bonk' => array(array(array($bonk))))); + $bonk = new \Json\ThriftTest\Bonk(array('message' => 'foo')); + $nested = new \Json\ThriftTest\NestedListsBonk(array('bonk' => array(array(array($bonk))))); $expected = new stdClass(); $expected->bonk = array(array(array((object)array('message' => 'foo')))); $this->assertEquals($expected, json_decode(json_encode($nested))); @@ -99,17 +91,17 @@ public function testNestedLists() public function testMaps() { - $intmap = new \ThriftTest\ThriftTest_testMap_args(['thing' => [0 => 'zero']]); - $emptymap = new \ThriftTest\ThriftTest_testMap_args([]); + $intmap = new \Json\ThriftTest\ThriftTest_testMap_args(['thing' => [0 => 'zero']]); + $emptymap = new \Json\ThriftTest\ThriftTest_testMap_args([]); $this->assertEquals('{"thing":{"0":"zero"}}', json_encode($intmap)); $this->assertEquals('{}', json_encode($emptymap)); } public function testScalarTypes() { - $b = new \ThriftTest\Bools(['im_true' => '1', 'im_false' => '0']); + $b = new \Json\ThriftTest\Bools(['im_true' => '1', 'im_false' => '0']); $this->assertEquals('{"im_true":true,"im_false":false}', json_encode($b)); - $s = new \ThriftTest\StructA(['s' => 42]); + $s = new \Json\ThriftTest\StructA(['s' => 42]); $this->assertEquals('{"s":"42"}', json_encode($s)); } } diff --git a/lib/php/test/Unit/ValidatorTestOop.php b/lib/php/test/Integration/ValidatorOopTest.php similarity index 59% rename from lib/php/test/Unit/ValidatorTestOop.php rename to lib/php/test/Integration/ValidatorOopTest.php index 95581825e0c..c3dce030a2c 100644 --- a/lib/php/test/Unit/ValidatorTestOop.php +++ b/lib/php/test/Integration/ValidatorOopTest.php @@ -19,23 +19,16 @@ * under the License. */ -namespace Test\Thrift\Unit; - -use Thrift\ClassLoader\ThriftClassLoader; +namespace Test\Thrift\Integration; /*** * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file: - * lib/php/test$ ../../../compiler/cpp/thrift --gen php:validate,oop -r --out ./Resources/packages/phpvo ./Resources/ThriftTest.thrift + * lib/php/test$ ../../../compiler/cpp/thrift --gen php:validate,oop,nsglobal="ValidateOop" -r --out ./Resources/packages/phpvo ./Resources/ThriftTest.thrift */ -class ValidatorTestOop extends BaseValidatorTest +class ValidatorOopTest extends BaseValidatorTest { - public function setUp(): void + public function getNsGlobal() { - $loader = new ThriftClassLoader(); - $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/phpvo'); - $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/phpvo'); - $loader->registerNamespace('TestValidators', __DIR__ . '/../Resources/packages/phpvo'); - $loader->registerDefinition('TestValidators', __DIR__ . '/../Resources/packages/phpvo'); - $loader->register(); + return 'ValidateOop'; } } diff --git a/lib/php/test/Unit/ValidatorTest.php b/lib/php/test/Integration/ValidatorTest.php similarity index 62% rename from lib/php/test/Unit/ValidatorTest.php rename to lib/php/test/Integration/ValidatorTest.php index b125424c15e..0d6a697e4eb 100644 --- a/lib/php/test/Unit/ValidatorTest.php +++ b/lib/php/test/Integration/ValidatorTest.php @@ -19,23 +19,16 @@ * under the License. */ -namespace Test\Thrift\Unit; - -use Thrift\ClassLoader\ThriftClassLoader; +namespace Test\Thrift\Integration; /*** * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file: - * lib/php/test$ ../../../compiler/cpp/thrift --gen php:validate -r --out ./Resources/packages/phpv ./Resources/ThriftTest.thrift + * lib/php/test$ ../../../compiler/cpp/thrift --gen php:validate,nsglobal="Validate" -r --out ./Resources/packages/phpv ./Resources/ThriftTest.thrift */ class ValidatorTest extends BaseValidatorTest { - public function setUp(): void + public function getNsGlobal() { - $loader = new ThriftClassLoader(); - $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/phpv'); - $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/phpv'); - $loader->registerNamespace('TestValidators', __DIR__ . '/../Resources/packages/phpv'); - $loader->registerDefinition('TestValidators', __DIR__ . '/../Resources/packages/phpv'); - $loader->register(); + return 'Validate'; } } diff --git a/lib/php/test/Makefile.am b/lib/php/test/Makefile.am index 1e534cad0f4..b6a53256e2b 100644 --- a/lib/php/test/Makefile.am +++ b/lib/php/test/Makefile.am @@ -25,11 +25,11 @@ stubs: Resources/ThriftTest.thrift mkdir -p ./Resources/packages/phpvo mkdir -p ./Resources/packages/phpjs mkdir -p ./Resources/packages/phpcm - $(THRIFT) --gen php -r --out ./Resources/packages/php Resources/ThriftTest.thrift - $(THRIFT) --gen php:validate -r --out ./Resources/packages/phpv Resources/ThriftTest.thrift - $(THRIFT) --gen php:validate,oop -r --out ./Resources/packages/phpvo Resources/ThriftTest.thrift - $(THRIFT) --gen php:json -r --out ./Resources/packages/phpjs Resources/ThriftTest.thrift - $(THRIFT) --gen php:classmap,server,rest -r --out ./Resources/packages/phpcm Resources/ThriftTest.thrift + $(THRIFT) --gen php:nsglobal="Basic" -r --out ./Resources/packages/php Resources/ThriftTest.thrift + $(THRIFT) --gen php:validate,nsglobal="Validate" -r --out ./Resources/packages/phpv Resources/ThriftTest.thrift + $(THRIFT) --gen php:validate,oop,nsglobal="ValidateOop" -r --out ./Resources/packages/phpvo Resources/ThriftTest.thrift + $(THRIFT) --gen php:json,nsglobal="Json" -r --out ./Resources/packages/phpjs Resources/ThriftTest.thrift + $(THRIFT) --gen php:classmap,server,rest,nsglobal="Classmap" -r --out ./Resources/packages/phpcm Resources/ThriftTest.thrift deps: $(top_srcdir)/composer.json composer install --working-dir=$(top_srcdir) diff --git a/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php b/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php index 46ed2ec69c0..d99edfa2e7b 100644 --- a/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php +++ b/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php @@ -25,10 +25,6 @@ use PHPUnit\Framework\TestCase; use Thrift\ClassLoader\ThriftClassLoader; -/*** - * This test depends on running the compiler against the ./Resources/ThriftTest.thrift file: - * lib/php/test$ ../../../compiler/cpp/thrift --gen php:classmap,server,rest -r --out ./Resources/packages/phpcm ./Resources/ThriftTest.thrift - */ class ThriftClassLoaderTest extends TestCase { use PHPMock; @@ -111,108 +107,4 @@ public function registerNamespaceDataProvider() 'apcuPrefix' => 'APCU_PREFIX', ]; } - - /** - * @dataProvider registerDefinitionDataProvider - */ - public function testRegisterDefinition( - $definitions, - $class, - $checkInterfaceExist = false, - $useApcu = false, - $apcuPrefix = null - ) { - $this->getFunctionMock('Thrift\ClassLoader', 'apcu_fetch') - ->expects($useApcu ? $this->once() : $this->never()) - ->with($apcuPrefix . $class) - ->willReturn(false); - - $this->getFunctionMock('Thrift\ClassLoader', 'apcu_store') - ->expects($useApcu ? $this->once() : $this->never()) - ->with($apcuPrefix . $class, $this->anything()) - ->willReturn(true); - - $loader = new ThriftClassLoader($useApcu, $apcuPrefix); - foreach ($definitions as $namespace => $paths) { - $loader->registerDefinition($namespace, $paths); - } - $loader->register(); - - $loader->loadClass($class); - if ($checkInterfaceExist) { - $this->assertTrue(interface_exists($class, false), "->loadClass() loads '$class'"); - } else { - $this->assertTrue(class_exists($class, false), "->loadClass() loads '$class'"); - } - } - - public function registerDefinitionDataProvider() - { - yield 'loadType' => [ - 'definitions' => [ - 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', - ], - 'class' => 'ThriftTest\Xtruct', - ]; - yield 'loadInterface' => [ - 'definitions' => [ - 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', - ], - 'class' => '\ThriftTest\ThriftTestIf', - 'checkInterfaceExist' => true, - ]; - yield 'loadClient' => [ - 'definitions' => [ - 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', - ], - 'class' => '\ThriftTest\ThriftTestClient', - ]; - yield 'loadProcessor' => [ - 'definitions' => [ - 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', - ], - 'class' => '\ThriftTest\ThriftTestProcessor', - ]; - yield 'loadRest' => [ - 'definitions' => [ - 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', - ], - 'class' => '\ThriftTest\ThriftTestRest', - ]; - yield 'load_args' => [ - 'definitions' => [ - 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', - ], - 'class' => '\ThriftTest\ThriftTest_testVoid_args', - ]; - yield 'load_result' => [ - 'definitions' => [ - 'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm', - ], - 'class' => '\ThriftTest\ThriftTest_testVoid_result', - ]; - yield 'pathAsArray' => [ - 'definitions' => [ - 'ThriftTest' => [__DIR__ . '/../../../Resources/packages/phpcm'], - ], - 'class' => 'ThriftTest\Xtruct', - ]; - yield 'severalDefinitions' => [ - 'definitions' => [ - 'ThriftTest' => [__DIR__ . '/../../../Resources/packages/phpcm'], - 'TestValidators' => [__DIR__ . '/../../../Resources/packages/phpcm'], - ], - 'class' => '\TestValidators\TestServiceClient', - ]; - yield 'useApcu' => [ - 'definitions' => [ - 'ThriftTest' => [__DIR__ . '/../../../Resources/packages/phpcm'], - 'TestValidators' => [__DIR__ . '/../../../Resources/packages/phpcm'], - ], - 'class' => '\TestValidators\TestServiceClient', - 'checkInterfaceExist' => false, - 'useApcu' => true, - 'apcuPrefix' => 'APCU_PREFIX', - ]; - } } diff --git a/lib/php/test/Unit/Lib/Protocol/TBinaryProtocolAcceleratedTest.php b/lib/php/test/Unit/Lib/Protocol/TBinaryProtocolAcceleratedTest.php new file mode 100644 index 00000000000..4a82a5af040 --- /dev/null +++ b/lib/php/test/Unit/Lib/Protocol/TBinaryProtocolAcceleratedTest.php @@ -0,0 +1,73 @@ +assertInstanceOf($expectedTransport, $protocol->getTransport()); + } + + public function constructDataProvider() + { + yield 'not buffered transport' => [ + 'transport' => new TMemoryBuffer(), + 'expectedTransport' => TMemoryBuffer::class, + ]; + yield 'buffered transport' => [ + 'transport' => new TSocket(), + 'expectedTransport' => TBufferedTransport::class, + ]; + } + + /** + * @dataProvider strictParamsDataProvider + */ + public function testStrictParams($strictRead, $strictWrite) + { + $protocol = new TBinaryProtocolAccelerated(new TMemoryBuffer(), $strictRead, $strictWrite); + $this->assertEquals($strictRead, $protocol->isStrictRead()); + $this->assertEquals($strictWrite, $protocol->isStrictWrite()); + } + + public function strictParamsDataProvider() + { + yield 'strict read and write' => [true, true]; + yield 'not strict read and write' => [false, false]; + yield 'strict read and not strict write' => [true, false]; + yield 'not strict read and strict write' => [false, true]; + } +} diff --git a/lib/php/test/Unit/Lib/Protocol/TBinaryProtocolTest.php b/lib/php/test/Unit/Lib/Protocol/TBinaryProtocolTest.php new file mode 100644 index 00000000000..2648b556315 --- /dev/null +++ b/lib/php/test/Unit/Lib/Protocol/TBinaryProtocolTest.php @@ -0,0 +1,1009 @@ +createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, $strictWrite); + + $transport->expects($this->exactly(count($writeCallsParams))) + ->method('write') + ->withConsecutive(...$writeCallsParams) + ->willReturnOnConsecutiveCalls(...$writeCallsResults); + + $result = $protocol->writeMessageBegin($name, $type, $seqid); + $this->assertEquals($expectedResult, $result); + } + + public function writeMessageBeginDataProvider() + { + $type = TType::STRING; + $seqid = 555; + + yield 'strictWrite=true' => [ + 'strictWrite' => true, + 'name' => 'testName', + 'type' => $type, + 'seqid' => $seqid, + 'writeCallsParams' => [ + [pack('N', self::VERSION_1 | $type), 4], #writeI32 + [pack('N', strlen('testName')), 4], #writeStringLen + ['testName', 8], #writeString + [pack('N', $seqid), 4], #writeI32 + ], + 'writeCallsResults' => [ + 4, + 4, + 8, + 4, + ], + 'expectedResult' => 20, + ]; + + yield 'strictWrite=false' => [ + 'strictWrite' => false, + 'name' => 'testName', + 'type' => $type, + 'seqid' => $seqid, + 'writeCallsParams' => [ + [pack('N', strlen('testName')), 4], #writeStringLen + ['testName', 8], #writeString + [pack('c', $type), 1], #writeByte + [pack('N', $seqid), 4], #writeI32 + ], + 'writeCallsResults' => [ + 4, + 8, + 1, + 4, + ], + 'expectedResult' => 17, + ]; + } + + public function testWriteMessageEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->writeMessageEnd()); + } + + public function testWriteStructBegin() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->writeStructBegin('testName')); + } + + public function testWriteStructEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->writeStructEnd()); + } + + public function testWriteFieldBegin() + { + $fieldName = 'testName'; + $fieldType = TType::STRING; + $fieldId = 555; + + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->exactly(2)) + ->method('write') + ->withConsecutive( + ...[ + [pack('c', $fieldType), 1], #writeByte + [pack('n', $fieldId), 2], #writeI16 + ] + )->willReturnOnConsecutiveCalls([1, 2]); + + $this->assertEquals(3, $protocol->writeFieldBegin($fieldName, $fieldType, $fieldId)); + } + + public function testWriteFieldEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->writeFieldEnd()); + } + + public function testWriteFieldStop() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->once()) + ->method('write') + ->with(pack('c', TType::STOP), 1) #writeByte + ->willReturn(1); + + $this->assertEquals(1, $protocol->writeFieldStop()); + } + + public function testWriteMapBegin() + { + $keyType = TType::I32; + $valType = TType::STRING; + $size = 99; + + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->exactly(3)) + ->method('write') + ->withConsecutive( + ...[ + [pack('c', $keyType), 1], #writeByte + [pack('c', $valType), 1], #writeByte + [pack('N', $size), 4], #writeI32 + ] + )->willReturnOnConsecutiveCalls([1, 1, 4]); + + $this->assertEquals(6, $protocol->writeMapBegin($keyType, $valType, $size)); + } + + public function testWriteMapEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->writeMapEnd()); + } + + public function testWriteListBegin() + { + $elemType = TType::I32; + $size = 99; + + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->exactly(2)) + ->method('write') + ->withConsecutive( + ...[ + [pack('c', $elemType), 1], #writeByte + [pack('N', $size), 4], #writeI32 + ] + )->willReturnOnConsecutiveCalls([1, 4]); + + $this->assertEquals(5, $protocol->writeListBegin($elemType, $size)); + } + + public function testWriteListEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->writeListEnd()); + } + + public function testWriteSetBegin() + { + $elemType = TType::I32; + $size = 99; + + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->exactly(2)) + ->method('write') + ->withConsecutive( + ...[ + [pack('c', $elemType), 1], #writeByte + [pack('N', $size), 4], #writeI32 + ] + )->willReturnOnConsecutiveCalls([1, 4]); + + $this->assertEquals(5, $protocol->writeSetBegin($elemType, $size)); + } + + public function testWriteSetEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->writeSetEnd()); + } + + public function testWriteBool() + { + $value = true; + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->once()) + ->method('write') + ->with(pack('c', (int)$value), 1) #writeByte + ->willReturn(1); + + $this->assertEquals(1, $protocol->writeBool($value)); + } + + public function testWriteByte() + { + $value = 1; + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->once()) + ->method('write') + ->with(pack('c', $value), 1) #writeByte + ->willReturn(1); + + $this->assertEquals(1, $protocol->writeByte($value)); + } + + public function testWriteI16() + { + $value = 1; + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->once()) + ->method('write') + ->with(pack('n', $value), 2) #writeI16 + ->willReturn(2); + + $this->assertEquals(2, $protocol->writeI16($value)); + } + + public function testWriteI32() + { + $value = 1; + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->once()) + ->method('write') + ->with(pack('N', $value), 4) #writeI32 + ->willReturn(4); + + $this->assertEquals(4, $protocol->writeI32($value)); + } + + public function testWriteI64For32BitArchitecture() + { + if (PHP_INT_SIZE !== 4) { + $this->markTestSkipped('Test is only for 32 bit architecture'); + } + $value = 1; + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $neg = $value < 0; + + if ($neg) { + $value *= -1; + } + + $hi = (int)($value / 4294967296); + $lo = (int)$value; + + if ($neg) { + $hi = ~$hi; + $lo = ~$lo; + if (($lo & (int)0xffffffff) == (int)0xffffffff) { + $lo = 0; + $hi++; + } else { + $lo++; + } + } + + $transport + ->expects($this->once()) + ->method('write') + ->with(pack('N2', $hi, $lo), 8) #writeI64 + ->willReturn(4); + + $this->assertEquals(8, $protocol->writeI64($value)); + } + + public function testWriteI64For64BitArchitecture() + { + if (PHP_INT_SIZE == 4) { + $this->markTestSkipped('Test is only for 64 bit architecture'); + } + $value = 1; + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $hi = $value >> 32; + $lo = $value & 0xFFFFFFFF; + + $transport + ->expects($this->once()) + ->method('write') + ->with(pack('N2', $hi, $lo), 8) #writeI64 + ->willReturn(8); + + $this->assertEquals(8, $protocol->writeI64($value)); + } + + public function testWriteDouble() + { + $value = 1; + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->once()) + ->method('write') + ->with(strrev(pack('d', $value)), 8) #writeDouble + ->willReturn(8); + + $this->assertEquals(8, $protocol->writeDouble($value)); + } + + public function testWriteString() + { + $value = 'string'; + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->exactly(2)) + ->method('write') + ->withConsecutive( + ...[ + [pack('N', strlen($value))], #writeI32, + [$value, strlen($value)], #write, + ] + )->willReturnOnConsecutiveCalls([4, 6]); + + $this->assertEquals(10, $protocol->writeString($value)); + } + + /** + * @dataProvider readMessageBeginDataProvider + */ + public function testReadMessageBegin( + $strictRead, + $readCallsParams, + $readCallsResults, + $expectedReadLengthResult, + $expectedName, + $expectedType, + $expectedSeqid, + $expectedException = null, + $expectedExceptionMessage = null, + $expectedExceptionCode = null + ) { + if ($expectedException) { + $this->expectException($expectedException); + $this->expectExceptionMessage($expectedExceptionMessage); + $this->expectExceptionCode($expectedExceptionCode); + } + + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, $strictRead, true); + + $transport->expects($this->exactly(count($readCallsParams))) + ->method('readAll') + ->withConsecutive(...$readCallsParams) + ->willReturnOnConsecutiveCalls(...$readCallsResults); + + $result = $protocol->readMessageBegin($name, $type, $seqid); + $this->assertEquals($expectedReadLengthResult, $result); + $this->assertEquals($expectedName, $name); + $this->assertEquals($expectedType, $type); + $this->assertEquals($expectedSeqid, $seqid); + } + + public function readMessageBeginDataProvider() + { + yield 'strictRead=true' => [ + 'strictRead' => true, + 'readCallsParams' => [ + [4], #readI32 + [4], #readStringLen + [8], #readString + [4], #readI32 + ], + 'readCallsResults' => [ + pack('N', 0x80010000 | TType::STRING), #version + pack('N', strlen('testName')), + 'testName', + pack('N', 555), + ], + 'expectedReadLengthResult' => 20, + 'expectedName' => 'testName', + 'expectedType' => TType::STRING, + 'expectedSeqid' => 555, + ]; + + yield 'incorrect version' => [ + 'strictRead' => true, + 'readCallsParams' => [ + [4], #readI32 + ], + 'readCallsResults' => [ + pack('N', 0x80000000 | TType::STRING), #version + ], + 'expectedReadLengthResult' => 4, + 'expectedName' => '', + 'expectedType' => 0, + 'expectedSeqid' => 0, + 'expectedException' => TProtocolException::class, + 'expectedExceptionMessage' => 'Bad version identifier: -2147483637', + 'expectedExceptionCode' => TProtocolException::BAD_VERSION, + ]; + + yield 'strictRead=false' => [ + 'strictRead' => false, + 'readCallsParams' => [ + [4], #readStringLen + [8], #readString + [1], #readByte + [4], #readI32 + ], + 'readCallsResults' => [ + pack('N', strlen('testName')), + 'testName', + pack('c', TType::STRING), + pack('N', 555), + ], + 'expectedReadLengthResult' => 17, + 'expectedName' => 'testName', + 'expectedType' => TType::STRING, + 'expectedSeqid' => 555, + ]; + + yield 'strictRead=true without version' => [ + 'strictRead' => true, + 'readCallsParams' => [ + [4], #readStringLen + ], + 'readCallsResults' => [ + pack('N', strlen('testName')), + ], + 'expectedReadLengthResult' => 17, + 'expectedName' => 'testName', + 'expectedType' => TType::STRING, + 'expectedSeqid' => 555, + 'expectedException' => TProtocolException::class, + 'expectedExceptionMessage' => 'No version identifier, old protocol client?', + 'expectedExceptionCode' => TProtocolException::BAD_VERSION, + ]; + } + + public function testReadMessageEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->readMessageEnd()); + } + + public function testReadStructBegin() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->readStructBegin($name)); + $this->assertEquals('', $name); + } + + public function testReadStructEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->readStructEnd()); + } + + /** + * @dataProvider readFieldBeginDataProvider + */ + public function testReadFieldBegin( + $storedFieldType, + $readCallsParams, + $readCallsResults, + $expectedResult, + $expectedName, + $expectedFieldType, + $expectedFieldId + ) { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->exactly(count($readCallsParams))) + ->method('readAll') + ->withConsecutive(...$readCallsParams) + ->willReturnOnConsecutiveCalls(...$readCallsResults); + + $this->assertEquals($expectedResult, $protocol->readFieldBegin($name, $fieldType, $fieldId)); + $this->assertEquals($expectedName, $name); + $this->assertEquals($expectedFieldType, $fieldType); + $this->assertEquals($expectedFieldId, $fieldId); + } + + public function readFieldBeginDataProvider() + { + yield 'default' => [ + 'storedFieldType' => TType::STRING, + 'readCallsParams' => [ + [1], #readByte + [2], #readI16 + ], + 'readCallsResults' => [ + pack('c', TType::STRING), + pack('n', 555), + ], + 'expectedResult' => 3, + 'exprectedName' => '', + 'expectedFieldType' => TType::STRING, + 'expectedFieldId' => 555, + ]; + + yield 'stop field' => [ + 'storedFieldType' => TType::STOP, + 'readCallsParams' => [ + [1], #readByte + ], + 'readCallsResults' => [ + pack('c', TType::STOP), + ], + 'expectedResult' => 1, + 'exprectedName' => '', + 'expectedFieldType' => 0, + 'expectedFieldId' => 0, + ]; + } + + public function testReadFieldEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->readFieldEnd()); + } + + public function testReadMapBegin() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->exactly(3)) + ->method('readAll') + ->withConsecutive( + ...[ + [1], #readByte + [1], #readByte + [4], #readI32 + ] + )->willReturnOnConsecutiveCalls( + pack('c', TType::I32), + pack('c', TType::STRING), + pack('N', 555) + ); + + $this->assertEquals(6, $protocol->readMapBegin($keyType, $valType, $size)); + $this->assertEquals(TType::I32, $keyType); + $this->assertEquals(TType::STRING, $valType); + $this->assertEquals(555, $size); + } + + public function testReadMapEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->readMapEnd()); + } + + public function testReadListBegin() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->exactly(2)) + ->method('readAll') + ->withConsecutive( + ...[ + [1], #readByte + [4], #readI32 + ] + )->willReturnOnConsecutiveCalls( + pack('c', TType::I32), + pack('N', 555) + ); + + $this->assertEquals(5, $protocol->readListBegin($elemType, $size)); + $this->assertEquals(TType::I32, $elemType); + $this->assertEquals(555, $size); + } + + public function testReadListEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->readListEnd()); + } + + public function testReadSetBegin() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->exactly(2)) + ->method('readAll') + ->withConsecutive( + ...[ + [1], #readByte + [4], #readI32 + ] + )->willReturnOnConsecutiveCalls( + pack('c', TType::I32), + pack('N', 555) + ); + + $this->assertEquals(5, $protocol->readSetBegin($elemType, $size)); + $this->assertEquals(TType::I32, $elemType); + $this->assertEquals(555, $size); + } + + public function testReadSetEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $this->assertEquals(0, $protocol->readSetEnd()); + } + + public function testReadBool() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->once()) + ->method('readAll') + ->with(1) #readByte + ->willReturn(pack('c', 1)); + + $this->assertEquals(1, $protocol->readBool($value)); + $this->assertTrue($value); + } + + public function testReadByte() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->once()) + ->method('readAll') + ->with(1) #readByte + ->willReturn(pack('c', 1)); + + $this->assertEquals(1, $protocol->readByte($value)); + $this->assertEquals(1, $value); + } + + /** + * @dataProvider readI16DataProvider + */ + public function testReadI16( + $storedValue, + $expectedValue + ) { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->once()) + ->method('readAll') + ->with(2) #readI16 + ->willReturn(pack('n', $storedValue)); + + $this->assertEquals(2, $protocol->readI16($value)); + $this->assertEquals($expectedValue, $value); + } + + public function readI16DataProvider() + { + yield 'positive' => [1, 1]; + yield 'negative' => [-1, -1]; + } + + /** + * @dataProvider readI16DataProvider + */ + public function testReadI32( + $storedValue, + $expectedValue + ) { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->once()) + ->method('readAll') + ->with(4) #readI32 + ->willReturn(pack('N', $storedValue)); + + $this->assertEquals(4, $protocol->readI32($value)); + $this->assertEquals($expectedValue, $value); + } + + public function readI32DataProvider() + { + yield 'positive' => [1, 1]; + yield 'negative' => [-1, -1]; + } + + /** + * @dataProvider readI64For32BitArchitectureDataProvider + */ + public function testReadI64For32BitArchitecture( + $storedValue, + $expectedValue + ) { + if (PHP_INT_SIZE !== 4) { + $this->markTestSkipped('Test is only for 32 bit architecture'); + } + + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $neg = $storedValue < 0; + + if ($neg) { + $storedValue *= -1; + } + + $hi = (int)($storedValue / 4294967296); + $lo = (int)$storedValue; + + if ($neg) { + $hi = ~$hi; + $lo = ~$lo; + if (($lo & (int)0xffffffff) == (int)0xffffffff) { + $lo = 0; + $hi++; + } else { + $lo++; + } + } + + $transport + ->expects($this->once()) + ->method('write') + ->with(pack('N2', $hi, $lo), 8) #writeI64 + ->willReturn(4); + + $this->assertEquals(8, $protocol->readI64($value)); + $this->assertEquals($expectedValue, $value); + } + + public function readI64For32BitArchitectureDataProvider() + { + $storedValueRepresent = function ($value) { + $neg = $value < 0; + + if ($neg) { + $value *= -1; + } + + $hi = (int)($value / 4294967296); + $lo = (int)$value; + + if ($neg) { + $hi = ~$hi; + $lo = ~$lo; + if (($lo & (int)0xffffffff) == (int)0xffffffff) { + $lo = 0; + $hi++; + } else { + $lo++; + } + } + + return pack('N2', $hi, $lo); + }; + + yield 'positive' => [ + 'storedValue' => $storedValueRepresent(1), + 'expectedValue' => 1, + ]; + + yield 'max' => [ + 'storedValue' => $storedValueRepresent(PHP_INT_MAX), + 'expectedValue' => PHP_INT_MAX, + ]; + + yield 'min' => [ + 'storedValue' => $storedValueRepresent(PHP_INT_MIN), + 'expectedValue' => PHP_INT_MIN, + ]; + + yield 'negative' => [ + 'storedValue' => $storedValueRepresent(-1), + 'expectedValue' => -1, + ]; + } + + /** + * @dataProvider readI64For64BitArchitectureDataProvider + */ + public function testReadI64For64BitArchitecture( + $storedValue, + $expectedValue + ) { + if (PHP_INT_SIZE == 4) { + $this->markTestSkipped('Test is only for 64 bit architecture'); + } + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->once()) + ->method('readAll') + ->with(8) #readI64 + ->willReturn($storedValue); + + $this->assertEquals(8, $protocol->readI64($value)); + $this->assertEquals($expectedValue, $value); + } + + public function readI64For64BitArchitectureDataProvider() + { + $storedValueRepresent = function ($value) { + $hi = $value >> 32; + $lo = $value & 0xFFFFFFFF; + + return pack('N2', $hi, $lo); + }; + + yield 'positive' => [ + 'storedValue' => $storedValueRepresent(1), + 'expectedValue' => 1, + ]; + + yield 'max' => [ + 'storedValue' => $storedValueRepresent(PHP_INT_MAX), + 'expectedValue' => PHP_INT_MAX, + ]; + + yield 'min' => [ + 'storedValue' => $storedValueRepresent(PHP_INT_MIN), + 'expectedValue' => PHP_INT_MIN, + ]; + + yield 'negative' => [ + 'storedValue' => $storedValueRepresent(-1), + 'expectedValue' => -1, + ]; + } + + public function testReadDouble() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->once()) + ->method('readAll') + ->with(8) #readDouble + ->willReturn(strrev(pack('d', 789))); + + $this->assertEquals(8, $protocol->readDouble($value)); + $this->assertEquals(789, $value); + } + + /** + * @dataProvider readStringDataProvider + */ + public function testReadString( + $readCallsParams, + $readCallsResults, + $expectedLength, + $expectedValue + ) { + $transport = $this->createMock(TTransport::class); + $protocol = new TBinaryProtocol($transport, false, false); + + $transport + ->expects($this->exactly(count($readCallsParams))) + ->method('readAll') + ->withConsecutive(...$readCallsParams) + ->willReturnOnConsecutiveCalls(...$readCallsResults); + + $this->assertEquals($expectedLength, $protocol->readString($value)); + $this->assertEquals($expectedValue, $value); + } + + public function readStringDataProvider() + { + $storedValue = ''; + yield 'empty' => [ + 'readCallsParams' => [ + [4] + ], + 'readCallsResults' => [ + pack('N', strlen($storedValue)) + ], + 'expectedLength' => 4, + 'expectedValue' => '', + ]; + + $storedValue = 'string'; + yield 'non-empty' => [ + 'readCallsParams' => [ + [4], + [strlen($storedValue)] + ], + 'readCallsResults' => [ + pack('N', strlen($storedValue)), + $storedValue + ], + 'expectedLength' => 10, + 'expectedValue' => 'string', + ]; + } +} diff --git a/lib/php/test/Unit/Lib/Protocol/TCompactProtocolTest.php b/lib/php/test/Unit/Lib/Protocol/TCompactProtocolTest.php new file mode 100644 index 00000000000..95f972cf268 --- /dev/null +++ b/lib/php/test/Unit/Lib/Protocol/TCompactProtocolTest.php @@ -0,0 +1,843 @@ +createMock(TTransport::class)); + $this->assertSame($expected, $protocol->toZigZag($n, $bits)); + } + + public function toZigZagDataProvider() + { + yield ['n' => 0, 'bits' => 16, 'expected' => 0]; + yield ['n' => -1, 'bits' => 16, 'expected' => 1]; + yield ['n' => 1, 'bits' => 16, 'expected' => 2]; + yield ['n' => -2, 'bits' => 16, 'expected' => 3]; + yield ['n' => 2, 'bits' => 16, 'expected' => 4]; + yield ['n' => -1, 'bits' => 32, 'expected' => 1]; + yield ['n' => 1, 'bits' => 32, 'expected' => 2]; + yield ['n' => -1, 'bits' => 64, 'expected' => 1]; + yield ['n' => 1, 'bits' => 64, 'expected' => 2]; + yield ['n' => -0x7fffffff, 'bits' => 64, 'expected' => 4294967293]; + yield ['n' => 0x7fffffff, 'bits' => 64, 'expected' => 4294967294]; + } + + /** + * @dataProvider fromZigZagDataProvider + */ + public function testFromZigZag( + $n, + $expected + ) { + $protocol = new TCompactProtocol($this->createMock(TTransport::class)); + $this->assertSame($expected, $protocol->fromZigZag($n)); + } + + public function fromZigZagDataProvider() + { + yield ['n' => 0, 'expected' => 0]; + yield ['n' => 1, 'expected' => -1]; + yield ['n' => 2, 'expected' => 1]; + yield ['n' => 3, 'expected' => -2]; + yield ['n' => 4, 'expected' => 2]; + yield ['n' => 4294967293, 'expected' => -0x7fffffff]; + yield ['n' => 4294967294, 'expected' => 0x7fffffff]; + } + + /** + * @dataProvider getVarintDataProvider + */ + public function testGetVarint( + $data, + $expected + ) { + $protocol = new TCompactProtocol($this->createMock(TTransport::class)); + $this->assertSame($expected, $protocol->getVarint($data)); + } + + public function getVarintDataProvider() + { + yield ['data' => 0, 'expected' => "\x00"]; + yield ['data' => 1, 'expected' => "\x01"]; + yield ['data' => 97, 'expected' => "a"]; + yield ['data' => 100, 'expected' => "d"]; + yield ['data' => 1000, 'expected' => "\xe8\x07"]; + } + + public function testWriteVarint() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport->expects($this->once()) + ->method('write') + ->with("\xe8\x07", 2); + + $protocol->writeVarint(1000); + } + + public function testReadVarint() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport->expects($this->exactly(2)) + ->method('readAll') + ->with(1) + ->willReturnOnConsecutiveCalls( + ...[ + "\xe8", + "\x07", + ] + ); + + $this->assertSame(2, $protocol->readVarint($result)); + $this->assertSame(1000, $result); + } + + public function testWriteMessageBegin() + { + $name = 'testName'; + $type = TType::STRING; + $seqid = 1; + + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport + ->expects($this->exactly(5)) + ->method('write') + ->withConsecutive( + ...[ + [pack('C', self::PROTOCOL_ID), 1], #protocal id + [pack('C', self::VERSION | ($type << TCompactProtocol::TYPE_SHIFT_AMOUNT)), 1], #version + ["\x01", 1], #seqid + ["\x08", 1], #field name length + ["testName", 8], #field name + ] + )->willReturnOnConsecutiveCalls( + 1, + 1, + 1, + 1, + 8 + ); + + $result = $protocol->writeMessageBegin($name, $type, $seqid); + $this->assertSame(12, $result); + + $ref = new \ReflectionClass($protocol); + $state = $ref->getProperty('state'); + $state->setAccessible(true); + $this->assertSame(self::STATE_VALUE_WRITE, $state->getValue($protocol)); + } + + public function testWriteMessageEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $this->assertSame(0, $protocol->writeMessageEnd()); + $ref = new \ReflectionClass($protocol); + $state = $ref->getProperty('state'); + $state->setAccessible(true); + $this->assertSame(self::STATE_CLEAR, $state->getValue($protocol)); + } + + public function testWriteStruct() + { + $name = 'testName'; + + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + $ref = new \ReflectionClass($protocol); + $state = $ref->getProperty('state'); + $state->setAccessible(true); + $lastFid = $ref->getProperty('lastFid'); + $lastFid->setAccessible(true); + $structs = $ref->getProperty('structs'); + $structs->setAccessible(true); + + $this->assertSame(0, $protocol->writeStructBegin($name)); + $this->assertSame([[self::STATE_CLEAR, 0]], $structs->getValue($protocol)); + $this->assertSame(self::STATE_FIELD_WRITE, $state->getValue($protocol)); + $this->assertSame(0, $lastFid->getValue($protocol)); + + $this->assertSame(0, $protocol->writeStructBegin($name)); + $this->assertSame(self::STATE_FIELD_WRITE, $state->getValue($protocol)); + $this->assertSame(0, $lastFid->getValue($protocol)); + $this->assertSame([[self::STATE_CLEAR, 0], [self::STATE_FIELD_WRITE, 0]], $structs->getValue($protocol)); + + $this->assertSame(0, $protocol->writeStructEnd()); + $this->assertSame(self::STATE_FIELD_WRITE, $state->getValue($protocol)); + $this->assertSame(0, $lastFid->getValue($protocol)); + $this->assertSame([[self::STATE_CLEAR, 0]], $structs->getValue($protocol)); + + $this->assertSame(0, $protocol->writeStructEnd()); + $this->assertSame(self::STATE_CLEAR, $state->getValue($protocol)); + $this->assertSame(0, $lastFid->getValue($protocol)); + $this->assertSame([], $structs->getValue($protocol)); + } + + public function testWriteFieldStop() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport->expects($this->once()) + ->method('write') + ->with("\x00", 1); + + $this->assertSame(1, $protocol->writeFieldStop()); + } + + /** + * @dataProvider writeFieldHeaderDataProvider + */ + public function testWriteFieldHeader( + $type, + $fid, + $writeCallParams, + $writeCallResult, + $expectedResult + ) { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport + ->expects($this->exactly(count($writeCallParams))) + ->method('write') + ->withConsecutive(...$writeCallParams) + ->willReturnOnConsecutiveCalls(...$writeCallResult); + + $this->assertSame($expectedResult, $protocol->writeFieldHeader($type, $fid)); + } + + public function writeFieldHeaderDataProvider() + { + yield 'bool' => [ + 'type' => TType::BOOL, + 'fid' => 1, + 'writeCallParams' => [ + ["\x12", 1], #writeUByte(pack('C', ($delta << 4) | $type)), + ], + 'writeCallResult' => [ + 1, + ], + 'expectedResult' => 1, + ]; + yield 'list' => [ + 'type' => TType::LST, + 'fid' => 16, + 'writeCallParams' => [ + ["\x0f", 1], #writeUByte(pack('C', ($delta << 4) | $type)), + [" ", 1], #writeI16($fid), + ], + 'writeCallResult' => [ + 1, + ], + 'expectedResult' => 2, + ]; + } + + /** + * @dataProvider writeFieldBeginDataProvider + */ + public function testWriteFieldBegin( + $fieldName, + $fieldType, + $fieldId, + $writeCallParams, + $writeCallResult, + $expectedState, + $expectedBoolFid, + $expectedLastFid, + $expectedResult + ) { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport + ->expects($this->exactly(count($writeCallParams))) + ->method('write') + ->withConsecutive(...$writeCallParams) + ->willReturnOnConsecutiveCalls(...$writeCallResult); + + $this->assertSame($expectedResult, $protocol->writeFieldBegin($fieldName, $fieldType, $fieldId)); + + $ref = new \ReflectionClass($protocol); + $state = $ref->getProperty('state'); + $state->setAccessible(true); + $boolFid = $ref->getProperty('boolFid'); + $boolFid->setAccessible(true); + $lastFid = $ref->getProperty('lastFid'); + $lastFid->setAccessible(true); + $this->assertSame($expectedState, $state->getValue($protocol)); + $this->assertSame($expectedBoolFid, $boolFid->getValue($protocol)); + $this->assertSame($expectedLastFid, $lastFid->getValue($protocol)); + } + + public function writeFieldBeginDataProvider() + { + yield 'bool' => [ + 'fieldName' => 'testName', + 'fieldType' => TType::BOOL, + 'fieldId' => 1, + 'writeCallParams' => [], + 'writeCallResult' => [], + 'expectedState' => self::STATE_BOOL_WRITE, + 'expectedBoolFid' => 1, + 'expectedLastFid' => 0, + 'expectedResult' => 0, + ]; + yield 'list' => [ + 'fieldName' => 'testName', + 'fieldType' => TType::LST, + 'fieldId' => 1, + 'writeCallParams' => [ + ["\x19", 1], #writeUByte(pack('C', ($delta << 4) | $type)), + ], + 'writeCallResult' => [ + 1, + ], + 'expectedState' => self::STATE_VALUE_WRITE, + 'expectedBoolFid' => null, + 'expectedLastFid' => 1, + 'expectedResult' => 1, + ]; + } + + public function testWriteFieldEnd() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $this->assertSame(0, $protocol->writeFieldEnd()); + + $ref = new \ReflectionClass($protocol); + $state = $ref->getProperty('state'); + $state->setAccessible(true); + $this->assertSame(self::STATE_FIELD_WRITE, $state->getValue($protocol)); + } + + /** + * @dataProvider writeCollectionDataProvider + */ + public function testWriteCollection( + $etype, + $size, + $writeCallParams, + $writeCallResult, + $expectedState, + $expectedContainers, + $expectedResult + ) { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport + ->expects($this->exactly(count($writeCallParams))) + ->method('write') + ->withConsecutive(...$writeCallParams) + ->willReturnOnConsecutiveCalls(...$writeCallResult); + + $this->assertSame($expectedResult, $protocol->writeCollectionBegin($etype, $size)); + + $ref = new \ReflectionClass($protocol); + $state = $ref->getProperty('state'); + $state->setAccessible(true); + $containers = $ref->getProperty('containers'); + $containers->setAccessible(true); + $this->assertSame($expectedState, $state->getValue($protocol)); + $this->assertSame($expectedContainers, $containers->getValue($protocol)); + + $this->assertSame(0, $protocol->writeCollectionEnd()); + $this->assertSame(TCompactProtocol::STATE_CLEAR, $state->getValue($protocol)); + } + + public function writeCollectionDataProvider() + { + yield 'size < 14' => [ + 'etype' => TType::STRING, + 'size' => 1, + 'writeCallParams' => [ + ["\x18", 1], #writeUByte(pack('C', ($size << 4 | self::$ctypes[$etype])), + ], + 'writeCallResult' => [ + 1, + ], + 'expectedState' => self::STATE_CONTAINER_WRITE, + 'expectedContainers' => [ + 0 => 0, + ], + 'expectedResult' => 1, + ]; + yield 'size > 14' => [ + 'etype' => TType::STRING, + 'size' => 16, + 'writeCallParams' => [ + ["\xf8", 1], #writeUByte(pack('C', 0xf0 | self::$ctypes[$etype])), + ["\x10", 1], #writeVarint(16), + ], + 'writeCallResult' => [ + 1, + 1, + ], + 'expectedState' => self::STATE_CONTAINER_WRITE, + 'expectedContainers' => [ + 0 => 0, + ], + 'expectedResult' => 2, + ]; + } + + /** + * @dataProvider writeMapDataProvider + */ + public function testWriteMap( + $keyType, + $valType, + $size, + $writeCallParams, + $writeCallResult, + $expectedContainers, + $expectedResult + ) { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport + ->expects($this->exactly(count($writeCallParams))) + ->method('write') + ->withConsecutive(...$writeCallParams) + ->willReturnOnConsecutiveCalls(...$writeCallResult); + + $this->assertSame($expectedResult, $protocol->writeMapBegin($keyType, $valType, $size)); + + $ref = new \ReflectionClass($protocol); + $containers = $ref->getProperty('containers'); + $containers->setAccessible(true); + $state = $ref->getProperty('state'); + $state->setAccessible(true); + $this->assertSame($expectedContainers, $containers->getValue($protocol)); + $this->assertSame(TCompactProtocol::STATE_CLEAR, $state->getValue($protocol)); + + $this->assertSame(0, $protocol->writeMapEnd()); + $this->assertSame(TCompactProtocol::STATE_CLEAR, $state->getValue($protocol)); + $this->assertSame([], $containers->getValue($protocol)); + } + + public function writeMapDataProvider() + { + yield 'size zero' => [ + 'keyType' => TType::STRING, + 'valType' => TType::STRING, + 'size' => 0, + 'writeCallParams' => [ + ["\x00", 1], #writeByte(0), + ], + 'writeCallResult' => [ + 1, + ], + 'expectedContainers' => [ + 0 => 0, + ], + 'expectedResult' => 1, + ]; + yield 'size non zero' => [ + 'keyType' => TType::STRING, + 'valType' => TType::STRING, + 'size' => 16, + 'writeCallParams' => [ + ["\x10", 1], #writeVarint(16), + ["\x88", 1], #writeUByte(pack('C', self::$ctypes[$key_type] << 4 | self::$ctypes[$val_type])), + ], + 'writeCallResult' => [ + 1, + 1, + ], + 'expectedContainers' => [ + 0 => 0, + ], + 'expectedResult' => 2, + ]; + } + + public function testWriteListBegin() + { + $protocol = $this->createPartialMock(TCompactProtocol::class, ['writeCollectionBegin']); + + $protocol->expects($this->once()) + ->method('writeCollectionBegin') + ->with(TType::STRING, 1) + ->willReturn(1); + + $this->assertSame(1, $protocol->writeListBegin(TType::STRING, 1)); + } + + public function testWriteListEnd() + { + $protocol = $this->createPartialMock(TCompactProtocol::class, ['writeCollectionEnd']); + + $protocol->expects($this->once()) + ->method('writeCollectionEnd') + ->willReturn(1); + + $this->assertSame(1, $protocol->writeListEnd()); + } + + public function testWriteSettBegin() + { + $protocol = $this->createPartialMock(TCompactProtocol::class, ['writeCollectionBegin']); + + $protocol->expects($this->once()) + ->method('writeCollectionBegin') + ->with(TType::STRING, 1) + ->willReturn(1); + + $this->assertSame(1, $protocol->writeSetBegin(TType::STRING, 1)); + } + + public function testWriteSetEnd() + { + $protocol = $this->createPartialMock(TCompactProtocol::class, ['writeCollectionEnd']); + + $protocol->expects($this->once()) + ->method('writeCollectionEnd') + ->willReturn(1); + + $this->assertSame(1, $protocol->writeSetEnd()); + } + + /** + * @dataProvider writeBinaryDataProvider + */ + public function testWriteBool( + $value, + $startState, + $writeCallParams, + $writeCallResult, + $expectedResult, + $expectedException, + $expectedExceptionMessage + ) { + if ($expectedException) { + $this->expectException($expectedException); + $this->expectExceptionMessage($expectedExceptionMessage); + } + + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + if (!is_null($startState)) { + $ref = new \ReflectionClass($protocol); + $state = $ref->getProperty('state'); + $state->setAccessible(true); + $state->setValue($protocol, $startState); + } + + $transport + ->expects($this->exactly(count($writeCallParams))) + ->method('write') + ->withConsecutive(...$writeCallParams) + ->willReturnOnConsecutiveCalls(...$writeCallResult); + + $this->assertSame($expectedResult, $protocol->writeBool($value)); + } + + public function writeBinaryDataProvider() + { + yield 'invalid state' => [ + 'value' => true, + 'startState' => null, + 'writeCallParams' => [], + 'writeCallResult' => [], + 'expectedResult' => 0, + 'expectedException' => TProtocolException::class, + 'expectedExceptionMessage' => 'Invalid state in compact protocol', + ]; + + yield 'true' => [ + 'value' => true, + 'startState' => TCompactProtocol::STATE_BOOL_WRITE, + 'writeCallParams' => [ + ["\x01", 1], #writeByte + ["\x00", 1], #writeI16 + ], + 'writeCallResult' => [ + 1, + 1, + ], + 'expectedResult' => 2, + 'expectedException' => null, + 'expectedExceptionMessage' => null, + ]; + + yield 'false' => [ + 'value' => false, + 'startState' => TCompactProtocol::STATE_BOOL_WRITE, + 'writeCallParams' => [ + ["\x02", 1], #writeByte + ["\x00", 1], #writeI16 + ], + 'writeCallResult' => [ + 1, + 1, + ], + 'expectedResult' => 2, + 'expectedException' => null, + 'expectedExceptionMessage' => null, + ]; + + yield 'container true' => [ + 'value' => true, + 'startState' => TCompactProtocol::STATE_CONTAINER_WRITE, + 'writeCallParams' => [ + ["\x01", 1], #writeByte + ], + 'writeCallResult' => [ + 1, + ], + 'expectedResult' => 1, + 'expectedException' => null, + 'expectedExceptionMessage' => null, + ]; + } + + /** + * @dataProvider writeByteDataProvider + */ + public function testWriteByte( + $value, + $expectedWriteCallParam + ) { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport->expects($this->once()) + ->method('write') + ->with($expectedWriteCallParam, 1); + + $this->assertSame(1, $protocol->writeByte($value)); + } + + public function writeByteDataProvider() + { + yield 'signed' => [ + 'value' => -1, + 'expectedWriteCallParam' => "\xff", + ]; + yield 'unsigned' => [ + 'value' => 1, + 'expectedWriteCallParam' => "\x01", + ]; + yield 'lowercase' => [ + 'value' => 'a', + 'expectedWriteCallParam' => "\x00", + ]; + yield 'upercase' => [ + 'value' => 'A', + 'expectedWriteCallParam' => "\x00", + ]; + } + + /** + * @dataProvider writeUByteDataProvider + */ + public function testWriteUByte( + $value, + $expectedWriteCallParam + ) { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport->expects($this->once()) + ->method('write') + ->with($expectedWriteCallParam, 1); + + $this->assertSame(1, $protocol->writeUByte($value)); + } + + public function writeUByteDataProvider() + { + yield 'signed' => [ + 'value' => -1, + 'expectedWriteCallParam' => "\xff", + ]; + yield 'unsigned' => [ + 'value' => 1, + 'expectedWriteCallParam' => "\x01", + ]; + yield 'lowercase' => [ + 'value' => 'a', + 'expectedWriteCallParam' => "\x00", + ]; + yield 'upercase' => [ + 'value' => 'A', + 'expectedWriteCallParam' => "\x00", + ]; + } + + public function testWriteI16() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport->expects($this->once()) + ->method('write') + ->with("\x00", 1); + + $this->assertSame(1, $protocol->writeI16(0)); + } + + public function testWriteI32() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport->expects($this->once()) + ->method('write') + ->with("\x00", 1); + + $this->assertSame(1, $protocol->writeI32(0)); + } + + public function testWriteDouble() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport->expects($this->once()) + ->method('write') + ->with(pack('d', 0), 8); + + $this->assertSame(8, $protocol->writeDouble(0)); + } + + public function testWriteString() + { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport->expects($this->exactly(2)) + ->method('write') + ->withConsecutive( + ["\x04", 1], + ["test", 4] + ); + + $this->assertSame(5, $protocol->writeString('test')); + } + + /** + * @dataProvider writeI64DataProvider + */ + public function testWriteI64( + $value, + $expectedWriteCallParam, + $expectedResult + ) { + $transport = $this->createMock(TTransport::class); + $protocol = new TCompactProtocol($transport); + + $transport->expects($this->once()) + ->method('write') + ->with(...$expectedWriteCallParam); + + $this->assertSame($expectedResult, $protocol->writeI64($value)); + } + + public function writeI64DataProvider() + { + yield 'simple' => [ + 'value' => 0, + 'expectedWriteCallParam' => ["\x00", 1], + 'expectedResult' => 1, + ]; + yield 'negative' => [ + 'value' => -1, + 'expectedWriteCallParam' => ["\x01", 1], + 'expectedResult' => 1, + ]; + yield 'big' => [ + 'value' => 5000000000, + 'expectedWriteCallParam' => [hex2bin("80c8afa025"), 5], + 'expectedResult' => 5, + ]; + yield 'small' => [ + 'value' => -5000000000, + 'expectedWriteCallParam' => [hex2bin("ffc7afa025"), 5], + 'expectedResult' => 5, + ]; + yield 'max simple' => [ + 'value' => 0xffffffff, + 'expectedWriteCallParam' => [hex2bin("feffffff1f"), 5], + 'expectedResult' => 5, + ]; + } +} diff --git a/lib/php/test/Unit/Lib/Protocol/TMultiplexedProtocolTest.php b/lib/php/test/Unit/Lib/Protocol/TMultiplexedProtocolTest.php new file mode 100644 index 00000000000..970e3a946c6 --- /dev/null +++ b/lib/php/test/Unit/Lib/Protocol/TMultiplexedProtocolTest.php @@ -0,0 +1,85 @@ +createMock(TProtocol::class); + $multiplexedProtocol = new TMultiplexedProtocol($protocol, $serviceName); + + $protocol->expects($this->once()) + ->method('writeMessageBegin') + ->with($expectedName, $type, $seqid); + + $multiplexedProtocol->writeMessageBegin($name, $type, $seqid); + } + + public function writeMessageBeginDataProvider() + { + yield 'messageTypeCall' => [ + 'serviceName' => 'serviceName', + 'name' => 'testName', + 'type' => TMessageType::CALL, + 'seqid' => 1, + 'expectedName' => 'serviceName:testName' + ]; + yield 'messageTypeOneWay' => [ + 'serviceName' => 'serviceName', + 'name' => 'testName', + 'type' => TMessageType::ONEWAY, + 'seqid' => 1, + 'expectedName' => 'serviceName:testName' + ]; + yield 'messageTypeReply' => [ + 'serviceName' => 'serviceName', + 'name' => 'testName', + 'type' => TMessageType::REPLY, + 'seqid' => 1, + 'expectedName' => 'testName' + ]; + yield 'messageTypeException' => [ + 'serviceName' => 'serviceName', + 'name' => 'testName', + 'type' => TMessageType::EXCEPTION, + 'seqid' => 1, + 'expectedName' => 'testName' + ]; + + } +} diff --git a/lib/php/test/Unit/Lib/Protocol/TProtocolDecoratorTest.php b/lib/php/test/Unit/Lib/Protocol/TProtocolDecoratorTest.php new file mode 100644 index 00000000000..e5dbdb36b29 --- /dev/null +++ b/lib/php/test/Unit/Lib/Protocol/TProtocolDecoratorTest.php @@ -0,0 +1,96 @@ +createMock(TProtocol::class); + $decorator = new class ($concreteProtocol) extends TProtocolDecorator { + public function __construct(TProtocol $protocol) + { + parent::__construct($protocol); + } + }; + + $concreteProtocol->expects($this->once()) + ->method($methodName) + ->with(...$methodArguments); + + $decorator->$methodName(...$methodArguments); + } + + public function methodDecorationDataProvider() + { + yield 'writeMessageBegin' => ['writeMessageBegin', ['name', 'type', 'seqid']]; + yield 'writeMessageEnd' => ['writeMessageEnd', []]; + yield 'writeStructBegin' => ['writeStructBegin', ['name']]; + yield 'writeStructEnd' => ['writeStructEnd', []]; + yield 'writeFieldBegin' => ['writeFieldBegin', ['name', 'type', 'id']]; + yield 'writeFieldEnd' => ['writeFieldEnd', []]; + yield 'writeFieldStop' => ['writeFieldStop', []]; + yield 'writeMapBegin' => ['writeMapBegin', ['keyType', 'valType', 'size']]; + yield 'writeMapEnd' => ['writeMapEnd', []]; + yield 'writeListBegin' => ['writeListBegin', ['elemType', 'size']]; + yield 'writeListEnd' => ['writeListEnd', []]; + yield 'writeSetBegin' => ['writeSetBegin', ['elemType', 'size']]; + yield 'writeSetEnd' => ['writeSetEnd', []]; + yield 'writeBool' => ['writeBool', ['value']]; + yield 'writeByte' => ['writeByte', ['value']]; + yield 'writeI16' => ['writeI16', ['value']]; + yield 'writeI32' => ['writeI32', ['value']]; + yield 'writeI64' => ['writeI64', ['value']]; + yield 'writeDouble' => ['writeDouble', ['value']]; + yield 'writeString' => ['writeString', ['value']]; + yield 'readMessageBegin' => ['readMessageBegin', ['name', 'type', 'seqid']]; + yield 'readMessageEnd' => ['readMessageEnd', []]; + yield 'readStructBegin' => ['readStructBegin', ['name']]; + yield 'readStructEnd' => ['readStructEnd', []]; + yield 'readFieldBegin' => ['readFieldBegin', ['name', 'type', 'id']]; + yield 'readFieldEnd' => ['readFieldEnd', []]; + yield 'readMapBegin' => ['readMapBegin', ['keyType', 'valType', 'size']]; + yield 'readMapEnd' => ['readMapEnd', []]; + yield 'readListBegin' => ['readListBegin', ['elemType', 'size']]; + yield 'readListEnd' => ['readListEnd', []]; + yield 'readSetBegin' => ['readSetBegin', ['elemType', 'size']]; + yield 'readSetEnd' => ['readSetEnd', []]; + yield 'readBool' => ['readBool', ['value']]; + yield 'readByte' => ['readByte', ['value']]; + yield 'readI16' => ['readI16', ['value']]; + yield 'readI32' => ['readI32', ['value']]; + yield 'readI64' => ['readI64', ['value']]; + yield 'readDouble' => ['readDouble', ['value']]; + yield 'readString' => ['readString', ['value']]; + } +} diff --git a/lib/php/test/Unit/Lib/Protocol/TSimpleJSONProtocolTest.php b/lib/php/test/Unit/Lib/Protocol/TSimpleJSONProtocolTest.php new file mode 100644 index 00000000000..e4d005a45ae --- /dev/null +++ b/lib/php/test/Unit/Lib/Protocol/TSimpleJSONProtocolTest.php @@ -0,0 +1,133 @@ +expectException(TException::class); + $this->expectExceptionMessage("Not implemented"); + + $transport = $this->createMock(TTransport::class); + $protocol = new TSimpleJSONProtocol($transport); + $protocol->$methodName(...$methodArguments); + } + + public function readDataProvider() + { + yield 'readMessageBegin' => [ + 'methodName' => 'readMessageBegin', + 'methodArguments' => ['name', 'type', 'seqId'], + ]; + yield 'readMessageEnd' => [ + 'methodName' => 'readMessageEnd', + 'methodArguments' => [], + ]; + yield 'readStructBegin' => [ + 'methodName' => 'readStructBegin', + 'methodArguments' => ['name'], + ]; + yield 'readStructEnd' => [ + 'methodName' => 'readStructEnd', + 'methodArguments' => [], + ]; + yield 'readFieldBegin' => [ + 'methodName' => 'readFieldBegin', + 'methodArguments' => ['name', TType::STRING, 1], + ]; + yield 'readFieldEnd' => [ + 'methodName' => 'readFieldEnd', + 'methodArguments' => [], + ]; + yield 'readMapBegin' => [ + 'methodName' => 'readMapBegin', + 'methodArguments' => [TType::STRING, TType::STRING, 1], + ]; + yield 'readMapEnd' => [ + 'methodName' => 'readMapEnd', + 'methodArguments' => [], + ]; + yield 'readListBegin' => [ + 'methodName' => 'readListBegin', + 'methodArguments' => [TType::STRING, 1], + ]; + yield 'readListEnd' => [ + 'methodName' => 'readListEnd', + 'methodArguments' => [], + ]; + yield 'readSetBegin' => [ + 'methodName' => 'readSetBegin', + 'methodArguments' => [TType::STRING, 1], + ]; + yield 'readSetEnd' => [ + 'methodName' => 'readSetEnd', + 'methodArguments' => [], + ]; + yield 'readBool' => [ + 'methodName' => 'readBool', + 'methodArguments' => [true], + ]; + yield 'readByte' => [ + 'methodName' => 'readByte', + 'methodArguments' => [0x01], + ]; + yield 'readI16' => [ + 'methodName' => 'readI16', + 'methodArguments' => [1], + ]; + yield 'readI32' => [ + 'methodName' => 'readI32', + 'methodArguments' => [1], + ]; + yield 'readI64' => [ + 'methodName' => 'readI64', + 'methodArguments' => [1], + ]; + yield 'readDouble' => [ + 'methodName' => 'readDouble', + 'methodArguments' => [0.1], + ]; + yield 'readString' => [ + 'methodName' => 'readString', + 'methodArguments' => ['string'], + ]; + } +} diff --git a/lib/php/test/Unit/Lib/Serializer/TBinarySerializerTest.php b/lib/php/test/Unit/Lib/Serializer/TBinarySerializerTest.php new file mode 100644 index 00000000000..292f261892c --- /dev/null +++ b/lib/php/test/Unit/Lib/Serializer/TBinarySerializerTest.php @@ -0,0 +1,38 @@ +markTestIncomplete('Could not test static function which create instances during execution'); + } + + public function testDeserialize() + { + $this->markTestIncomplete('Could not test static function which create instances during execution'); + } +} diff --git a/lib/php/test/Unit/TJSONProtocolTest.php b/lib/php/test/Unit/TJSONProtocolTest.php deleted file mode 100644 index 9837803708b..00000000000 --- a/lib/php/test/Unit/TJSONProtocolTest.php +++ /dev/null @@ -1,514 +0,0 @@ -registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/php'); - $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/php'); - $loader->register(); - - Fixtures::populateTestArgs(); - TJSONProtocolFixtures::populateTestArgsJSON(); - } - - public function setUp(): void - { - $this->transport = new TMemoryBuffer(); - $this->protocol = new TJSONProtocol($this->transport); - $this->transport->open(); - } - - /** - * WRITE TESTS - */ - public function testVoidWrite() - { - $args = new \ThriftTest\ThriftTest_testVoid_args(); - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testVoid']; - - $this->assertEquals($expected, $actual); - } - - public function testString1Write() - { - $args = new \ThriftTest\ThriftTest_testString_args(); - $args->thing = Fixtures::$testArgs['testString1']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testString1']; - - $this->assertEquals($expected, $actual); - } - - public function testString2Write() - { - $args = new \ThriftTest\ThriftTest_testString_args(); - $args->thing = Fixtures::$testArgs['testString2']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testString2']; - - $this->assertEquals($expected, $actual); - } - - public function testDoubleWrite() - { - $args = new \ThriftTest\ThriftTest_testDouble_args(); - $args->thing = Fixtures::$testArgs['testDouble']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testDouble']; - - $this->assertEquals($expected, $actual); - } - - public function testByteWrite() - { - $args = new \ThriftTest\ThriftTest_testByte_args(); - $args->thing = Fixtures::$testArgs['testByte']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testByte']; - - $this->assertEquals($expected, $actual); - } - - public function testI32Write() - { - $args = new \ThriftTest\ThriftTest_testI32_args(); - $args->thing = Fixtures::$testArgs['testI32']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testI32']; - - $this->assertEquals($expected, $actual); - } - - public function testI64Write() - { - $args = new \ThriftTest\ThriftTest_testI64_args(); - $args->thing = Fixtures::$testArgs['testI64']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testI64']; - - $this->assertEquals($expected, $actual); - } - - public function testStructWrite() - { - $args = new \ThriftTest\ThriftTest_testStruct_args(); - $args->thing = Fixtures::$testArgs['testStruct']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testStruct']; - - $this->assertEquals($expected, $actual); - } - - public function testNestWrite() - { - $args = new \ThriftTest\ThriftTest_testNest_args(); - $args->thing = Fixtures::$testArgs['testNest']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testNest']; - - $this->assertEquals($expected, $actual); - } - - public function testMapWrite() - { - $args = new \ThriftTest\ThriftTest_testMap_args(); - $args->thing = Fixtures::$testArgs['testMap']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testMap']; - - $this->assertEquals($expected, $actual); - } - - public function testStringMapWrite() - { - $args = new \ThriftTest\ThriftTest_testStringMap_args(); - $args->thing = Fixtures::$testArgs['testStringMap']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testStringMap']; - - /* - * The $actual returns unescaped string. - * It is required to to decode then encode it again - * to get the expected escaped unicode. - */ - $this->assertEquals($expected, json_encode(json_decode($actual))); - } - - public function testSetWrite() - { - $args = new \ThriftTest\ThriftTest_testSet_args(); - $args->thing = Fixtures::$testArgs['testSet']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testSet']; - - $this->assertEquals($expected, $actual); - } - - public function testListWrite() - { - $args = new \ThriftTest\ThriftTest_testList_args(); - $args->thing = Fixtures::$testArgs['testList']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testList']; - - $this->assertEquals($expected, $actual); - } - - public function testEnumWrite() - { - $args = new \ThriftTest\ThriftTest_testEnum_args(); - $args->thing = Fixtures::$testArgs['testEnum']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testEnum']; - - $this->assertEquals($expected, $actual); - } - - public function testTypedefWrite() - { - $args = new \ThriftTest\ThriftTest_testTypedef_args(); - $args->thing = Fixtures::$testArgs['testTypedef']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testTypedef']; - - $this->assertEquals($expected, $actual); - } - - /** - * READ TESTS - */ - public function testVoidRead() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testVoid'] - ); - $args = new \ThriftTest\ThriftTest_testVoid_args(); - $result = $args->read($this->protocol); - - $this->assertEquals(0, $result); - } - - public function testString1Read() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testString1'] - ); - $args = new \ThriftTest\ThriftTest_testString_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testString1']; - - $this->assertEquals($expected, $actual); - } - - public function testString2Read() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testString2'] - ); - $args = new \ThriftTest\ThriftTest_testString_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testString2']; - - $this->assertEquals($expected, $actual); - } - - public function testString3Write() - { - $args = new \ThriftTest\ThriftTest_testString_args(); - $args->thing = Fixtures::$testArgs['testString3']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testString3']; - - $this->assertEquals($expected, $actual); - } - - public function testString4Write() - { - $args = new \ThriftTest\ThriftTest_testString_args(); - $args->thing = Fixtures::$testArgs['testUnicodeStringWithNonBMP']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TJSONProtocolFixtures::$testArgsJSON['testUnicodeStringWithNonBMP']; - - $this->assertEquals($expected, $actual); - } - - public function testDoubleRead() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testDouble'] - ); - $args = new \ThriftTest\ThriftTest_testDouble_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testDouble']; - - $this->assertEquals($expected, $actual); - } - - public function testByteRead() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testByte'] - ); - $args = new \ThriftTest\ThriftTest_testByte_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testByte']; - - $this->assertEquals($expected, $actual); - } - - public function testI32Read() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testI32'] - ); - $args = new \ThriftTest\ThriftTest_testI32_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testI32']; - - $this->assertEquals($expected, $actual); - } - - public function testI64Read() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testI64'] - ); - $args = new \ThriftTest\ThriftTest_testI64_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testI64']; - - $this->assertEquals($expected, $actual); - } - - public function testStructRead() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testStruct'] - ); - $args = new \ThriftTest\ThriftTest_testStruct_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testStruct']; - - $this->assertEquals($expected, $actual); - } - - public function testNestRead() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testNest'] - ); - $args = new \ThriftTest\ThriftTest_testNest_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testNest']; - - $this->assertEquals($expected, $actual); - } - - public function testMapRead() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testMap'] - ); - $args = new \ThriftTest\ThriftTest_testMap_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testMap']; - - $this->assertEquals($expected, $actual); - } - - public function testStringMapRead() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testStringMap'] - ); - $args = new \ThriftTest\ThriftTest_testStringMap_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testStringMap']; - - $this->assertEquals($expected, $actual); - } - - public function testSetRead() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testSet'] - ); - $args = new \ThriftTest\ThriftTest_testSet_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testSet']; - - $this->assertEquals($expected, $actual); - } - - public function testListRead() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testList'] - ); - $args = new \ThriftTest\ThriftTest_testList_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testList']; - - $this->assertEquals($expected, $actual); - } - - public function testEnumRead() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testEnum'] - ); - $args = new \ThriftTest\ThriftTest_testEnum_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testEnum']; - - $this->assertEquals($expected, $actual); - } - - public function testTypedefRead() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testTypedef'] - ); - $args = new \ThriftTest\ThriftTest_testTypedef_args(); - $args->read($this->protocol); - - $actual = $args->thing; - $expected = Fixtures::$testArgs['testTypedef']; - - $this->assertEquals($expected, $actual); - } - - public function testMapMapRead() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testMapMap'] - ); - $result = new \ThriftTest\ThriftTest_testMapMap_result(); - $result->read($this->protocol); - - $actual = $result->success; - $expected = Fixtures::$testArgs['testMapMapExpectedResult']; - - $this->assertEquals($expected, $actual); - } - - public function testInsanityRead() - { - $this->transport->write( - TJSONProtocolFixtures::$testArgsJSON['testInsanity'] - ); - $result = new \ThriftTest\ThriftTest_testInsanity_result(); - $result->read($this->protocol); - - $actual = $result->success; - $expected = Fixtures::$testArgs['testInsanityExpectedResult']; - - $this->assertEquals($expected, $actual); - } -} diff --git a/lib/php/test/Unit/TSimpleJSONProtocolTest.php b/lib/php/test/Unit/TSimpleJSONProtocolTest.php deleted file mode 100644 index 8e6a6d91743..00000000000 --- a/lib/php/test/Unit/TSimpleJSONProtocolTest.php +++ /dev/null @@ -1,247 +0,0 @@ -registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/php'); - $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/php'); - $loader->register(); - - Fixtures::populateTestArgs(); - TSimpleJSONProtocolFixtures::populateTestArgsSimpleJSON(); - } - - public function setUp(): void - { - $this->transport = new TMemoryBuffer(); - $this->protocol = new TSimpleJSONProtocol($this->transport); - $this->transport->open(); - } - - /** - * WRITE TESTS - */ - public function testVoidWrite() - { - $args = new \ThriftTest\ThriftTest_testVoid_args(); - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testVoid']; - - $this->assertEquals($expected, $actual); - } - - public function testString1Write() - { - $args = new \ThriftTest\ThriftTest_testString_args(); - $args->thing = Fixtures::$testArgs['testString1']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testString1']; - - $this->assertEquals($expected, $actual); - } - - public function testString2Write() - { - $args = new \ThriftTest\ThriftTest_testString_args(); - $args->thing = Fixtures::$testArgs['testString2']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testString2']; - - $this->assertEquals($expected, $actual); - } - - public function testDoubleWrite() - { - $args = new \ThriftTest\ThriftTest_testDouble_args(); - $args->thing = Fixtures::$testArgs['testDouble']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testDouble']; - - $this->assertEquals($expected, $actual); - } - - public function testByteWrite() - { - $args = new \ThriftTest\ThriftTest_testByte_args(); - $args->thing = Fixtures::$testArgs['testByte']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testByte']; - - $this->assertEquals($expected, $actual); - } - - public function testI32Write() - { - $args = new \ThriftTest\ThriftTest_testI32_args(); - $args->thing = Fixtures::$testArgs['testI32']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testI32']; - - $this->assertEquals($expected, $actual); - } - - public function testI64Write() - { - $args = new \ThriftTest\ThriftTest_testI64_args(); - $args->thing = Fixtures::$testArgs['testI64']; - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testI64']; - - $this->assertEquals($expected, $actual); - } - - public function testStructWrite() - { - $args = new \ThriftTest\ThriftTest_testStruct_args(); - $args->thing = Fixtures::$testArgs['testStruct']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testStruct']; - - $this->assertEquals($expected, $actual); - } - - public function testNestWrite() - { - $args = new \ThriftTest\ThriftTest_testNest_args(); - $args->thing = Fixtures::$testArgs['testNest']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testNest']; - - $this->assertEquals($expected, $actual); - } - - public function testMapWrite() - { - $args = new \ThriftTest\ThriftTest_testMap_args(); - $args->thing = Fixtures::$testArgs['testMap']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testMap']; - - $this->assertEquals($expected, $actual); - } - - public function testStringMapWrite() - { - $args = new \ThriftTest\ThriftTest_testStringMap_args(); - $args->thing = Fixtures::$testArgs['testStringMap']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testStringMap']; - - $this->assertEquals($expected, $actual); - } - - public function testSetWrite() - { - $args = new \ThriftTest\ThriftTest_testSet_args(); - $args->thing = Fixtures::$testArgs['testSet']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testSet']; - - $this->assertEquals($expected, $actual); - } - - public function testListWrite() - { - $args = new \ThriftTest\ThriftTest_testList_args(); - $args->thing = Fixtures::$testArgs['testList']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testList']; - - $this->assertEquals($expected, $actual); - } - - public function testEnumWrite() - { - $args = new \ThriftTest\ThriftTest_testEnum_args(); - $args->thing = Fixtures::$testArgs['testEnum']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testEnum']; - - $this->assertEquals($expected, $actual); - } - - public function testTypedefWrite() - { - $args = new \ThriftTest\ThriftTest_testTypedef_args(); - $args->thing = Fixtures::$testArgs['testTypedef']; - - $args->write($this->protocol); - - $actual = $this->transport->read(Fixtures::$bufsize); - $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testTypedef']; - - $this->assertEquals($expected, $actual); - } -} diff --git a/lib/php/test/bootstrap.php b/lib/php/test/bootstrap.php new file mode 100644 index 00000000000..c6291e51798 --- /dev/null +++ b/lib/php/test/bootstrap.php @@ -0,0 +1,16 @@ +registerNamespace('Basic', __DIR__ . '/Resources/packages/php'); +$loader->registerNamespace('Validate', __DIR__ . '/Resources/packages/phpv'); +$loader->registerNamespace('ValidateOop', __DIR__ . '/Resources/packages/phpvo'); +$loader->registerNamespace('Json', __DIR__ . '/Resources/packages/phpjs'); + +#do not load this namespace here, it will be loaded in ClassLoaderTest +//$loader->registerNamespace('Server', __DIR__ . '/Resources/packages/phpcm'); + +$loader->register(); diff --git a/test/php/Client.php b/test/php/Client.php new file mode 100644 index 00000000000..1cd424126e1 --- /dev/null +++ b/test/php/Client.php @@ -0,0 +1,26 @@ +registerDefinition('ThriftTest', __DIR__ . '/../../lib/php/test/Resources/packages/phpcm'); +$loader->register(); + + +$transport = new THttpClient('localhost', 80); + +$transport->setTimeoutSecs($this->timeoutSec); + +$transport->addHeaders($this->generateAuthHeader()); + +$protocol = new TCompactProtocol($transport); + +$transport->open(); + +$client = new \ThriftTest\ThriftTestClient($protocol); +$client->testVoid(); diff --git a/test/php/Handler.php b/test/php/Handler.php new file mode 100644 index 00000000000..5ca06a21d03 --- /dev/null +++ b/test/php/Handler.php @@ -0,0 +1,114 @@ +registerDefinition('ThriftTest', __DIR__ . '/../../lib/php/test/Resources/packages/phpcm'); +$loader->register(); + +$sslOptions = \stream_context_create( + [ + 'ssl' => [ + 'verify_peer' => false, + 'verify_peer_name' => false, + ], + ] +); + +require_once __DIR__ . '/Handler.php'; + +switch ($transport) { + case 'framed': + $serverTransportFactory = new \Thrift\Factory\TFramedTransportFactory(); + break; + default: + $serverTransportFactory = new \Thrift\Factory\TTransportFactory(); +} + +$serverTransport = new \Thrift\Server\TServerSocket('localhost', $port); +$handler = new Handler(); +$processor = new ThriftTest\ThriftTestProcessor($handler); + +$server = new \Thrift\Server\TSimpleServer( + $processor, + $serverTransport, + $serverTransportFactory, + $serverTransportFactory, + new \Thrift\Factory\TBinaryProtocolFactory(), + new \Thrift\Factory\TBinaryProtocolFactory() +); + +echo "Starting the Test server...\n"; +$server->serve(); diff --git a/test/php/test_php.ini b/test/php/test_php.ini index aeb67cbd411..5eecb329618 100644 --- a/test/php/test_php.ini +++ b/test/php/test_php.ini @@ -1,3 +1,3 @@ -extension=thrift_protocol.so -extension=json.so -extension=sockets.so +;extension=thrift_protocol.so +;extension=json.so +;extension=sockets.so diff --git a/test/tests.json b/test/tests.json index 7eb9f65b9dd..91aa767f35c 100644 --- a/test/tests.json +++ b/test/tests.json @@ -539,6 +539,31 @@ }, { "name": "php", + "server": { + "transports": [ + "buffered", + "framed" + ], + "sockets": [ + "ip" + ], + "protocols": [ + "binary", + "binary:accel", + "compact", + "json" + ], + "command": [ + "php", + "-dextension_dir=php_ext_dir", + "--php-ini=test_php.ini", + "--no-php-ini", + "-ddisplay_errors=stderr", + "-dlog_errors=0", + "-derror_reporting=E_ALL", + "TestServer.php" + ] + }, "client": { "timeout": 6, "transports": [ From 4a280d56cca90296228ca29c7c582fa423d74e1f Mon Sep 17 00:00:00 2001 From: CJCombrink Date: Thu, 14 Mar 2024 19:57:41 +0100 Subject: [PATCH 052/430] THRIFT-5766 Replace std::endl with "\n" Patch: Carel Combrink This closes #2943 --- .../thrift/generate/go_validator_generator.cc | 204 +- .../src/thrift/generate/t_c_glib_generator.cc | 1936 +++++++------- .../cpp/src/thrift/generate/t_cl_generator.cc | 56 +- .../src/thrift/generate/t_cpp_generator.cc | 1717 +++++++------ .../cpp/src/thrift/generate/t_d_generator.cc | 162 +- .../src/thrift/generate/t_dart_generator.cc | 503 ++-- .../src/thrift/generate/t_delphi_generator.cc | 1258 +++++---- .../src/thrift/generate/t_erl_generator.cc | 120 +- .../cpp/src/thrift/generate/t_generator.cc | 10 +- .../cpp/src/thrift/generate/t_go_generator.cc | 1444 +++++------ .../cpp/src/thrift/generate/t_go_generator.h | 2 - .../cpp/src/thrift/generate/t_gv_generator.cc | 46 +- .../src/thrift/generate/t_haxe_generator.cc | 826 +++--- .../src/thrift/generate/t_html_generator.cc | 136 +- .../src/thrift/generate/t_java_generator.cc | 2255 ++++++++--------- .../src/thrift/generate/t_javame_generator.cc | 1066 ++++---- .../cpp/src/thrift/generate/t_js_generator.cc | 835 +++--- .../src/thrift/generate/t_json_generator.cc | 18 +- .../src/thrift/generate/t_kotlin_generator.cc | 623 +++-- .../src/thrift/generate/t_lua_generator.cc | 292 ++- .../thrift/generate/t_markdown_generator.cc | 181 +- .../src/thrift/generate/t_netstd_generator.cc | 1208 ++++----- .../src/thrift/generate/t_netstd_generator.h | 22 +- .../src/thrift/generate/t_ocaml_generator.cc | 416 ++- .../cpp/src/thrift/generate/t_oop_generator.h | 4 +- .../src/thrift/generate/t_perl_generator.cc | 430 ++-- .../src/thrift/generate/t_php_generator.cc | 812 +++--- .../cpp/src/thrift/generate/t_py_generator.cc | 1084 ++++---- .../cpp/src/thrift/generate/t_rb_generator.cc | 212 +- .../cpp/src/thrift/generate/t_rs_generator.cc | 891 ++++--- .../cpp/src/thrift/generate/t_st_generator.cc | 170 +- .../src/thrift/generate/t_swift_generator.cc | 716 +++--- .../src/thrift/generate/t_xml_generator.cc | 15 +- .../src/thrift/generate/t_xsd_generator.cc | 76 +- .../t_netcore_generator_helpers_tests.cc | 10 +- contrib/fb303/TClientInfo.cpp | 4 +- contrib/fb303/cpp/ServiceTracker.cpp | 2 +- contrib/thrift_dump.cpp | 4 +- contrib/zeromq/test-client.cpp | 2 +- lib/c_glib/test/testthrifttestclient.cpp | 49 +- lib/c_glib/test/testthrifttestzlibclient.cpp | 49 +- .../src/thrift/async/TEvhttpClientChannel.cpp | 3 +- lib/cpp/src/thrift/async/TEvhttpServer.cpp | 7 +- .../src/thrift/transport/TFileTransport.cpp | 6 +- lib/cpp/test/Benchmark.cpp | 25 +- lib/cpp/test/OneWayHTTPTest.cpp | 9 +- lib/cpp/test/TMemoryBufferTest.cpp | 2 - lib/cpp/test/TServerSocketTest.cpp | 2 +- lib/cpp/test/ThrifttReadCheckTests.cpp | 2 - lib/cpp/test/concurrency/Tests.cpp | 70 +- lib/cpp/test/concurrency/ThreadFactoryTests.h | 26 +- lib/cpp/test/concurrency/ThreadManagerTests.h | 82 +- lib/cpp/test/concurrency/TimerManagerTests.h | 10 +- test/cpp/src/StressTest.cpp | 40 +- test/cpp/src/StressTestNonBlocking.cpp | 42 +- test/cpp/src/TestClient.cpp | 186 +- test/cpp/src/TestServer.cpp | 10 +- tutorial/cpp/CppClient.cpp | 18 +- tutorial/cpp/CppServer.cpp | 14 +- 59 files changed, 10171 insertions(+), 10249 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/go_validator_generator.cc b/compiler/cpp/src/thrift/generate/go_validator_generator.cc index 1f5a3ad6eca..0adff2ee984 100644 --- a/compiler/cpp/src/thrift/generate/go_validator_generator.cc +++ b/compiler/cpp/src/thrift/generate/go_validator_generator.cc @@ -82,19 +82,19 @@ void go_validator_generator::generate_field_validator(std::ostream& out, } if (type->is_enum()) { if (context.tgt[0] == '*') { - out << indent() << "if " << context.tgt.substr(1) << " != nil {" << endl; + out << indent() << "if " << context.tgt.substr(1) << " != nil {" << '\n'; indent_up(); } generate_enum_field_validator(out, context); if (context.tgt[0] == '*') { indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } return; } else if (type->is_base_type()) { t_base_type::t_base tbase = ((t_base_type*)type)->get_base(); if (context.tgt[0] == '*') { - out << indent() << "if " << context.tgt.substr(1) << " != nil {" << endl; + out << indent() << "if " << context.tgt.substr(1) << " != nil {" << '\n'; indent_up(); } switch (tbase) { @@ -119,7 +119,7 @@ void go_validator_generator::generate_field_validator(std::ostream& out, } if (context.tgt[0] == '*') { indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } return; } else if (type->is_list()) { @@ -146,7 +146,7 @@ void go_validator_generator::generate_enum_field_validator(std::ostream& out, if (key == "vt.in") { if (values.size() > 1) { std::string exist = GenID("_exist"); - out << indent() << "var " << exist << " bool" << endl; + out << indent() << "var " << exist << " bool" << '\n'; std::string src = GenID("_src"); out << indent() << src << " := []int64{"; @@ -162,19 +162,19 @@ void go_validator_generator::generate_enum_field_validator(std::ostream& out, } out << ")"; } - out << "}" << endl; + out << "}" << '\n'; - out << indent() << "for _, src := range " << src << " {" << endl; + out << indent() << "for _, src := range " << src << " {" << '\n'; indent_up(); - out << indent() << "if int64(" << context.tgt << ") == src {" << endl; + out << indent() << "if int64(" << context.tgt << ") == src {" << '\n'; indent_up(); - out << indent() << exist << " = true" << endl; - out << indent() << "break" << endl; + out << indent() << exist << " = true" << '\n'; + out << indent() << "break" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl; - out << indent() << "if " << exist << " == false {" << endl; + out << indent() << "}" << '\n'; + out << indent() << "if " << exist << " == false {" << '\n'; } else { out << indent() << "if int64(" << context.tgt << ") != int64("; if (values[0]->is_field_reference()) { @@ -182,18 +182,18 @@ void go_validator_generator::generate_enum_field_validator(std::ostream& out, } else { out << values[0]->get_enum()->get_value(); } - out << ") {" << endl; + out << ") {" << '\n'; } indent_up(); out << indent() << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"vt.in\", \"" << context.field_symbol << "\", \"" << context.field_symbol - << " not valid, rule vt.in check failed\")" << endl; + << " not valid, rule vt.in check failed\")" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; if (values.size() > 1) { indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } else if (key == "vt.not_in") { if (values.size() > 1) { @@ -211,11 +211,11 @@ void go_validator_generator::generate_enum_field_validator(std::ostream& out, } out << ")"; } - out << "}" << endl; + out << "}" << '\n'; - out << indent() << "for _, src := range " << src << " {" << endl; + out << indent() << "for _, src := range " << src << " {" << '\n'; indent_up(); - out << indent() << "if int64(" << context.tgt << ") == src {" << endl; + out << indent() << "if int64(" << context.tgt << ") == src {" << '\n'; } else { out << indent() << "if int64(" << context.tgt << ") == "; out << "int64("; @@ -224,18 +224,18 @@ void go_validator_generator::generate_enum_field_validator(std::ostream& out, } else { out << values[0]->get_enum()->get_value(); } - out << ") {" << endl; + out << ") {" << '\n'; } indent_up(); out << indent() << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"vt.not_in\", \"" << context.field_symbol << "\", \"" << context.field_symbol - << " not valid, rule vt.not_in check failed\")" << endl; + << " not valid, rule vt.not_in check failed\")" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; if (values.size() > 1) { indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } else if (key == "vt.defined_only") { if (values[0]->get_bool()) { @@ -243,14 +243,14 @@ void go_validator_generator::generate_enum_field_validator(std::ostream& out, } else { continue; } - out << "{" << endl; + out << "{" << '\n'; indent_up(); out << indent() << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \"" << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key - << " check failed\")" << endl; + << " check failed\")" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } } @@ -276,14 +276,14 @@ void go_validator_generator::generate_bool_field_validator(std::ostream& out, } } } - out << "{" << endl; + out << "{" << '\n'; indent_up(); out << indent() << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \"" << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key - << " check failed\")" << endl; + << " check failed\")" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } @@ -308,19 +308,19 @@ void go_validator_generator::generate_double_field_validator(std::ostream& out, } else { out << values[0]->get_double(); } - out << "{" << endl; + out << "{" << '\n'; indent_up(); out << indent() << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \"" << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key - << " check failed\")" << endl; + << " check failed\")" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; continue; } else if (key == "vt.in") { if (values.size() > 1) { std::string exist = GenID("_exist"); - out << indent() << "var " << exist << " bool" << endl; + out << indent() << "var " << exist << " bool" << '\n'; std::string src = GenID("_src"); out << indent() << src << " := []float64{"; @@ -334,19 +334,19 @@ void go_validator_generator::generate_double_field_validator(std::ostream& out, out << (*it)->get_double(); } } - out << "}" << endl; + out << "}" << '\n'; - out << indent() << "for _, src := range " << src << " {" << endl; + out << indent() << "for _, src := range " << src << " {" << '\n'; indent_up(); - out << indent() << "if " << context.tgt << " == src {" << endl; + out << indent() << "if " << context.tgt << " == src {" << '\n'; indent_up(); - out << indent() << exist << " = true" << endl; - out << indent() << "break" << endl; + out << indent() << exist << " = true" << '\n'; + out << indent() << "break" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl; - out << indent() << "if " << exist << " == false {" << endl; + out << indent() << "}" << '\n'; + out << indent() << "if " << exist << " == false {" << '\n'; } else { out << indent() << "if " << context.tgt << " != "; if (values[0]->is_field_reference()) { @@ -354,16 +354,16 @@ void go_validator_generator::generate_double_field_validator(std::ostream& out, } else { out << values[0]->get_double(); } - out << "{" << endl; + out << "{" << '\n'; } indent_up(); out << indent() << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"vt.in\", \"" << context.field_symbol << "\", \"" << context.field_symbol - << " not valid, rule vt.in check failed\")" << endl; + << " not valid, rule vt.in check failed\")" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } else if (key == "vt.not_in") { if (values.size() > 1) { std::string src = GenID("_src"); @@ -378,11 +378,11 @@ void go_validator_generator::generate_double_field_validator(std::ostream& out, out << (*it)->get_double(); } } - out << "}" << endl; + out << "}" << '\n'; - out << indent() << "for _, src := range " << src << " {" << endl; + out << indent() << "for _, src := range " << src << " {" << '\n'; indent_up(); - out << indent() << "if " << context.tgt << " == src {" << endl; + out << indent() << "if " << context.tgt << " == src {" << '\n'; } else { out << indent() << "if " << context.tgt << " == "; if (values[0]->is_field_reference()) { @@ -390,18 +390,18 @@ void go_validator_generator::generate_double_field_validator(std::ostream& out, } else { out << values[0]->get_double(); } - out << "{" << endl; + out << "{" << '\n'; } indent_up(); out << indent() << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"vt.not_in\", \"" << context.field_symbol << "\", \"" << context.field_symbol - << " not valid, rule vt.not_in check failed\")" << endl; + << " not valid, rule vt.not_in check failed\")" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; if (values.size() > 1) { indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } } @@ -460,18 +460,18 @@ void go_validator_generator::generate_integer_field_validator(std::ostream& out, } else { out << values[0]->get_int(); } - out << "{" << endl; + out << "{" << '\n'; indent_up(); out << indent() << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \"" << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key - << " check failed\")" << endl; + << " check failed\")" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } else if (key == "vt.in") { if (values.size() > 1) { std::string exist = GenID("_exist"); - out << indent() << "var " << exist << " bool" << endl; + out << indent() << "var " << exist << " bool" << '\n'; std::string src = GenID("_src"); out << indent() << src << " := []"; @@ -499,19 +499,19 @@ void go_validator_generator::generate_integer_field_validator(std::ostream& out, out << (*it)->get_int(); } } - out << "}" << endl; + out << "}" << '\n'; - out << indent() << "for _, src := range " << src << " {" << endl; + out << indent() << "for _, src := range " << src << " {" << '\n'; indent_up(); - out << indent() << "if " << context.tgt << " == src {" << endl; + out << indent() << "if " << context.tgt << " == src {" << '\n'; indent_up(); - out << indent() << exist << " = true" << endl; - out << indent() << "break" << endl; + out << indent() << exist << " = true" << '\n'; + out << indent() << "break" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl; - out << indent() << "if " << exist << " == false {" << endl; + out << indent() << "}" << '\n'; + out << indent() << "if " << exist << " == false {" << '\n'; } else { out << indent() << "if " << context.tgt << " != "; if (values[0]->is_field_reference()) { @@ -531,15 +531,15 @@ void go_validator_generator::generate_integer_field_validator(std::ostream& out, } else { out << values[0]->get_int(); } - out << "{" << endl; + out << "{" << '\n'; } indent_up(); out << indent() << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"vt.in\", \"" << context.field_symbol << "\", \"" << context.field_symbol - << " not valid, rule vt.in check failed\")" << endl; + << " not valid, rule vt.in check failed\")" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } else if (key == "vt.not_in") { if (values.size() > 1) { std::string src = GenID("_src"); @@ -584,11 +584,11 @@ void go_validator_generator::generate_integer_field_validator(std::ostream& out, out << (*it)->get_int(); } } - out << "}" << endl; + out << "}" << '\n'; - out << indent() << "for _, src := range " << src << " {" << endl; + out << indent() << "for _, src := range " << src << " {" << '\n'; indent_up(); - out << indent() << "if " << context.tgt << " == src {" << endl; + out << indent() << "if " << context.tgt << " == src {" << '\n'; } else { out << indent() << "if " << context.tgt << " == "; if (values[0]->is_field_reference()) { @@ -608,18 +608,18 @@ void go_validator_generator::generate_integer_field_validator(std::ostream& out, } else { out << values[0]->get_int(); } - out << "{" << endl; + out << "{" << '\n'; } indent_up(); out << indent() << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"vt.not_in\", \"" << context.field_symbol << "\", \"" << context.field_symbol - << " not valid, rule vt.not_in check failed\")" << endl; + << " not valid, rule vt.not_in check failed\")" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; if (values.size() > 1) { indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } } @@ -635,7 +635,7 @@ void go_validator_generator::generate_string_field_validator(std::ostream& out, if (type->is_binary()) { target = GenID("_tgt"); out << indent() << target << " := " - << "string(" << context.tgt << ")" << endl; + << "string(" << context.tgt << ")" << '\n'; } for (auto it = context.rules.begin(); it != context.rules.end(); it++) { const std::vector& values = (*it)->get_values(); @@ -729,14 +729,14 @@ void go_validator_generator::generate_string_field_validator(std::ostream& out, } out << ")"; } - out << "{" << endl; + out << "{" << '\n'; indent_up(); out << indent() << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \"" << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key - << " check failed\")" << endl; + << " check failed\")" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } @@ -764,19 +764,19 @@ void go_validator_generator::generate_list_field_validator(std::ostream& out, } else { out << values[0]->get_int(); } - out << "{" << endl; + out << "{" << '\n'; indent_up(); out << indent() << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \"" << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key - << " check failed\")" << endl; + << " check failed\")" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } else if (key == "vt.elem") { - out << indent() << "for i := 0; i < len(" << context.tgt << ");i++ {" << endl; + out << indent() << "for i := 0; i < len(" << context.tgt << ");i++ {" << '\n'; indent_up(); std::string src = GenID("_elem"); - out << indent() << src << " := " << context.tgt << "[i]" << endl; + out << indent() << src << " := " << context.tgt << "[i]" << '\n'; t_type* elem_type; if (context.type->is_list()) { elem_type = ((t_list*)context.type)->get_elem_type(); @@ -791,7 +791,7 @@ void go_validator_generator::generate_list_field_validator(std::ostream& out, std::vector{(*it)->get_inner()}}; generate_field_validator(out, ctx); indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } } @@ -815,17 +815,17 @@ void go_validator_generator::generate_map_field_validator(std::ostream& out, } else { out << values[0]->get_int(); } - out << "{" << endl; + out << "{" << '\n'; indent_up(); out << indent() << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \"" << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key - << " check failed\")" << endl; + << " check failed\")" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } else if (key == "vt.key") { std::string src = GenID("_key"); - out << indent() << "for " << src << " := range " << context.tgt << " {" << endl; + out << indent() << "for " << src << " := range " << context.tgt << " {" << '\n'; indent_up(); generator_context ctx{context.field_symbol + ".key", "", @@ -835,10 +835,10 @@ void go_validator_generator::generate_map_field_validator(std::ostream& out, std::vector{(*it)->get_inner()}}; generate_field_validator(out, ctx); indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } else if (key == "vt.value") { std::string src = GenID("_value"); - out << indent() << "for _, " << src << " := range " << context.tgt << " {" << endl; + out << indent() << "for _, " << src << " := range " << context.tgt << " {" << '\n'; indent_up(); generator_context ctx{context.field_symbol + ".value", "", @@ -848,7 +848,7 @@ void go_validator_generator::generate_map_field_validator(std::ostream& out, std::vector{(*it)->get_inner()}}; generate_field_validator(out, ctx); indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } } @@ -875,31 +875,31 @@ void go_validator_generator::generate_struct_field_validator(std::ostream& out, } if (generate_valid) { if (last_valid_rule == nullptr) { - out << indent() << "if err := " << context.tgt << ".Validate(); err != nil {" << endl; + out << indent() << "if err := " << context.tgt << ".Validate(); err != nil {" << '\n'; indent_up(); - out << indent() << "return err" << endl; + out << indent() << "return err" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } else { const std::vector& values = last_valid_rule->get_values(); if (!values[0]->get_bool()) { - out << indent() << "if err := " << context.tgt << ".Validate(); err != nil {" << endl; + out << indent() << "if err := " << context.tgt << ".Validate(); err != nil {" << '\n'; indent_up(); - out << indent() << "return err" << endl; + out << indent() << "return err" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } else if (values[0]->is_field_reference()) { out << indent() << "if !"; out << get_field_reference_name(values[0]->get_field_reference()); - out << "{" << endl; + out << "{" << '\n'; indent_up(); - out << indent() << "if err := " << context.tgt << ".Validate(); err != nil {" << endl; + out << indent() << "if err := " << context.tgt << ".Validate(); err != nil {" << '\n'; indent_up(); - out << indent() << "return err" << endl; + out << indent() << "return err" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } } diff --git a/compiler/cpp/src/thrift/generate/t_c_glib_generator.cc b/compiler/cpp/src/thrift/generate/t_c_glib_generator.cc index da25338493c..b5eb6032891 100644 --- a/compiler/cpp/src/thrift/generate/t_c_glib_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_c_glib_generator.cc @@ -39,8 +39,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /* forward declarations */ string initial_caps_to_underscores(string name); string underscores_to_initial_caps(string name); @@ -241,18 +239,18 @@ void t_c_glib_generator::init_generator() { f_types_impl_ << autogen_comment(); /* include inclusion guard */ - f_types_ << "#ifndef " << this->nspace_uc << program_name_uc << "_TYPES_H" << endl << "#define " - << this->nspace_uc << program_name_uc << "_TYPES_H" << endl << endl; + f_types_ << "#ifndef " << this->nspace_uc << program_name_uc << "_TYPES_H" << '\n' << "#define " + << this->nspace_uc << program_name_uc << "_TYPES_H" << '\n' << '\n'; /* include base types */ - f_types_ << "/* base includes */" << endl << "#include " << endl - << "#include " << endl - << "#include " << endl; + f_types_ << "/* base includes */" << '\n' << "#include " << '\n' + << "#include " << '\n' + << "#include " << '\n'; /* include other thrift includes */ const vector& includes = program_->get_includes(); if (!includes.empty()) { - f_types_ << "/* other thrift includes */" << endl; + f_types_ << "/* other thrift includes */" << '\n'; for (auto include : includes) { const std::string& include_nspace = include->get_namespace("c_glib"); @@ -260,32 +258,32 @@ void t_c_glib_generator::init_generator() { include_nspace.empty() ? "" : initial_caps_to_underscores(include_nspace) + "_"; f_types_ << "#include \"" << include_nspace_prefix - << initial_caps_to_underscores(include->get_name()) << "_types.h\"" << endl; + << initial_caps_to_underscores(include->get_name()) << "_types.h\"" << '\n'; } - f_types_ << endl; + f_types_ << '\n'; } /* include custom headers */ const vector& c_includes = program_->get_c_includes(); - f_types_ << "/* custom thrift includes */" << endl; + f_types_ << "/* custom thrift includes */" << '\n'; for (const auto & c_include : c_includes) { if (c_include[0] == '<') { - f_types_ << "#include " << c_include << endl; + f_types_ << "#include " << c_include << '\n'; } else { - f_types_ << "#include \"" << c_include << "\"" << endl; + f_types_ << "#include \"" << c_include << "\"" << '\n'; } } - f_types_ << endl; + f_types_ << '\n'; /* include math.h (for "INFINITY") in the implementation file, in case we encounter a struct with a member of type double */ - f_types_impl_ << endl << "#include " << endl; + f_types_impl_ << '\n' << "#include " << '\n'; // include the types file - f_types_impl_ << endl << "#include \"" << this->nspace_lc << program_name_u << "_types.h\"" - << endl << "#include " << endl << endl; + f_types_impl_ << '\n' << "#include \"" << this->nspace_lc << program_name_u << "_types.h\"" + << '\n' << "#include " << '\n' << '\n'; - f_types_ << "/* begin types */" << endl << endl; + f_types_ << "/* begin types */" << '\n' << '\n'; } /** @@ -295,7 +293,7 @@ void t_c_glib_generator::close_generator() { string program_name_uc = to_upper_case(initial_caps_to_underscores(program_name_)); /* end the header inclusion guard */ - f_types_ << "#endif /* " << this->nspace_uc << program_name_uc << "_TYPES_H */" << endl; + f_types_ << "#endif /* " << this->nspace_uc << program_name_uc << "_TYPES_H */" << '\n'; /* close output file */ f_types_.close(); @@ -313,7 +311,7 @@ void t_c_glib_generator::close_generator() { */ void t_c_glib_generator::generate_typedef(t_typedef* ttypedef) { f_types_ << indent() << "typedef " << type_name(ttypedef->get_type(), true) << " " << this->nspace - << ttypedef->get_symbolic() << ";" << endl << endl; + << ttypedef->get_symbolic() << ";" << '\n' << '\n'; } /** @@ -336,7 +334,7 @@ void t_c_glib_generator::generate_enum(t_enum* tenum) { string name = tenum->get_name(); string name_uc = to_upper_case(initial_caps_to_underscores(name)); - f_types_ << indent() << "enum _" << this->nspace << name << " {" << endl; + f_types_ << indent() << "enum _" << this->nspace << name << " {" << '\n'; indent_up(); @@ -349,7 +347,7 @@ void t_c_glib_generator::generate_enum(t_enum* tenum) { if (first) { first = false; } else { - f_types_ << "," << endl; + f_types_ << "," << '\n'; } f_types_ << indent() << this->nspace_uc << name_uc << "_" << (*c_iter)->get_name(); @@ -357,19 +355,19 @@ void t_c_glib_generator::generate_enum(t_enum* tenum) { } indent_down(); - f_types_ << endl << "};" << endl << "typedef enum _" << this->nspace << name << " " - << this->nspace << name << ";" << endl << endl; + f_types_ << '\n' << "};" << '\n' << "typedef enum _" << this->nspace << name << " " + << this->nspace << name << ";" << '\n' << '\n'; - f_types_ << "/* return the name of the constant */" << endl; - f_types_ << "const char *" << endl; - f_types_ << "toString_" << name << "(int value); " << endl << endl; + f_types_ << "/* return the name of the constant */" << '\n'; + f_types_ << "const char *" << '\n'; + f_types_ << "toString_" << name << "(int value); " << '\n' << '\n'; ; - f_types_impl_ << "/* return the name of the constant */" << endl; - f_types_impl_ << "const char *" << endl; - f_types_impl_ << "toString_" << name << "(int value) " << endl; - f_types_impl_ << "{" << endl; - f_types_impl_ << " static __thread char buf[16] = {0};" << endl; - f_types_impl_ << " switch(value) {" << endl; + f_types_impl_ << "/* return the name of the constant */" << '\n'; + f_types_impl_ << "const char *" << '\n'; + f_types_impl_ << "toString_" << name << "(int value) " << '\n'; + f_types_impl_ << "{" << '\n'; + f_types_impl_ << " static __thread char buf[16] = {0};" << '\n'; + f_types_impl_ << " switch(value) {" << '\n'; std::set done; for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { int value = (*c_iter)->get_value(); @@ -379,20 +377,20 @@ void t_c_glib_generator::generate_enum(t_enum* tenum) { f_types_impl_ << " case " << this->nspace_uc << name_uc << "_" << (*c_iter)->get_name() << ":" << "return \"" << this->nspace_uc << name_uc << "_" << (*c_iter)->get_name() - << "\";" << endl; + << "\";" << '\n'; } } - f_types_impl_ << " default: g_snprintf(buf, 16, \"%d\", value); return buf;" << endl; - f_types_impl_ << " }" << endl; - f_types_impl_ << "}" << endl << endl; + f_types_impl_ << " default: g_snprintf(buf, 16, \"%d\", value); return buf;" << '\n'; + f_types_impl_ << " }" << '\n'; + f_types_impl_ << "}" << '\n' << '\n'; } /** * Generates Thrift constants in C code. */ void t_c_glib_generator::generate_consts(vector consts) { - f_types_ << "/* constants */" << endl; - f_types_impl_ << "/* constants */" << endl; + f_types_ << "/* constants */" << '\n'; + f_types_impl_ << "/* constants */" << '\n'; vector::iterator c_iter; for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { @@ -404,17 +402,17 @@ void t_c_glib_generator::generate_consts(vector consts) { if (is_complex_type(type)) { f_types_ << type_name(type) << indent() << this->nspace_lc << name_lc - << "_constant();" << endl; + << "_constant();" << '\n'; } f_types_ << indent() << "#define " << this->nspace_uc << name_uc << " " - << constant_value(name_lc, type, value) << endl; + << constant_value(name_lc, type, value) << '\n'; generate_const_initializer(name_lc, type, value, true); } - f_types_ << endl; - f_types_impl_ << endl; + f_types_ << '\n'; + f_types_impl_ << '\n'; } /** @@ -439,7 +437,7 @@ void t_c_glib_generator::generate_consts(vector consts) { * // ... additional GObject boilerplate ... */ void t_c_glib_generator::generate_struct(t_struct* tstruct) { - f_types_ << "/* struct " << tstruct->get_name() << " */" << endl; + f_types_ << "/* struct " << tstruct->get_name() << " */" << '\n'; generate_object(tstruct); } @@ -463,21 +461,21 @@ void t_c_glib_generator::generate_service(t_service* tservice) { f_header_ << autogen_comment(); // add an inclusion guard - f_header_ << "#ifndef " << svcname_uc << "_H" << endl << "#define " << svcname_uc << "_H" << endl - << endl; + f_header_ << "#ifndef " << svcname_uc << "_H" << '\n' << "#define " << svcname_uc << "_H" << '\n' + << '\n'; // add standard includes - f_header_ << "#include " << endl << endl; - f_header_ << "#include \"" << this->nspace_lc << program_name_lc << "_types.h\"" << endl; + f_header_ << "#include " << '\n' << '\n'; + f_header_ << "#include \"" << this->nspace_lc << program_name_lc << "_types.h\"" << '\n'; // if we are inheriting from another service, include its header t_service* extends_service = tservice->get_extends(); if (extends_service != nullptr) { f_header_ << "#include \"" << this->nspace_lc << to_lower_case(initial_caps_to_underscores(extends_service->get_name())) << ".h\"" - << endl; + << '\n'; } - f_header_ << endl; + f_header_ << '\n'; // create the service implementation string f_service_name = get_out_dir() + filename + ".c"; @@ -487,9 +485,9 @@ void t_c_glib_generator::generate_service(t_service* tservice) { f_service_ << autogen_comment(); // include the headers - f_service_ << "#include " << endl << "#include " << endl - << "#include " << endl << "#include \"" - << filename << ".h\"" << endl << endl; + f_service_ << "#include " << '\n' << "#include " << '\n' + << "#include " << '\n' << "#include \"" + << filename << ".h\"" << '\n' << '\n'; // generate the service-helper classes generate_service_helpers(tservice); @@ -501,7 +499,7 @@ void t_c_glib_generator::generate_service(t_service* tservice) { generate_service_server(tservice); // end the header inclusion guard - f_header_ << "#endif /* " << svcname_uc << "_H */" << endl; + f_header_ << "#endif /* " << svcname_uc << "_H */" << '\n'; // close the files f_service_.close(); @@ -519,27 +517,27 @@ void t_c_glib_generator::generate_xception(t_struct* tstruct) { generate_object(tstruct); - f_types_ << "/* exception */" << endl - << "typedef enum" << endl - << "{" << endl; + f_types_ << "/* exception */" << '\n' + << "typedef enum" << '\n' + << "{" << '\n'; indent_up(); - f_types_ << indent() << this->nspace_uc << name_uc << "_ERROR_CODE" << endl; + f_types_ << indent() << this->nspace_uc << name_uc << "_ERROR_CODE" << '\n'; indent_down(); - f_types_ << "} " << this->nspace << name << "Error;" << endl - << endl + f_types_ << "} " << this->nspace << name << "Error;" << '\n' + << '\n' << "GQuark " << this->nspace_lc << name_lc - << "_error_quark (void);" << endl + << "_error_quark (void);" << '\n' << "#define " << this->nspace_uc << name_uc << "_ERROR (" - << this->nspace_lc << name_lc << "_error_quark())" << endl - << endl - << endl; + << this->nspace_lc << name_lc << "_error_quark())" << '\n' + << '\n' + << '\n'; - f_types_impl_ << "/* define the GError domain for exceptions */" << endl << "#define " + f_types_impl_ << "/* define the GError domain for exceptions */" << '\n' << "#define " << this->nspace_uc << name_uc << "_ERROR_DOMAIN \"" << this->nspace_lc << name_lc - << "_error_quark\"" << endl << "GQuark" << endl << this->nspace_lc << name_lc - << "_error_quark (void)" << endl << "{" << endl + << "_error_quark\"" << '\n' << "GQuark" << '\n' << this->nspace_lc << name_lc + << "_error_quark (void)" << '\n' << "{" << '\n' << " return g_quark_from_static_string (" << this->nspace_uc << name_uc - << "_ERROR_DOMAIN);" << endl << "}" << endl << endl; + << "_ERROR_DOMAIN);" << '\n' << "}" << '\n' << '\n'; } /******************** @@ -983,12 +981,12 @@ string t_c_glib_generator::constant_value_with_storage(string fname, ostringstream render; if (is_numeric(etype)) { render << " " << type_name(etype) << " *" << fname << " = " - << "g_new (" << base_type_name(etype) << ", 1);" << endl + << "g_new (" << base_type_name(etype) << ", 1);" << '\n' << " *" << fname << " = " << constant_value(fname, (t_type*)etype, value) << ";" - << endl; + << '\n'; } else { render << " " << type_name(etype) << " " << fname << " = " - << constant_value(fname, (t_type*)etype, value) << ";" << endl; + << constant_value(fname, (t_type*)etype, value) << ";" << '\n'; } return render.str(); } @@ -1037,22 +1035,22 @@ void t_c_glib_generator::generate_const_initializer(string name, initializers << " constant->" << v_iter->first->get_string() << " = " << constant_value(name + "_constant_" + field_name, field_type, - v_iter->second) << ";" << endl + v_iter->second) << ";" << '\n' << " constant->__isset_" << v_iter->first->get_string() - << " = TRUE;" << endl; + << " = TRUE;" << '\n'; } // implement the initializer f_types_impl_ << maybe_static << this->nspace << type->get_name() << " *" - << endl - << this->nspace_lc << name_lc << "_constant (void)" << endl; + << '\n' + << this->nspace_lc << name_lc << "_constant (void)" << '\n'; scope_up(f_types_impl_); f_types_impl_ << indent() << "static " << this->nspace << type->get_name() - << " *constant = NULL;" << endl - << indent() << "if (constant == NULL)" << endl; + << " *constant = NULL;" << '\n' + << indent() << "if (constant == NULL)" << '\n'; scope_up(f_types_impl_); f_types_impl_ << indent() << "constant = g_object_new (" << this->nspace_uc - << "TYPE_" << type_uc << ", NULL);" << endl + << "TYPE_" << type_uc << ", NULL);" << '\n' << initializers.str(); scope_down(f_types_impl_); @@ -1074,9 +1072,9 @@ void t_c_glib_generator::generate_const_initializer(string name, field_name = tmp(field_name); } - f_types_impl_ << indent() << "return constant;" << endl; + f_types_impl_ << indent() << "return constant;" << '\n'; scope_down(f_types_impl_); - f_types_impl_ << endl; + f_types_impl_ << '\n'; } else if (type->is_list()) { string list_type = "GPtrArray *"; string free_func @@ -1125,33 +1123,33 @@ void t_c_glib_generator::generate_const_initializer(string name, if (list_variable) { initializers << " " << type_name(etype) << " " << fname << " = " << constant_value(fname, (t_type*)etype, (*v_iter)) << ";" - << endl; + << '\n'; appenders << " " << list_appender << "(constant, " << fname << ");" - << endl; + << '\n'; } else { appenders << " " << list_appender << "(constant, " << constant_value(fname, (t_type*)etype, (*v_iter)) << ");" - << endl; + << '\n'; } } - f_types_impl_ << maybe_static << list_type << endl - << this->nspace_lc << name_lc << "_constant (void)" << endl; + f_types_impl_ << maybe_static << list_type << '\n' + << this->nspace_lc << name_lc << "_constant (void)" << '\n'; scope_up(f_types_impl_); f_types_impl_ << indent() << "static " << list_type << " constant = NULL;" - << endl - << indent() << "if (constant == NULL)" << endl; + << '\n' + << indent() << "if (constant == NULL)" << '\n'; scope_up(f_types_impl_); if (!initializers.str().empty()) { f_types_impl_ << initializers.str() - << endl; + << '\n'; } - f_types_impl_ << indent() << "constant = " << list_initializer << endl + f_types_impl_ << indent() << "constant = " << list_initializer << '\n' << appenders.str(); scope_down(f_types_impl_); - f_types_impl_ << indent() << "return constant;" << endl; + f_types_impl_ << indent() << "return constant;" << '\n'; scope_down(f_types_impl_); - f_types_impl_ << endl; + f_types_impl_ << '\n'; } else if (type->is_set()) { t_type* etype = ((t_set*)type)->get_elem_type(); const vector& val = value->get_list(); @@ -1164,22 +1162,22 @@ void t_c_glib_generator::generate_const_initializer(string name, string ptr = is_numeric(etype) ? "*" : ""; generate_const_initializer(fname, etype, (*v_iter)); initializers << constant_value_with_storage(fname, (t_type*)etype, *v_iter); - appenders << " g_hash_table_insert (constant, " << fname << ", 0);" << endl; + appenders << " g_hash_table_insert (constant, " << fname << ", 0);" << '\n'; } - f_types_impl_ << maybe_static << "GHashTable *" << endl - << this->nspace_lc << name_lc << "_constant (void)" << endl; + f_types_impl_ << maybe_static << "GHashTable *" << '\n' + << this->nspace_lc << name_lc << "_constant (void)" << '\n'; scope_up(f_types_impl_); - f_types_impl_ << indent() << "static GHashTable *constant = NULL;" << endl - << indent() << "if (constant == NULL)" << endl; + f_types_impl_ << indent() << "static GHashTable *constant = NULL;" << '\n' + << indent() << "if (constant == NULL)" << '\n'; scope_up(f_types_impl_); - f_types_impl_ << initializers.str() << endl - << indent() << "constant = " << generate_new_hash_from_type(etype, nullptr) << endl + f_types_impl_ << initializers.str() << '\n' + << indent() << "constant = " << generate_new_hash_from_type(etype, nullptr) << '\n' << appenders.str(); scope_down(f_types_impl_); - f_types_impl_ << indent() << "return constant;" << endl; + f_types_impl_ << indent() << "return constant;" << '\n'; scope_down(f_types_impl_); - f_types_impl_ << endl; + f_types_impl_ << '\n'; } else if (type->is_map()) { t_type* ktype = ((t_map*)type)->get_key_type(); t_type* vtype = ((t_map*)type)->get_val_type(); @@ -1197,22 +1195,22 @@ void t_c_glib_generator::generate_const_initializer(string name, initializers << constant_value_with_storage(kname, (t_type*)ktype, v_iter->first); initializers << constant_value_with_storage(vname, (t_type*)vtype, v_iter->second); - appenders << " g_hash_table_insert (constant, " << kname << ", " << vname << ");" << endl; + appenders << " g_hash_table_insert (constant, " << kname << ", " << vname << ");" << '\n'; } - f_types_impl_ << maybe_static << "GHashTable *" << endl - << this->nspace_lc << name_lc << "_constant (void)" << endl; + f_types_impl_ << maybe_static << "GHashTable *" << '\n' + << this->nspace_lc << name_lc << "_constant (void)" << '\n'; scope_up(f_types_impl_); - f_types_impl_ << indent() << "static GHashTable *constant = NULL;" << endl - << indent() << "if (constant == NULL)" << endl; + f_types_impl_ << indent() << "static GHashTable *constant = NULL;" << '\n' + << indent() << "if (constant == NULL)" << '\n'; scope_up(f_types_impl_); - f_types_impl_ << initializers.str() << endl - << indent() << "constant = " << generate_new_hash_from_type(ktype, vtype) << endl + f_types_impl_ << initializers.str() << '\n' + << indent() << "constant = " << generate_new_hash_from_type(ktype, vtype) << '\n' << appenders.str(); scope_down(f_types_impl_); - f_types_impl_ << indent() << "return constant;" << endl; + f_types_impl_ << indent() << "return constant;" << '\n'; scope_down(f_types_impl_); - f_types_impl_ << endl; + f_types_impl_ << '\n'; } } @@ -1303,13 +1301,13 @@ void t_c_glib_generator::generate_service_client(t_service* tservice) { string base_service_name_uc = to_upper_case(base_service_name_lc); // Generate the client interface dummy object in the header. - f_header_ << "/* " << service_name_ << " service interface */" << endl << "typedef struct _" + f_header_ << "/* " << service_name_ << " service interface */" << '\n' << "typedef struct _" << this->nspace << service_name_ << "If " << this->nspace << service_name_ << "If; " - << " /* dummy object */" << endl << endl; + << " /* dummy object */" << '\n' << '\n'; // Generate the client interface object in the header. - f_header_ << "struct _" << this->nspace << service_name_ << "IfInterface" << endl << "{" << endl - << " GTypeInterface parent;" << endl << endl; + f_header_ << "struct _" << this->nspace << service_name_ << "IfInterface" << '\n' << "{" << '\n' + << " GTypeInterface parent;" << '\n' << '\n'; /* write out the functions for this interface */ indent_up(); @@ -1330,26 +1328,26 @@ void t_c_glib_generator::generate_service_client(t_service* tservice) { + (has_args ? "" : (", " + argument_list(arglist))) + (has_xceptions ? "" : (", " + xception_list(xlist))) + ", GError **error)"; - indent(f_header_) << "gboolean (*" << funname << ") " << params << ";" << endl; + indent(f_header_) << "gboolean (*" << funname << ") " << params << ";" << '\n'; } indent_down(); - f_header_ << "};" << endl << "typedef struct _" << this->nspace << service_name_ << "IfInterface " - << this->nspace << service_name_ << "IfInterface;" << endl << endl; + f_header_ << "};" << '\n' << "typedef struct _" << this->nspace << service_name_ << "IfInterface " + << this->nspace << service_name_ << "IfInterface;" << '\n' << '\n'; // generate all the interface boilerplate - f_header_ << "GType " << this->nspace_lc << service_name_lc << "_if_get_type (void);" << endl + f_header_ << "GType " << this->nspace_lc << service_name_lc << "_if_get_type (void);" << '\n' << "#define " << this->nspace_uc << "TYPE_" << service_name_uc << "_IF " - << "(" << this->nspace_lc << service_name_lc << "_if_get_type())" << endl << "#define " + << "(" << this->nspace_lc << service_name_lc << "_if_get_type())" << '\n' << "#define " << this->nspace_uc << service_name_uc << "_IF(obj) " << "(G_TYPE_CHECK_INSTANCE_CAST ((obj), " << this->nspace_uc << "TYPE_" - << service_name_uc << "_IF, " << this->nspace << service_name_ << "If))" << endl + << service_name_uc << "_IF, " << this->nspace << service_name_ << "If))" << '\n' << "#define " << this->nspace_uc << "IS_" << service_name_uc << "_IF(obj) " << "(G_TYPE_CHECK_INSTANCE_TYPE ((obj), " << this->nspace_uc << "TYPE_" - << service_name_uc << "_IF))" << endl << "#define " << this->nspace_uc + << service_name_uc << "_IF))" << '\n' << "#define " << this->nspace_uc << service_name_uc << "_IF_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), " << this->nspace_uc << "TYPE_" << service_name_uc << "_IF, " << this->nspace - << service_name_ << "IfInterface))" << endl << endl; + << service_name_ << "IfInterface))" << '\n' << '\n'; // write out all the interface function prototypes for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -1368,50 +1366,50 @@ void t_c_glib_generator::generate_service_client(t_service* tservice) { + (has_xceptions ? "" : (", " + xception_list(xlist))) + ", GError **error)"; f_header_ << "gboolean " << this->nspace_lc << service_name_lc << "_if_" << funname << " " - << params << ";" << endl; + << params << ";" << '\n'; } - f_header_ << endl; + f_header_ << '\n'; // Generate the client object instance definition in the header. - f_header_ << "/* " << service_name_ << " service client */" << endl << "struct _" << this->nspace - << service_name_ << "Client" << endl << "{" << endl << " " << parent_class_name - << " parent;" << endl; + f_header_ << "/* " << service_name_ << " service client */" << '\n' << "struct _" << this->nspace + << service_name_ << "Client" << '\n' << "{" << '\n' << " " << parent_class_name + << " parent;" << '\n'; if (!extends_service) { // Define "input_protocol" and "output_protocol" properties only // for base services; child service-client classes will inherit // these - f_header_ << endl << " ThriftProtocol *input_protocol;" << endl - << " ThriftProtocol *output_protocol;" << endl; + f_header_ << '\n' << " ThriftProtocol *input_protocol;" << '\n' + << " ThriftProtocol *output_protocol;" << '\n'; } - f_header_ << "};" << endl << "typedef struct _" << this->nspace << service_name_ << "Client " - << this->nspace << service_name_ << "Client;" << endl << endl; + f_header_ << "};" << '\n' << "typedef struct _" << this->nspace << service_name_ << "Client " + << this->nspace << service_name_ << "Client;" << '\n' << '\n'; // Generate the class definition in the header. - f_header_ << "struct _" << this->nspace << service_name_ << "ClientClass" << endl << "{" << endl - << " " << parent_class_name << "Class parent;" << endl << "};" << endl + f_header_ << "struct _" << this->nspace << service_name_ << "ClientClass" << '\n' << "{" << '\n' + << " " << parent_class_name << "Class parent;" << '\n' << "};" << '\n' << "typedef struct _" << this->nspace << service_name_ << "ClientClass " << this->nspace - << service_name_ << "ClientClass;" << endl << endl; + << service_name_ << "ClientClass;" << '\n' << '\n'; // Create all the GObject boilerplate - f_header_ << "GType " << this->nspace_lc << service_name_lc << "_client_get_type (void);" << endl + f_header_ << "GType " << this->nspace_lc << service_name_lc << "_client_get_type (void);" << '\n' << "#define " << this->nspace_uc << "TYPE_" << service_name_uc << "_CLIENT " - << "(" << this->nspace_lc << service_name_lc << "_client_get_type())" << endl + << "(" << this->nspace_lc << service_name_lc << "_client_get_type())" << '\n' << "#define " << this->nspace_uc << service_name_uc << "_CLIENT(obj) " << "(G_TYPE_CHECK_INSTANCE_CAST ((obj), " << this->nspace_uc << "TYPE_" - << service_name_uc << "_CLIENT, " << this->nspace << service_name_ << "Client))" << endl + << service_name_uc << "_CLIENT, " << this->nspace << service_name_ << "Client))" << '\n' << "#define " << this->nspace_uc << service_name_uc << "_CLIENT_CLASS(c) " << "(G_TYPE_CHECK_CLASS_CAST ((c), " << this->nspace_uc << "TYPE_" << service_name_uc - << "_CLIENT, " << this->nspace << service_name_ << "ClientClass))" << endl << "#define " + << "_CLIENT, " << this->nspace << service_name_ << "ClientClass))" << '\n' << "#define " << this->nspace_uc << service_name_uc << "_IS_CLIENT(obj) " << "(G_TYPE_CHECK_INSTANCE_TYPE ((obj), " << this->nspace_uc << "TYPE_" - << service_name_uc << "_CLIENT))" << endl << "#define " << this->nspace_uc + << service_name_uc << "_CLIENT))" << '\n' << "#define " << this->nspace_uc << service_name_uc << "_IS_CLIENT_CLASS(c) " << "(G_TYPE_CHECK_CLASS_TYPE ((c), " << this->nspace_uc << "TYPE_" << service_name_uc - << "_CLIENT))" << endl << "#define " << this->nspace_uc << service_name_uc + << "_CLIENT))" << '\n' << "#define " << this->nspace_uc << service_name_uc << "_CLIENT_GET_CLASS(obj) " << "(G_TYPE_INSTANCE_GET_CLASS ((obj), " << this->nspace_uc << "TYPE_" << service_name_uc << "_CLIENT, " << this->nspace << service_name_ << "ClientClass))" - << endl << endl; + << '\n' << '\n'; /* write out the function prototypes */ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -1422,12 +1420,12 @@ void t_c_glib_generator::generate_service_client(t_service* tservice) { service_name_lc + string("_client_") + funname, (*f_iter)->get_arglist(), (*f_iter)->get_xceptions()); - indent(f_header_) << function_signature(&service_function) << ";" << endl; + indent(f_header_) << function_signature(&service_function) << ";" << '\n'; t_function send_function(g_type_void, service_name_lc + string("_client_send_") + funname, (*f_iter)->get_arglist()); - indent(f_header_) << function_signature(&send_function) << ";" << endl; + indent(f_header_) << function_signature(&send_function) << ";" << '\n'; // implement recv if not a oneway service if (!(*f_iter)->is_oneway()) { @@ -1436,19 +1434,19 @@ void t_c_glib_generator::generate_service_client(t_service* tservice) { service_name_lc + string("_client_recv_") + funname, &noargs, (*f_iter)->get_xceptions()); - indent(f_header_) << function_signature(&recv_function) << ";" << endl; + indent(f_header_) << function_signature(&recv_function) << ";" << '\n'; } } /* write out the get/set function prototypes */ f_header_ << "void " + service_name_lc + "_client_set_property (GObject *object, guint " "property_id, const GValue *value, GParamSpec *pspec);" - << endl; + << '\n'; f_header_ << "void " + service_name_lc + "_client_get_property (GObject *object, guint " "property_id, GValue *value, GParamSpec *pspec);" - << endl; + << '\n'; - f_header_ << endl; + f_header_ << '\n'; // end of header code // Generate interface method implementations @@ -1483,76 +1481,76 @@ void t_c_glib_generator::generate_service_client(t_service* tservice) { params_without_type += ", "; } - f_service_ << "gboolean" << endl << this->nspace_lc << service_name_lc << "_if_" << funname - << " " << params << endl << "{" << endl << " return " << this->nspace_uc + f_service_ << "gboolean" << '\n' << this->nspace_lc << service_name_lc << "_if_" << funname + << " " << params << '\n' << "{" << '\n' << " return " << this->nspace_uc << service_name_uc << "_IF_GET_INTERFACE (iface)->" << funname << " (" - << params_without_type << "error);" << endl << "}" << endl << endl; + << params_without_type << "error);" << '\n' << "}" << '\n' << '\n'; } // Generate interface boilerplate - f_service_ << "GType" << endl << this->nspace_lc << service_name_lc << "_if_get_type (void)" - << endl << "{" << endl << " static GType type = 0;" << endl << " if (type == 0)" - << endl << " {" << endl << " static const GTypeInfo type_info =" << endl << " {" - << endl << " sizeof (" << this->nspace << service_name_ << "IfInterface)," << endl - << " NULL, /* base_init */" << endl << " NULL, /* base_finalize */" << endl - << " NULL, /* class_init */" << endl << " NULL, /* class_finalize */" - << endl << " NULL, /* class_data */" << endl - << " 0, /* instance_size */" << endl << " 0, /* n_preallocs */" - << endl << " NULL, /* instance_init */" << endl - << " NULL /* value_table */" << endl << " };" << endl - << " type = g_type_register_static (G_TYPE_INTERFACE," << endl + f_service_ << "GType" << '\n' << this->nspace_lc << service_name_lc << "_if_get_type (void)" + << '\n' << "{" << '\n' << " static GType type = 0;" << '\n' << " if (type == 0)" + << '\n' << " {" << '\n' << " static const GTypeInfo type_info =" << '\n' << " {" + << '\n' << " sizeof (" << this->nspace << service_name_ << "IfInterface)," << '\n' + << " NULL, /* base_init */" << '\n' << " NULL, /* base_finalize */" << '\n' + << " NULL, /* class_init */" << '\n' << " NULL, /* class_finalize */" + << '\n' << " NULL, /* class_data */" << '\n' + << " 0, /* instance_size */" << '\n' << " 0, /* n_preallocs */" + << '\n' << " NULL, /* instance_init */" << '\n' + << " NULL /* value_table */" << '\n' << " };" << '\n' + << " type = g_type_register_static (G_TYPE_INTERFACE," << '\n' << " \"" << this->nspace << service_name_ << "If\"," - << endl << " &type_info, 0);" << endl << " }" - << endl << " return type;" << endl << "}" << endl << endl; + << '\n' << " &type_info, 0);" << '\n' << " }" + << '\n' << " return type;" << '\n' << "}" << '\n' << '\n'; // Generate client boilerplate - f_service_ << "static void " << endl << this->nspace_lc << service_name_lc + f_service_ << "static void " << '\n' << this->nspace_lc << service_name_lc << "_if_interface_init (" << this->nspace << service_name_ << "IfInterface *iface);" - << endl << endl << "G_DEFINE_TYPE_WITH_CODE (" << this->nspace << service_name_ - << "Client, " << this->nspace_lc << service_name_lc << "_client," << endl - << " " << parent_type_name << ", " << endl + << '\n' << '\n' << "G_DEFINE_TYPE_WITH_CODE (" << this->nspace << service_name_ + << "Client, " << this->nspace_lc << service_name_lc << "_client," << '\n' + << " " << parent_type_name << ", " << '\n' << " G_IMPLEMENT_INTERFACE (" << this->nspace_uc << "TYPE_" - << service_name_uc << "_IF," << endl + << service_name_uc << "_IF," << '\n' << " " << this->nspace_lc - << service_name_lc << "_if_interface_init))" << endl << endl; + << service_name_lc << "_if_interface_init))" << '\n' << '\n'; // Generate property-related code only for base services---child // service-client classes have only properties inherited from their // parent class if (!extends_service) { // Generate client properties - f_service_ << "enum _" << this->nspace << service_name_ << "ClientProperties" << endl << "{" - << endl << " PROP_0," << endl << " PROP_" << this->nspace_uc << service_name_uc - << "_CLIENT_INPUT_PROTOCOL," << endl << " PROP_" << this->nspace_uc - << service_name_uc << "_CLIENT_OUTPUT_PROTOCOL" << endl << "};" << endl << endl; + f_service_ << "enum _" << this->nspace << service_name_ << "ClientProperties" << '\n' << "{" + << '\n' << " PROP_0," << '\n' << " PROP_" << this->nspace_uc << service_name_uc + << "_CLIENT_INPUT_PROTOCOL," << '\n' << " PROP_" << this->nspace_uc + << service_name_uc << "_CLIENT_OUTPUT_PROTOCOL" << '\n' << "};" << '\n' << '\n'; // generate property setter - f_service_ << "void" << endl << this->nspace_lc << service_name_lc << "_client_set_property (" + f_service_ << "void" << '\n' << this->nspace_lc << service_name_lc << "_client_set_property (" << "GObject *object, guint property_id, const GValue *value, " - << "GParamSpec *pspec)" << endl << "{" << endl << " " << this->nspace + << "GParamSpec *pspec)" << '\n' << "{" << '\n' << " " << this->nspace << service_name_ << "Client *client = " << this->nspace_uc << service_name_uc - << "_CLIENT (object);" << endl << endl << " THRIFT_UNUSED_VAR (pspec);" << endl - << endl << " switch (property_id)" << endl << " {" << endl << " case PROP_" - << this->nspace_uc << service_name_uc << "_CLIENT_INPUT_PROTOCOL:" << endl - << " client->input_protocol = g_value_get_object (value);" << endl - << " break;" << endl << " case PROP_" << this->nspace_uc << service_name_uc - << "_CLIENT_OUTPUT_PROTOCOL:" << endl - << " client->output_protocol = g_value_get_object (value);" << endl - << " break;" << endl << " }" << endl << "}" << endl << endl; + << "_CLIENT (object);" << '\n' << '\n' << " THRIFT_UNUSED_VAR (pspec);" << '\n' + << '\n' << " switch (property_id)" << '\n' << " {" << '\n' << " case PROP_" + << this->nspace_uc << service_name_uc << "_CLIENT_INPUT_PROTOCOL:" << '\n' + << " client->input_protocol = g_value_get_object (value);" << '\n' + << " break;" << '\n' << " case PROP_" << this->nspace_uc << service_name_uc + << "_CLIENT_OUTPUT_PROTOCOL:" << '\n' + << " client->output_protocol = g_value_get_object (value);" << '\n' + << " break;" << '\n' << " }" << '\n' << "}" << '\n' << '\n'; // generate property getter - f_service_ << "void" << endl << this->nspace_lc << service_name_lc << "_client_get_property (" + f_service_ << "void" << '\n' << this->nspace_lc << service_name_lc << "_client_get_property (" << "GObject *object, guint property_id, GValue *value, " - << "GParamSpec *pspec)" << endl << "{" << endl << " " << this->nspace + << "GParamSpec *pspec)" << '\n' << "{" << '\n' << " " << this->nspace << service_name_ << "Client *client = " << this->nspace_uc << service_name_uc - << "_CLIENT (object);" << endl << endl << " THRIFT_UNUSED_VAR (pspec);" << endl - << endl << " switch (property_id)" << endl << " {" << endl << " case PROP_" - << this->nspace_uc << service_name_uc << "_CLIENT_INPUT_PROTOCOL:" << endl - << " g_value_set_object (value, client->input_protocol);" << endl - << " break;" << endl << " case PROP_" << this->nspace_uc << service_name_uc - << "_CLIENT_OUTPUT_PROTOCOL:" << endl - << " g_value_set_object (value, client->output_protocol);" << endl - << " break;" << endl << " }" << endl << "}" << endl << endl; + << "_CLIENT (object);" << '\n' << '\n' << " THRIFT_UNUSED_VAR (pspec);" << '\n' + << '\n' << " switch (property_id)" << '\n' << " {" << '\n' << " case PROP_" + << this->nspace_uc << service_name_uc << "_CLIENT_INPUT_PROTOCOL:" << '\n' + << " g_value_set_object (value, client->input_protocol);" << '\n' + << " break;" << '\n' << " case PROP_" << this->nspace_uc << service_name_uc + << "_CLIENT_OUTPUT_PROTOCOL:" << '\n' + << " g_value_set_object (value, client->output_protocol);" << '\n' + << " break;" << '\n' << " }" << '\n' << "}" << '\n' << '\n'; } // Generate client method implementations @@ -1569,31 +1567,31 @@ void t_c_glib_generator::generate_service_client(t_service* tservice) { (*f_iter)->get_arglist()); // Open the send function - indent(f_service_) << function_signature(&send_function) << endl; + indent(f_service_) << function_signature(&send_function) << '\n'; scope_up(f_service_); string reqType = (*f_iter)->is_oneway() ? "T_ONEWAY" : "T_CALL"; // Serialize the request - f_service_ << indent() << "gint32 cseqid = 0;" << endl << indent() + f_service_ << indent() << "gint32 cseqid = 0;" << '\n' << indent() << "ThriftProtocol * protocol = " << this->nspace_uc << base_service_name_uc - << "_CLIENT (iface)->output_protocol;" << endl << endl << indent() + << "_CLIENT (iface)->output_protocol;" << '\n' << '\n' << indent() << "if (thrift_protocol_write_message_begin (protocol, \"" << name << "\", " - << reqType << ", cseqid, error) < 0)" << endl << indent() << " return FALSE;" - << endl << endl; + << reqType << ", cseqid, error) < 0)" << '\n' << indent() << " return FALSE;" + << '\n' << '\n'; generate_struct_writer(f_service_, arg_struct, "", "", false); - f_service_ << indent() << "if (thrift_protocol_write_message_end (protocol, error) < 0)" << endl - << indent() << " return FALSE;" << endl << indent() - << "if (!thrift_transport_flush (protocol->transport, error))" << endl << indent() - << " return FALSE;" << endl << indent() - << "if (!thrift_transport_write_end (protocol->transport, error))" << endl - << indent() << " return FALSE;" << endl << endl << indent() << "return TRUE;" - << endl; + f_service_ << indent() << "if (thrift_protocol_write_message_end (protocol, error) < 0)" << '\n' + << indent() << " return FALSE;" << '\n' << indent() + << "if (!thrift_transport_flush (protocol->transport, error))" << '\n' << indent() + << " return FALSE;" << '\n' << indent() + << "if (!thrift_transport_write_end (protocol->transport, error))" << '\n' + << indent() << " return FALSE;" << '\n' << '\n' << indent() << "return TRUE;" + << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Generate recv function only if not an async function if (!(*f_iter)->is_oneway()) { @@ -1603,78 +1601,78 @@ void t_c_glib_generator::generate_service_client(t_service* tservice) { &noargs, (*f_iter)->get_xceptions()); // Open function - indent(f_service_) << function_signature(&recv_function) << endl; + indent(f_service_) << function_signature(&recv_function) << '\n'; scope_up(f_service_); - f_service_ << indent() << "gint32 rseqid;" << endl - << indent() << "gchar * fname = NULL;" << endl - << indent() << "ThriftMessageType mtype;" << endl + f_service_ << indent() << "gint32 rseqid;" << '\n' + << indent() << "gchar * fname = NULL;" << '\n' + << indent() << "ThriftMessageType mtype;" << '\n' << indent() << "ThriftProtocol * protocol = " << this->nspace_uc << base_service_name_uc - << "_CLIENT (iface)->input_protocol;" << endl - << indent() << "ThriftApplicationException *xception;" << endl - << endl + << "_CLIENT (iface)->input_protocol;" << '\n' + << indent() << "ThriftApplicationException *xception;" << '\n' + << '\n' << indent() << "if (thrift_protocol_read_message_begin " - "(protocol, &fname, &mtype, &rseqid, error) < 0) {" << endl; + "(protocol, &fname, &mtype, &rseqid, error) < 0) {" << '\n'; indent_up(); - f_service_ << indent() << "if (fname) g_free (fname);" << endl - << indent() << "return FALSE;" << endl; + f_service_ << indent() << "if (fname) g_free (fname);" << '\n' + << indent() << "return FALSE;" << '\n'; indent_down(); - f_service_ << indent() << "}" << endl - << endl - << indent() << "if (mtype == T_EXCEPTION) {" << endl; + f_service_ << indent() << "}" << '\n' + << '\n' + << indent() << "if (mtype == T_EXCEPTION) {" << '\n'; indent_up(); - f_service_ << indent() << "if (fname) g_free (fname);" << endl + f_service_ << indent() << "if (fname) g_free (fname);" << '\n' << indent() << "xception = g_object_new " - "(THRIFT_TYPE_APPLICATION_EXCEPTION, NULL);" << endl + "(THRIFT_TYPE_APPLICATION_EXCEPTION, NULL);" << '\n' << indent() << "thrift_struct_read (THRIFT_STRUCT (xception), " - "protocol, NULL);" << endl + "protocol, NULL);" << '\n' << indent() << "thrift_protocol_read_message_end " - "(protocol, NULL);" << endl + "(protocol, NULL);" << '\n' << indent() << "thrift_transport_read_end " - "(protocol->transport, NULL);" << endl + "(protocol->transport, NULL);" << '\n' << indent() << "g_set_error (error, " "THRIFT_APPLICATION_EXCEPTION_ERROR,xception->type, " - "\"application error: %s\", xception->message);" << endl - << indent() << "g_object_unref (xception);" << endl - << indent() << "return FALSE;" << endl; + "\"application error: %s\", xception->message);" << '\n' + << indent() << "g_object_unref (xception);" << '\n' + << indent() << "return FALSE;" << '\n'; indent_down(); - f_service_ << indent() << "} else if (mtype != T_REPLY) {" << endl; + f_service_ << indent() << "} else if (mtype != T_REPLY) {" << '\n'; indent_up(); - f_service_ << indent() << "if (fname) g_free (fname);" << endl + f_service_ << indent() << "if (fname) g_free (fname);" << '\n' << indent() << "thrift_protocol_skip (protocol, T_STRUCT, " - "NULL);" << endl + "NULL);" << '\n' << indent() << "thrift_protocol_read_message_end (protocol, " - "NULL);" << endl + "NULL);" << '\n' << indent() << "thrift_transport_read_end (" - "protocol->transport, NULL);" << endl + "protocol->transport, NULL);" << '\n' << indent() << "g_set_error (error, " "THRIFT_APPLICATION_EXCEPTION_ERROR, " "THRIFT_APPLICATION_EXCEPTION_ERROR_INVALID_MESSAGE_TYPE, " "\"invalid message type %d, expected T_REPLY\", mtype);" - << endl - << indent() << "return FALSE;" << endl; + << '\n' + << indent() << "return FALSE;" << '\n'; indent_down(); f_service_ << indent() << "} else if (strncmp (fname, \"" << name - << "\", " << name.length() << ") != 0) {" << endl; + << "\", " << name.length() << ") != 0) {" << '\n'; indent_up(); f_service_ << indent() << "thrift_protocol_skip (protocol, T_STRUCT, " - "NULL);" << endl + "NULL);" << '\n' << indent() << "thrift_protocol_read_message_end (protocol," - "error);" << endl + "error);" << '\n' << indent() << "thrift_transport_read_end (" - "protocol->transport, error);" << endl + "protocol->transport, error);" << '\n' << indent() << "g_set_error (error, " "THRIFT_APPLICATION_EXCEPTION_ERROR, " "THRIFT_APPLICATION_EXCEPTION_ERROR_WRONG_METHOD_NAME, " "\"wrong method name %s, expected " << name - << "\", fname);" << endl - << indent() << "if (fname) g_free (fname);" << endl - << indent() << "return FALSE;" << endl; + << "\", fname);" << '\n' + << indent() << "if (fname) g_free (fname);" << '\n' + << indent() << "return FALSE;" << '\n'; indent_down(); - f_service_ << indent() << "}" << endl - << indent() << "if (fname) g_free (fname);" << endl - << endl; + f_service_ << indent() << "}" << '\n' + << indent() << "if (fname) g_free (fname);" << '\n' + << '\n'; t_struct* xs = (*f_iter)->get_xceptions(); const std::vector& xceptions = xs->get_members(); @@ -1699,25 +1697,25 @@ void t_c_glib_generator::generate_service_client(t_service* tservice) { } f_service_ << indent() << "if (thrift_protocol_read_message_end (protocol, error) < 0)" - << endl << indent() << " return FALSE;" << endl << endl << indent() - << "if (!thrift_transport_read_end (protocol->transport, error))" << endl - << indent() << " return FALSE;" << endl << endl; + << '\n' << indent() << " return FALSE;" << '\n' << '\n' << indent() + << "if (!thrift_transport_read_end (protocol->transport, error))" << '\n' + << indent() << " return FALSE;" << '\n' << '\n'; // copy over any throw exceptions and return failure for (x_iter = xceptions.begin(); x_iter != xceptions.end(); x_iter++) { - f_service_ << indent() << "if (*" << (*x_iter)->get_name() << " != NULL)" << endl - << indent() << "{" << endl << indent() << " g_set_error (error, " + f_service_ << indent() << "if (*" << (*x_iter)->get_name() << " != NULL)" << '\n' + << indent() << "{" << '\n' << indent() << " g_set_error (error, " << this->nspace_uc << to_upper_case(initial_caps_to_underscores((*x_iter)->get_type()->get_name())) << "_ERROR, " << this->nspace_uc << to_upper_case(initial_caps_to_underscores((*x_iter)->get_type()->get_name())) - << "_ERROR_CODE, \"" << (*x_iter)->get_type()->get_name() << "\");" << endl - << indent() << " return FALSE;" << endl << indent() << "}" << endl; + << "_ERROR_CODE, \"" << (*x_iter)->get_type()->get_name() << "\");" << '\n' + << indent() << " return FALSE;" << '\n' << indent() << "}" << '\n'; } // Close function - indent(f_service_) << "return TRUE;" << endl; + indent(f_service_) << "return TRUE;" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; } // Open function @@ -1725,7 +1723,7 @@ void t_c_glib_generator::generate_service_client(t_service* tservice) { service_name_lc + string("_client_") + funname, (*f_iter)->get_arglist(), (*f_iter)->get_xceptions()); - indent(f_service_) << function_signature(&service_function) << endl; + indent(f_service_) << function_signature(&service_function) << '\n'; scope_up(f_service_); // wrap each function @@ -1738,7 +1736,7 @@ void t_c_glib_generator::generate_service_client(t_service* tservice) { for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { f_service_ << ", " << (*fld_iter)->get_name(); } - f_service_ << ", error))" << endl << indent() << " return FALSE;" << endl; + f_service_ << ", error))" << '\n' << indent() << " return FALSE;" << '\n'; // if not oneway, implement recv if (!(*f_iter)->is_oneway()) { @@ -1752,20 +1750,20 @@ void t_c_glib_generator::generate_service_client(t_service* tservice) { } f_service_ << indent() << "if (!" << this->nspace_lc << service_name_lc << "_client_recv_" - << funname << " (iface, " << ret << "error))" << endl << indent() - << " return FALSE;" << endl; + << funname << " (iface, " << ret << "error))" << '\n' << indent() + << " return FALSE;" << '\n'; } // return TRUE which means all functions were called OK - indent(f_service_) << "return TRUE;" << endl; + indent(f_service_) << "return TRUE;" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; } // create the interface initializer - f_service_ << "static void" << endl + f_service_ << "static void" << '\n' << this->nspace_lc << service_name_lc << "_if_interface_init (" - << this->nspace << service_name_ << "IfInterface *iface)" << endl; + << this->nspace << service_name_ << "IfInterface *iface)" << '\n'; scope_up(f_service_); if (functions.size() > 0) { for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -1773,62 +1771,62 @@ void t_c_glib_generator::generate_service_client(t_service* tservice) { string funname = initial_caps_to_underscores((*f_iter)->get_name()); f_service_ << indent() << "iface->" << funname << " = " << this->nspace_lc - << service_name_lc << "_client_" << funname << ";" << endl; + << service_name_lc << "_client_" << funname << ";" << '\n'; } } else { - f_service_ << indent() << "THRIFT_UNUSED_VAR (iface);" << endl; + f_service_ << indent() << "THRIFT_UNUSED_VAR (iface);" << '\n'; } scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // create the client instance initializer - f_service_ << "static void" << endl + f_service_ << "static void" << '\n' << this->nspace_lc << service_name_lc << "_client_init (" - << this->nspace << service_name_ << "Client *client)" << endl; + << this->nspace << service_name_ << "Client *client)" << '\n'; scope_up(f_service_); if (!extends_service) { - f_service_ << indent() << "client->input_protocol = NULL;" << endl - << indent() << "client->output_protocol = NULL;" << endl; + f_service_ << indent() << "client->input_protocol = NULL;" << '\n' + << indent() << "client->output_protocol = NULL;" << '\n'; } else { - f_service_ << indent() << "THRIFT_UNUSED_VAR (client);" << endl; + f_service_ << indent() << "THRIFT_UNUSED_VAR (client);" << '\n'; } scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // create the client class initializer - f_service_ << "static void" << endl << this->nspace_lc << service_name_lc + f_service_ << "static void" << '\n' << this->nspace_lc << service_name_lc << "_client_class_init (" << this->nspace << service_name_ << "ClientClass *cls)" - << endl << "{" << endl; + << '\n' << "{" << '\n'; if (!extends_service) { - f_service_ << " GObjectClass *gobject_class = G_OBJECT_CLASS (cls);" << endl - << " GParamSpec *param_spec;" << endl << endl + f_service_ << " GObjectClass *gobject_class = G_OBJECT_CLASS (cls);" << '\n' + << " GParamSpec *param_spec;" << '\n' << '\n' << " gobject_class->set_property = " << this->nspace_lc << service_name_lc - << "_client_set_property;" << endl + << "_client_set_property;" << '\n' << " gobject_class->get_property = " << this->nspace_lc << service_name_lc - << "_client_get_property;" << endl << endl - << " param_spec = g_param_spec_object (\"input_protocol\"," << endl - << " \"input protocol (construct)\"," << endl - << " \"Set the client input protocol\"," << endl - << " THRIFT_TYPE_PROTOCOL," << endl - << " G_PARAM_READWRITE);" << endl - << " g_object_class_install_property (gobject_class," << endl + << "_client_get_property;" << '\n' << '\n' + << " param_spec = g_param_spec_object (\"input_protocol\"," << '\n' + << " \"input protocol (construct)\"," << '\n' + << " \"Set the client input protocol\"," << '\n' + << " THRIFT_TYPE_PROTOCOL," << '\n' + << " G_PARAM_READWRITE);" << '\n' + << " g_object_class_install_property (gobject_class," << '\n' << " PROP_" << this->nspace_uc << service_name_uc - << "_CLIENT_INPUT_PROTOCOL, param_spec);" << endl << endl - << " param_spec = g_param_spec_object (\"output_protocol\"," << endl - << " \"output protocol (construct)\"," << endl - << " \"Set the client output protocol\"," << endl - << " THRIFT_TYPE_PROTOCOL," << endl - << " G_PARAM_READWRITE);" << endl - << " g_object_class_install_property (gobject_class," << endl + << "_CLIENT_INPUT_PROTOCOL, param_spec);" << '\n' << '\n' + << " param_spec = g_param_spec_object (\"output_protocol\"," << '\n' + << " \"output protocol (construct)\"," << '\n' + << " \"Set the client output protocol\"," << '\n' + << " THRIFT_TYPE_PROTOCOL," << '\n' + << " G_PARAM_READWRITE);" << '\n' + << " g_object_class_install_property (gobject_class," << '\n' << " PROP_" << this->nspace_uc << service_name_uc - << "_CLIENT_OUTPUT_PROTOCOL, param_spec);" << endl; + << "_CLIENT_OUTPUT_PROTOCOL, param_spec);" << '\n'; } else { - f_service_ << " THRIFT_UNUSED_VAR (cls);" << endl; + f_service_ << " THRIFT_UNUSED_VAR (cls);" << '\n'; } - f_service_ << "}" << endl << endl; + f_service_ << "}" << '\n' << '\n'; } /** @@ -1874,19 +1872,19 @@ void t_c_glib_generator::generate_service_handler(t_service* tservice) { // Generate the handler class' definition in the header file // Generate the handler instance definition - f_header_ << "/* " << service_name_ << " handler (abstract base class) */" << endl << "struct _" - << class_name << endl << "{" << endl; + f_header_ << "/* " << service_name_ << " handler (abstract base class) */" << '\n' << "struct _" + << class_name << '\n' << "{" << '\n'; indent_up(); - f_header_ << indent() << parent_class_name << " parent;" << endl; + f_header_ << indent() << parent_class_name << " parent;" << '\n'; indent_down(); - f_header_ << "};" << endl << "typedef struct _" << class_name << " " << class_name << ";" << endl - << endl; + f_header_ << "};" << '\n' << "typedef struct _" << class_name << " " << class_name << ";" << '\n' + << '\n'; // Generate the handler class definition, including its class members // (methods) - f_header_ << "struct _" << class_name << "Class" << endl << "{" << endl; + f_header_ << "struct _" << class_name << "Class" << '\n' << "{" << '\n'; indent_up(); - f_header_ << indent() << parent_class_name << "Class parent;" << endl << endl; + f_header_ << indent() << parent_class_name << "Class parent;" << '\n' << '\n'; for (function_iter = functions.begin(); function_iter != functions.end(); ++function_iter) { string method_name = initial_caps_to_underscores((*function_iter)->get_name()); @@ -1902,31 +1900,31 @@ void t_c_glib_generator::generate_service_handler(t_service* tservice) { + (has_args ? "" : (", " + argument_list(arg_list))) + (has_xceptions ? "" : (", " + xception_list(x_list))) + ", GError **error)"; - indent(f_header_) << "gboolean (*" << method_name << ") " << params << ";" << endl; + indent(f_header_) << "gboolean (*" << method_name << ") " << params << ";" << '\n'; } indent_down(); - f_header_ << "};" << endl << "typedef struct _" << class_name << "Class " << class_name - << "Class;" << endl << endl; + f_header_ << "};" << '\n' << "typedef struct _" << class_name << "Class " << class_name + << "Class;" << '\n' << '\n'; // Generate the remaining header boilerplate - f_header_ << "GType " << class_name_lc << "_get_type (void);" << endl << "#define " + f_header_ << "GType " << class_name_lc << "_get_type (void);" << '\n' << "#define " << this->nspace_uc << "TYPE_" << service_name_uc << "_HANDLER " - << "(" << class_name_lc << "_get_type())" << endl << "#define " << class_name_uc + << "(" << class_name_lc << "_get_type())" << '\n' << "#define " << class_name_uc << "(obj) " << "(G_TYPE_CHECK_INSTANCE_CAST ((obj), " << this->nspace_uc << "TYPE_" - << service_name_uc << "_HANDLER, " << class_name << "))" << endl << "#define " + << service_name_uc << "_HANDLER, " << class_name << "))" << '\n' << "#define " << this->nspace_uc << "IS_" << service_name_uc << "_HANDLER(obj) " << "(G_TYPE_CHECK_INSTANCE_TYPE ((obj), " << this->nspace_uc << "TYPE_" - << service_name_uc << "_HANDLER))" << endl << "#define " << class_name_uc + << service_name_uc << "_HANDLER))" << '\n' << "#define " << class_name_uc << "_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), " << this->nspace_uc << "TYPE_" - << service_name_uc << "_HANDLER, " << class_name << "Class))" << endl << "#define " + << service_name_uc << "_HANDLER, " << class_name << "Class))" << '\n' << "#define " << this->nspace_uc << "IS_" << service_name_uc << "_HANDLER_CLASS(c) " << "(G_TYPE_CHECK_CLASS_TYPE ((c), " << this->nspace_uc << "TYPE_" << service_name_uc - << "_HANDLER))" << endl << "#define " << this->nspace_uc << service_name_uc + << "_HANDLER))" << '\n' << "#define " << this->nspace_uc << service_name_uc << "_HANDLER_GET_CLASS(obj) " << "(G_TYPE_INSTANCE_GET_CLASS ((obj), " << this->nspace_uc << "TYPE_" - << service_name_uc << "_HANDLER, " << class_name << "Class))" << endl << endl; + << service_name_uc << "_HANDLER, " << class_name << "Class))" << '\n' << '\n'; // Generate the handler class' method definitions for (function_iter = functions.begin(); function_iter != functions.end(); ++function_iter) { @@ -1943,25 +1941,25 @@ void t_c_glib_generator::generate_service_handler(t_service* tservice) { + (has_args ? "" : (", " + argument_list(arg_list))) + (has_xceptions ? "" : (", " + xception_list(x_list))) + ", GError **error)"; - f_header_ << "gboolean " << class_name_lc << "_" << method_name << " " << params << ";" << endl; + f_header_ << "gboolean " << class_name_lc << "_" << method_name << " " << params << ";" << '\n'; } - f_header_ << endl; + f_header_ << '\n'; // Generate the handler's implementation in the implementation file // Generate the implementation boilerplate - f_service_ << "static void" << endl << class_name_lc << "_" << service_name_lc + f_service_ << "static void" << '\n' << class_name_lc << "_" << service_name_lc << "_if_interface_init (" << this->nspace << service_name_ << "IfInterface *iface);" - << endl << endl; + << '\n' << '\n'; args_indent = string(25, ' '); - f_service_ << "G_DEFINE_TYPE_WITH_CODE (" << class_name << ", " << endl << args_indent - << class_name_lc << "," << endl << args_indent << parent_type_name << "," << endl + f_service_ << "G_DEFINE_TYPE_WITH_CODE (" << class_name << ", " << '\n' << args_indent + << class_name_lc << "," << '\n' << args_indent << parent_type_name << "," << '\n' << args_indent << "G_IMPLEMENT_INTERFACE (" << this->nspace_uc << "TYPE_" - << service_name_uc << "_IF," << endl; + << service_name_uc << "_IF," << '\n'; args_indent += string(23, ' '); f_service_ << args_indent << class_name_lc << "_" << service_name_lc << "_if_interface_init))" - << endl << endl; + << '\n' << '\n'; // Generate the handler method implementations for (function_iter = functions.begin(); function_iter != functions.end(); ++function_iter) { @@ -1982,10 +1980,10 @@ void t_c_glib_generator::generate_service_handler(t_service* tservice) { x_list, (*function_iter)->is_oneway()); - indent(f_service_) << function_signature(&implementing_function) << endl; + indent(f_service_) << function_signature(&implementing_function) << '\n'; scope_up(f_service_); f_service_ << indent() << "g_return_val_if_fail (" << this->nspace_uc << "IS_" - << service_name_uc << "_HANDLER (iface), FALSE);" << endl << endl << indent() + << service_name_uc << "_HANDLER (iface), FALSE);" << '\n' << '\n' << indent() << "return " << class_name_uc << "_GET_CLASS (iface)" << "->" << method_name << " (iface, "; @@ -1998,42 +1996,42 @@ void t_c_glib_generator::generate_service_handler(t_service* tservice) { for (field_iter = xceptions.begin(); field_iter != xceptions.end(); ++field_iter) { f_service_ << (*field_iter)->get_name() << ", "; } - f_service_ << "error);" << endl; + f_service_ << "error);" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; } // Generate the handler interface initializer - f_service_ << "static void" << endl << class_name_lc << "_" << service_name_lc + f_service_ << "static void" << '\n' << class_name_lc << "_" << service_name_lc << "_if_interface_init (" << this->nspace << service_name_ << "IfInterface *iface)" - << endl; + << '\n'; scope_up(f_service_); if (functions.size() > 0) { for (function_iter = functions.begin(); function_iter != functions.end(); ++function_iter) { string method_name = initial_caps_to_underscores((*function_iter)->get_name()); f_service_ << indent() << "iface->" << method_name << " = " << class_name_lc << "_" - << method_name << ";" << endl; + << method_name << ";" << '\n'; } } else { - f_service_ << "THRIFT_UNUSED_VAR (iface);" << endl; + f_service_ << "THRIFT_UNUSED_VAR (iface);" << '\n'; } scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Generate the handler instance initializer - f_service_ << "static void" << endl << class_name_lc << "_init (" << class_name << " *self)" - << endl; + f_service_ << "static void" << '\n' << class_name_lc << "_init (" << class_name << " *self)" + << '\n'; scope_up(f_service_); - f_service_ << indent() << "THRIFT_UNUSED_VAR (self);" << endl; + f_service_ << indent() << "THRIFT_UNUSED_VAR (self);" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Generate the handler class initializer - f_service_ << "static void" << endl + f_service_ << "static void" << '\n' << class_name_lc << "_class_init (" << class_name << "Class *cls)" - << endl; + << '\n'; scope_up(f_service_); if (functions.size() > 0) { for (function_iter = functions.begin(); @@ -2043,14 +2041,14 @@ void t_c_glib_generator::generate_service_handler(t_service* tservice) { string method_name = initial_caps_to_underscores(function_name); // All methods are pure virtual and must be implemented by subclasses - f_service_ << indent() << "cls->" << method_name << " = NULL;" << endl; + f_service_ << indent() << "cls->" << method_name << " = NULL;" << '\n'; } } else { - f_service_ << indent() << "THRIFT_UNUSED_VAR (cls);" << endl; + f_service_ << indent() << "THRIFT_UNUSED_VAR (cls);" << '\n'; } scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; } /** @@ -2104,84 +2102,84 @@ void t_c_glib_generator::generate_service_processor(t_service* tservice) { // Generate the processor class' definition in the header file // Generate the processor instance definition - f_header_ << "/* " << service_name_ << " processor */" << endl << "struct _" << class_name << endl - << "{" << endl; + f_header_ << "/* " << service_name_ << " processor */" << '\n' << "struct _" << class_name << '\n' + << "{" << '\n'; indent_up(); - f_header_ << indent() << parent_class_name << " parent;" << endl << endl << indent() - << "/* protected */" << endl << indent() - << this->nspace + service_name_ + "Handler *handler;" << endl << indent() - << "GHashTable *process_map;" << endl; + f_header_ << indent() << parent_class_name << " parent;" << '\n' << '\n' << indent() + << "/* protected */" << '\n' << indent() + << this->nspace + service_name_ + "Handler *handler;" << '\n' << indent() + << "GHashTable *process_map;" << '\n'; indent_down(); - f_header_ << "};" << endl << "typedef struct _" << class_name << " " << class_name << ";" << endl - << endl; + f_header_ << "};" << '\n' << "typedef struct _" << class_name << " " << class_name << ";" << '\n' + << '\n'; // Generate the processor class definition - f_header_ << "struct _" << class_name << "Class" << endl << "{" << endl; + f_header_ << "struct _" << class_name << "Class" << '\n' << "{" << '\n'; indent_up(); - f_header_ << indent() << parent_class_name << "Class parent;" << endl << endl << indent() - << "/* protected */" << endl << indent() - << "gboolean (*dispatch_call) (ThriftDispatchProcessor *processor," << endl; + f_header_ << indent() << parent_class_name << "Class parent;" << '\n' << '\n' << indent() + << "/* protected */" << '\n' << indent() + << "gboolean (*dispatch_call) (ThriftDispatchProcessor *processor," << '\n'; args_indent = indent() + string(27, ' '); - f_header_ << args_indent << "ThriftProtocol *in," << endl << args_indent << "ThriftProtocol *out," - << endl << args_indent << "gchar *fname," << endl << args_indent << "gint32 seqid," - << endl << args_indent << "GError **error);" << endl; + f_header_ << args_indent << "ThriftProtocol *in," << '\n' << args_indent << "ThriftProtocol *out," + << '\n' << args_indent << "gchar *fname," << '\n' << args_indent << "gint32 seqid," + << '\n' << args_indent << "GError **error);" << '\n'; indent_down(); - f_header_ << "};" << endl << "typedef struct _" << class_name << "Class " << class_name - << "Class;" << endl << endl; + f_header_ << "};" << '\n' << "typedef struct _" << class_name << "Class " << class_name + << "Class;" << '\n' << '\n'; // Generate the remaining header boilerplate - f_header_ << "GType " << class_name_lc << "_get_type (void);" << endl << "#define " + f_header_ << "GType " << class_name_lc << "_get_type (void);" << '\n' << "#define " << this->nspace_uc << "TYPE_" << service_name_uc << "_PROCESSOR " - << "(" << class_name_lc << "_get_type())" << endl << "#define " << class_name_uc + << "(" << class_name_lc << "_get_type())" << '\n' << "#define " << class_name_uc << "(obj) " << "(G_TYPE_CHECK_INSTANCE_CAST ((obj), " << this->nspace_uc << "TYPE_" - << service_name_uc << "_PROCESSOR, " << class_name << "))" << endl << "#define " + << service_name_uc << "_PROCESSOR, " << class_name << "))" << '\n' << "#define " << this->nspace_uc << "IS_" << service_name_uc << "_PROCESSOR(obj) " << "(G_TYPE_CHECK_INSTANCE_TYPE ((obj), " << this->nspace_uc << "TYPE_" - << service_name_uc << "_PROCESSOR))" << endl << "#define " << class_name_uc + << service_name_uc << "_PROCESSOR))" << '\n' << "#define " << class_name_uc << "_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), " << this->nspace_uc << "TYPE_" - << service_name_uc << "_PROCESSOR, " << class_name << "Class))" << endl << "#define " + << service_name_uc << "_PROCESSOR, " << class_name << "Class))" << '\n' << "#define " << this->nspace_uc << "IS_" << service_name_uc << "_PROCESSOR_CLASS(c) " << "(G_TYPE_CHECK_CLASS_TYPE ((c), " << this->nspace_uc << "TYPE_" << service_name_uc - << "_PROCESSOR))" << endl << "#define " << this->nspace_uc << service_name_uc + << "_PROCESSOR))" << '\n' << "#define " << this->nspace_uc << service_name_uc << "_PROCESSOR_GET_CLASS(obj) " << "(G_TYPE_INSTANCE_GET_CLASS ((obj), " << this->nspace_uc << "TYPE_" - << service_name_uc << "_PROCESSOR, " << class_name << "Class))" << endl << endl; + << service_name_uc << "_PROCESSOR, " << class_name << "Class))" << '\n' << '\n'; // Generate the processor's implementation in the implementation file // Generate the processor's properties enum - f_service_ << "enum _" << class_name << "Properties" << endl << "{" << endl; + f_service_ << "enum _" << class_name << "Properties" << '\n' << "{" << '\n'; indent_up(); - f_service_ << indent() << "PROP_" << class_name_uc << "_0," << endl << indent() << "PROP_" - << class_name_uc << "_HANDLER" << endl; + f_service_ << indent() << "PROP_" << class_name_uc << "_0," << '\n' << indent() << "PROP_" + << class_name_uc << "_HANDLER" << '\n'; indent_down(); - f_service_ << "};" << endl << endl; + f_service_ << "};" << '\n' << '\n'; // Generate the implementation boilerplate args_indent = string(15, ' '); - f_service_ << "G_DEFINE_TYPE (" << class_name << "," << endl << args_indent << class_name_lc - << "," << endl << args_indent << parent_type_name << ")" << endl << endl; + f_service_ << "G_DEFINE_TYPE (" << class_name << "," << '\n' << args_indent << class_name_lc + << "," << '\n' << args_indent << parent_type_name << ")" << '\n' << '\n'; // Generate the processor's processing-function type args_indent = string(process_function_type_name.length() + 23, ' '); f_service_ << "typedef gboolean (* " << process_function_type_name << ") (" - << class_name << " *, " << endl - << args_indent << "gint32," << endl - << args_indent << "ThriftProtocol *," << endl - << args_indent << "ThriftProtocol *," << endl - << args_indent << "GError **);" << endl - << endl; + << class_name << " *, " << '\n' + << args_indent << "gint32," << '\n' + << args_indent << "ThriftProtocol *," << '\n' + << args_indent << "ThriftProtocol *," << '\n' + << args_indent << "GError **);" << '\n' + << '\n'; // Generate the processor's processing-function-definition type - f_service_ << "typedef struct" << endl - << "{" << endl; + f_service_ << "typedef struct" << '\n' + << "{" << '\n'; indent_up(); - f_service_ << indent() << "gchar *name;" << endl - << indent() << process_function_type_name << " function;" << endl; + f_service_ << indent() << "gchar *name;" << '\n' + << indent() << process_function_type_name << " function;" << '\n'; indent_down(); - f_service_ << "} " << process_function_def_type_name << ";" << endl - << endl; + f_service_ << "} " << process_function_def_type_name << ";" << '\n' + << '\n'; // Generate forward declarations of the processor's processing functions so we // can refer to them in the processing-function-definition struct below and @@ -2193,23 +2191,23 @@ void t_c_glib_generator::generate_service_processor(t_service* tservice) { + initial_caps_to_underscores((*function_iter)->get_name()); args_indent = string(function_name.length() + 2, ' '); - f_service_ << "static gboolean" << endl + f_service_ << "static gboolean" << '\n' << function_name << " (" - << class_name << " *," << endl - << args_indent << "gint32," << endl - << args_indent << "ThriftProtocol *," << endl - << args_indent << "ThriftProtocol *," << endl - << args_indent << "GError **);" << endl; + << class_name << " *," << '\n' + << args_indent << "gint32," << '\n' + << args_indent << "ThriftProtocol *," << '\n' + << args_indent << "ThriftProtocol *," << '\n' + << args_indent << "GError **);" << '\n'; } - f_service_ << endl; + f_service_ << '\n'; // Generate the processor's processing-function definitions, if the service // defines any methods if (functions.size() > 0) { f_service_ << indent() << "static " << process_function_def_type_name - << endl + << '\n' << indent() << class_name_lc << "_process_function_defs[" - << functions.size() << "] = {" << endl; + << functions.size() << "] = {" << '\n'; indent_up(); for (function_iter = functions.begin(); function_iter != functions.end(); @@ -2218,17 +2216,17 @@ void t_c_glib_generator::generate_service_processor(t_service* tservice) { string process_function_name = class_name_lc + "_process_" + initial_caps_to_underscores(service_function_name); - f_service_ << indent() << "{" << endl; + f_service_ << indent() << "{" << '\n'; indent_up(); - f_service_ << indent() << "\"" << service_function_name << "\"," << endl - << indent() << process_function_name << endl; + f_service_ << indent() << "\"" << service_function_name << "\"," << '\n' + << indent() << process_function_name << '\n'; indent_down(); f_service_ << indent() << "}" - << (function_iter == --functions.end() ? "" : ",") << endl; + << (function_iter == --functions.end() ? "" : ",") << '\n'; } indent_down(); - f_service_ << indent() << "};" << endl - << endl; + f_service_ << indent() << "};" << '\n' + << '\n'; } // Generate the processor's processing functions @@ -2262,76 +2260,76 @@ void t_c_glib_generator::generate_service_processor(t_service* tservice) { + initial_caps_to_underscores(service_function_name); args_indent = string(function_name.length() + 2, ' '); - f_service_ << "static gboolean" << endl << function_name << " (" << class_name << " *self," - << endl << args_indent << "gint32 sequence_id," << endl << args_indent - << "ThriftProtocol *input_protocol," << endl << args_indent - << "ThriftProtocol *output_protocol," << endl << args_indent << "GError **error)" - << endl; + f_service_ << "static gboolean" << '\n' << function_name << " (" << class_name << " *self," + << '\n' << args_indent << "gint32 sequence_id," << '\n' << args_indent + << "ThriftProtocol *input_protocol," << '\n' << args_indent + << "ThriftProtocol *output_protocol," << '\n' << args_indent << "GError **error)" + << '\n'; scope_up(f_service_); - f_service_ << indent() << "gboolean result = TRUE;" << endl - << indent() << "ThriftTransport * transport;" << endl - << indent() << "ThriftApplicationException *xception;" << endl - << indent() << args_class_name + " * args =" << endl; + f_service_ << indent() << "gboolean result = TRUE;" << '\n' + << indent() << "ThriftTransport * transport;" << '\n' + << indent() << "ThriftApplicationException *xception;" << '\n' + << indent() << args_class_name + " * args =" << '\n'; indent_up(); - f_service_ << indent() << "g_object_new (" << args_class_type << ", NULL);" << endl << endl; + f_service_ << indent() << "g_object_new (" << args_class_type << ", NULL);" << '\n' << '\n'; indent_down(); if ((*function_iter)->is_oneway()) { - f_service_ << indent() << "THRIFT_UNUSED_VAR (sequence_id);" << endl << indent() - << "THRIFT_UNUSED_VAR (output_protocol);" << endl << endl; + f_service_ << indent() << "THRIFT_UNUSED_VAR (sequence_id);" << '\n' << indent() + << "THRIFT_UNUSED_VAR (output_protocol);" << '\n' << '\n'; } f_service_ << indent() << "g_object_get (input_protocol, \"transport\", " - << "&transport, NULL);" << endl << endl; + << "&transport, NULL);" << '\n' << '\n'; // Read the method's arguments from the caller f_service_ << indent() << "if ((thrift_struct_read (THRIFT_STRUCT (args), " - << "input_protocol, error) != -1) &&" << endl << indent() + << "input_protocol, error) != -1) &&" << '\n' << indent() << " (thrift_protocol_read_message_end (input_protocol, " - << "error) != -1) &&" << endl << indent() - << " (thrift_transport_read_end (transport, error) != FALSE))" << endl; + << "error) != -1) &&" << '\n' << indent() + << " (thrift_transport_read_end (transport, error) != FALSE))" << '\n'; scope_up(f_service_); for (arg_iter = args.begin(); arg_iter != args.end(); ++arg_iter) { f_service_ << indent() << property_type_name((*arg_iter)->get_type()) << " " - << (*arg_iter)->get_name() << ";" << endl; + << (*arg_iter)->get_name() << ";" << '\n'; } for (xception_iter = xceptions.begin(); xception_iter != xceptions.end(); ++xception_iter) { f_service_ << indent() << type_name((*xception_iter)->get_type()) << " " - << initial_caps_to_underscores((*xception_iter)->get_name()) << " = NULL;" << endl; + << initial_caps_to_underscores((*xception_iter)->get_name()) << " = NULL;" << '\n'; } if (has_return_value) { - f_service_ << indent() << property_type_name(return_type) << " return_value;" << endl; + f_service_ << indent() << property_type_name(return_type) << " return_value;" << '\n'; } if (!(*function_iter)->is_oneway()) { - f_service_ << indent() << result_class_name << " * result_struct;" << endl; + f_service_ << indent() << result_class_name << " * result_struct;" << '\n'; } - f_service_ << endl; + f_service_ << '\n'; if (args.size() > 0) { - f_service_ << indent() << "g_object_get (args," << endl; + f_service_ << indent() << "g_object_get (args," << '\n'; args_indent = indent() + string(14, ' '); for (arg_iter = args.begin(); arg_iter != args.end(); ++arg_iter) { string arg_name = (*arg_iter)->get_name(); - f_service_ << args_indent << "\"" << arg_name << "\", &" << arg_name << "," << endl; + f_service_ << args_indent << "\"" << arg_name << "\", &" << arg_name << "," << '\n'; } - f_service_ << args_indent << "NULL);" << endl << endl; + f_service_ << args_indent << "NULL);" << '\n' << '\n'; } if (!(*function_iter)->is_oneway()) { - f_service_ << indent() << "g_object_unref (transport);" << endl << indent() + f_service_ << indent() << "g_object_unref (transport);" << '\n' << indent() << "g_object_get (output_protocol, \"transport\", " - << "&transport, NULL);" << endl << endl << indent() - << "result_struct = g_object_new (" << result_class_type << ", NULL);" << endl; + << "&transport, NULL);" << '\n' << '\n' << indent() + << "result_struct = g_object_new (" << result_class_type << ", NULL);" << '\n'; if (has_return_value) { f_service_ << indent() << "g_object_get (result_struct, " - "\"success\", &return_value, NULL);" << endl; + "\"success\", &return_value, NULL);" << '\n'; } - f_service_ << endl; + f_service_ << '\n'; } // Pass the arguments to the corresponding method in the handler f_service_ << indent() << "if (" << handler_function_name << " (" << this->nspace_uc - << service_name_uc << "_IF (self->handler)," << endl; + << service_name_uc << "_IF (self->handler)," << '\n'; args_indent = indent() + string(handler_function_name.length() + 6, ' '); if (has_return_value) { string return_type_name = type_name(return_type); @@ -2351,16 +2349,16 @@ void t_c_glib_generator::generate_service_processor(t_service* tservice) { f_service_ << "(" << return_type_name << ")"; } - f_service_ << "&return_value," << endl; + f_service_ << "&return_value," << '\n'; } for (arg_iter = args.begin(); arg_iter != args.end(); ++arg_iter) { - f_service_ << args_indent << (*arg_iter)->get_name() << "," << endl; + f_service_ << args_indent << (*arg_iter)->get_name() << "," << '\n'; } for (xception_iter = xceptions.begin(); xception_iter != xceptions.end(); ++xception_iter) { f_service_ << args_indent << "&" << initial_caps_to_underscores((*xception_iter)->get_name()) - << "," << endl; + << "," << '\n'; } - f_service_ << args_indent << "error) == TRUE)" << endl; + f_service_ << args_indent << "error) == TRUE)" << '\n'; scope_up(f_service_); // The handler reported success; return the result, if any, to the caller @@ -2373,24 +2371,24 @@ void t_c_glib_generator::generate_service_processor(t_service* tservice) { << "(" << type_name(return_type) << ")"; } f_service_ << "return_value, " - << "NULL);" << endl; - f_service_ << endl; + << "NULL);" << '\n'; + f_service_ << '\n'; } - f_service_ << indent() << "result =" << endl; + f_service_ << indent() << "result =" << '\n'; indent_up(); - f_service_ << indent() << "((thrift_protocol_write_message_begin (output_protocol," << endl; + f_service_ << indent() << "((thrift_protocol_write_message_begin (output_protocol," << '\n'; args_indent = indent() + string(39, ' '); - f_service_ << args_indent << "\"" << service_function_name << "\"," << endl << args_indent - << "T_REPLY," << endl << args_indent << "sequence_id," << endl << args_indent - << "error) != -1) &&" << endl << indent() - << " (thrift_struct_write (THRIFT_STRUCT (result_struct)," << endl; + f_service_ << args_indent << "\"" << service_function_name << "\"," << '\n' << args_indent + << "T_REPLY," << '\n' << args_indent << "sequence_id," << '\n' << args_indent + << "error) != -1) &&" << '\n' << indent() + << " (thrift_struct_write (THRIFT_STRUCT (result_struct)," << '\n'; args_indent = indent() + string(23, ' '); - f_service_ << args_indent << "output_protocol," << endl << args_indent << "error) != -1));" - << endl; + f_service_ << args_indent << "output_protocol," << '\n' << args_indent << "error) != -1));" + << '\n'; indent_down(); } scope_down(f_service_); - f_service_ << indent() << "else" << endl; + f_service_ << indent() << "else" << '\n'; scope_up(f_service_); // The handler reported failure; check to see if an application-defined @@ -2399,28 +2397,28 @@ void t_c_glib_generator::generate_service_processor(t_service* tservice) { if (xceptions.size() > 0) { for (xception_iter = xceptions.begin(); xception_iter != xceptions.end(); ++xception_iter) { f_service_ << "if (" << initial_caps_to_underscores((*xception_iter)->get_name()) - << " != NULL)" << endl; + << " != NULL)" << '\n'; scope_up(f_service_); - f_service_ << indent() << "g_object_set (result_struct," << endl; + f_service_ << indent() << "g_object_set (result_struct," << '\n'; args_indent = indent() + string(14, ' '); f_service_ << args_indent << "\"" << (*xception_iter)->get_name() << "\", " - << (*xception_iter)->get_name() << "," << endl << args_indent << "NULL);" << endl - << endl; - f_service_ << indent() << "g_object_unref ("<< (*xception_iter)->get_name() <<");"<< endl; - f_service_ << indent() << "result =" << endl; + << (*xception_iter)->get_name() << "," << '\n' << args_indent << "NULL);" << '\n' + << '\n'; + f_service_ << indent() << "g_object_unref ("<< (*xception_iter)->get_name() <<");"<< '\n'; + f_service_ << indent() << "result =" << '\n'; indent_up(); - f_service_ << indent() << "((thrift_protocol_write_message_begin (output_protocol," << endl; + f_service_ << indent() << "((thrift_protocol_write_message_begin (output_protocol," << '\n'; args_indent = indent() + string(39, ' '); - f_service_ << args_indent << "\"" << service_function_name << "\"," << endl << args_indent - << "T_REPLY," << endl << args_indent << "sequence_id," << endl << args_indent - << "error) != -1) &&" << endl << indent() - << " (thrift_struct_write (THRIFT_STRUCT (result_struct)," << endl; + f_service_ << args_indent << "\"" << service_function_name << "\"," << '\n' << args_indent + << "T_REPLY," << '\n' << args_indent << "sequence_id," << '\n' << args_indent + << "error) != -1) &&" << '\n' << indent() + << " (thrift_struct_write (THRIFT_STRUCT (result_struct)," << '\n'; args_indent = indent() + string(23, ' '); - f_service_ << args_indent << "output_protocol," << endl << args_indent << "error) != -1));" - << endl; + f_service_ << args_indent << "output_protocol," << '\n' << args_indent << "error) != -1));" + << '\n'; indent_down(); scope_down(f_service_); - f_service_ << indent() << "else" << endl; + f_service_ << indent() << "else" << '\n'; } scope_up(f_service_); @@ -2430,41 +2428,41 @@ void t_c_glib_generator::generate_service_processor(t_service* tservice) { // If the handler reported failure but raised no application-defined // exception, return a Thrift application exception with the information // returned via GLib's own error-reporting mechanism - f_service_ << "if (*error == NULL)" << endl; + f_service_ << "if (*error == NULL)" << '\n'; indent_up(); f_service_ << indent() << "g_warning (\"" << service_name_ << "." - << (*function_iter)->get_name() << " implementation returned FALSE \"" << endl - << indent() << string(11, ' ') << "\"but did not set an error\");" << endl << endl; + << (*function_iter)->get_name() << " implementation returned FALSE \"" << '\n' + << indent() << string(11, ' ') << "\"but did not set an error\");" << '\n' << '\n'; indent_down(); - f_service_ << indent() << "xception =" << endl; + f_service_ << indent() << "xception =" << '\n'; indent_up(); - f_service_ << indent() << "g_object_new (THRIFT_TYPE_APPLICATION_EXCEPTION," << endl; + f_service_ << indent() << "g_object_new (THRIFT_TYPE_APPLICATION_EXCEPTION," << '\n'; args_indent = indent() + string(14, ' '); - f_service_ << args_indent << "\"type\", *error != NULL ? (*error)->code :" << endl + f_service_ << args_indent << "\"type\", *error != NULL ? (*error)->code :" << '\n' << args_indent << string(11, ' ') << "THRIFT_APPLICATION_EXCEPTION_ERROR_UNKNOWN," - << endl << args_indent << "\"message\", *error != NULL ? (*error)->message : NULL," - << endl << args_indent << "NULL);" << endl; + << '\n' << args_indent << "\"message\", *error != NULL ? (*error)->message : NULL," + << '\n' << args_indent << "NULL);" << '\n'; indent_down(); - f_service_ << indent() << "g_clear_error (error);" << endl << endl << indent() - << "result =" << endl; + f_service_ << indent() << "g_clear_error (error);" << '\n' << '\n' << indent() + << "result =" << '\n'; indent_up(); - f_service_ << indent() << "((thrift_protocol_write_message_begin (output_protocol," << endl; + f_service_ << indent() << "((thrift_protocol_write_message_begin (output_protocol," << '\n'; args_indent = indent() + string(39, ' '); - f_service_ << args_indent << "\"" << service_function_name << "\"," << endl << args_indent - << "T_EXCEPTION," << endl << args_indent << "sequence_id," << endl << args_indent - << "error) != -1) &&" << endl << indent() - << " (thrift_struct_write (THRIFT_STRUCT (xception)," << endl; + f_service_ << args_indent << "\"" << service_function_name << "\"," << '\n' << args_indent + << "T_EXCEPTION," << '\n' << args_indent << "sequence_id," << '\n' << args_indent + << "error) != -1) &&" << '\n' << indent() + << " (thrift_struct_write (THRIFT_STRUCT (xception)," << '\n'; args_indent = indent() + string(23, ' '); - f_service_ << args_indent << "output_protocol," << endl << args_indent << "error) != -1));" - << endl; + f_service_ << args_indent << "output_protocol," << '\n' << args_indent << "error) != -1));" + << '\n'; indent_down(); - f_service_ << endl << indent() << "g_object_unref (xception);" << endl; + f_service_ << '\n' << indent() << "g_object_unref (xception);" << '\n'; if (xceptions.size() > 0) { scope_down(f_service_); } scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Dellocate or unref retrieved argument values as necessary for (arg_iter = args.begin(); arg_iter != args.end(); ++arg_iter) { @@ -2475,17 +2473,17 @@ void t_c_glib_generator::generate_service_processor(t_service* tservice) { t_base_type* base_type = ((t_base_type*)arg_type); if (base_type->get_base() == t_base_type::TYPE_STRING) { - f_service_ << indent() << "if (" << arg_name << " != NULL)" << endl; + f_service_ << indent() << "if (" << arg_name << " != NULL)" << '\n'; indent_up(); if (base_type->is_binary()) { - f_service_ << indent() << "g_byte_array_unref (" << arg_name << ");" << endl; + f_service_ << indent() << "g_byte_array_unref (" << arg_name << ");" << '\n'; } else { - f_service_ << indent() << "g_free (" << arg_name << ");" << endl; + f_service_ << indent() << "g_free (" << arg_name << ");" << '\n'; } indent_down(); } } else if (arg_type->is_container()) { - f_service_ << indent() << "if (" << arg_name << " != NULL)" << endl; + f_service_ << indent() << "if (" << arg_name << " != NULL)" << '\n'; indent_up(); if (arg_type->is_list()) { @@ -2497,16 +2495,16 @@ void t_c_glib_generator::generate_service_processor(t_service* tservice) { } else { f_service_ << "g_ptr_array_unref"; } - f_service_ << " (" << arg_name << ");" << endl; + f_service_ << " (" << arg_name << ");" << '\n'; } else if (arg_type->is_map() || arg_type->is_set()) { - f_service_ << indent() << "g_hash_table_unref (" << arg_name << ");" << endl; + f_service_ << indent() << "g_hash_table_unref (" << arg_name << ");" << '\n'; } indent_down(); } else if (arg_type->is_struct()) { - f_service_ << indent() << "if (" << arg_name << " != NULL)" << endl; + f_service_ << indent() << "if (" << arg_name << " != NULL)" << '\n'; indent_up(); - f_service_ << indent() << "g_object_unref (" << arg_name << ");" << endl; + f_service_ << indent() << "g_object_unref (" << arg_name << ");" << '\n'; indent_down(); } } @@ -2518,17 +2516,17 @@ void t_c_glib_generator::generate_service_processor(t_service* tservice) { if (return_type->is_base_type()) { t_base_type* base_type = ((t_base_type*)return_type); if (base_type->get_base() == t_base_type::TYPE_STRING) { - f_service_ << indent() << "if (return_value != NULL)" << endl; + f_service_ << indent() << "if (return_value != NULL)" << '\n'; indent_up(); if (base_type->is_binary()) { - f_service_ << indent() << "g_byte_array_unref (return_value);" << endl; + f_service_ << indent() << "g_byte_array_unref (return_value);" << '\n'; } else { - f_service_ << indent() << "g_free (return_value);" << endl; + f_service_ << indent() << "g_free (return_value);" << '\n'; } indent_down(); } } else if (return_type->is_container()) { - f_service_ << indent() << "if (return_value != NULL)" << endl; + f_service_ << indent() << "if (return_value != NULL)" << '\n'; indent_up(); if (return_type->is_list()) { @@ -2540,81 +2538,81 @@ void t_c_glib_generator::generate_service_processor(t_service* tservice) { } else { f_service_ << "g_ptr_array_unref"; } - f_service_ << " (return_value);" << endl; + f_service_ << " (return_value);" << '\n'; } else if (return_type->is_map() || return_type->is_set()) { - f_service_ << indent() << "g_hash_table_unref (return_value);" << endl; + f_service_ << indent() << "g_hash_table_unref (return_value);" << '\n'; } indent_down(); } else if (return_type->is_struct()) { - f_service_ << indent() << "if (return_value != NULL)" << endl; + f_service_ << indent() << "if (return_value != NULL)" << '\n'; indent_up(); - f_service_ << indent() << "g_object_unref (return_value);" << endl; + f_service_ << indent() << "g_object_unref (return_value);" << '\n'; indent_down(); } } - f_service_ << indent() << "g_object_unref (result_struct);" << endl << endl << indent() - << "if (result == TRUE)" << endl; + f_service_ << indent() << "g_object_unref (result_struct);" << '\n' << '\n' << indent() + << "if (result == TRUE)" << '\n'; indent_up(); - f_service_ << indent() << "result =" << endl; + f_service_ << indent() << "result =" << '\n'; indent_up(); f_service_ << indent() << "((thrift_protocol_write_message_end " - << "(output_protocol, error) != -1) &&" << endl << indent() + << "(output_protocol, error) != -1) &&" << '\n' << indent() << " (thrift_transport_write_end (transport, error) " - << "!= FALSE) &&" << endl << indent() + << "!= FALSE) &&" << '\n' << indent() << " (thrift_transport_flush (transport, error) " - << "!= FALSE));" << endl; + << "!= FALSE));" << '\n'; indent_down(); indent_down(); } scope_down(f_service_); - f_service_ << indent() << "else" << endl; + f_service_ << indent() << "else" << '\n'; indent_up(); - f_service_ << indent() << "result = FALSE;" << endl; + f_service_ << indent() << "result = FALSE;" << '\n'; indent_down(); - f_service_ << endl << indent() << "g_object_unref (transport);" << endl << indent() - << "g_object_unref (args);" << endl << endl << indent() << "return result;" << endl; + f_service_ << '\n' << indent() << "g_object_unref (transport);" << '\n' << indent() + << "g_object_unref (args);" << '\n' << '\n' << indent() << "return result;" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; } // Generate the processor's dispatch_call implementation function_name = class_name_lc + "_dispatch_call"; args_indent = indent() + string(function_name.length() + 2, ' '); - f_service_ << "static gboolean" << endl << function_name - << " (ThriftDispatchProcessor *dispatch_processor," << endl << args_indent - << "ThriftProtocol *input_protocol," << endl << args_indent - << "ThriftProtocol *output_protocol," << endl << args_indent << "gchar *method_name," - << endl << args_indent << "gint32 sequence_id," << endl << args_indent - << "GError **error)" << endl; + f_service_ << "static gboolean" << '\n' << function_name + << " (ThriftDispatchProcessor *dispatch_processor," << '\n' << args_indent + << "ThriftProtocol *input_protocol," << '\n' << args_indent + << "ThriftProtocol *output_protocol," << '\n' << args_indent << "gchar *method_name," + << '\n' << args_indent << "gint32 sequence_id," << '\n' << args_indent + << "GError **error)" << '\n'; scope_up(f_service_); f_service_ << indent() << class_name_lc << "_process_function_def *" - << "process_function_def;" << endl; - f_service_ << indent() << "gboolean dispatch_result = FALSE;" << endl << endl << indent() - << class_name << " *self = " << class_name_uc << " (dispatch_processor);" << endl; + << "process_function_def;" << '\n'; + f_service_ << indent() << "gboolean dispatch_result = FALSE;" << '\n' << '\n' << indent() + << class_name << " *self = " << class_name_uc << " (dispatch_processor);" << '\n'; f_service_ << indent() << parent_class_name << "Class " - "*parent_class =" << endl; + "*parent_class =" << '\n'; indent_up(); f_service_ << indent() << "g_type_class_peek_parent (" << class_name_uc << "_GET_CLASS (self));" - << endl; + << '\n'; indent_down(); - f_service_ << endl + f_service_ << '\n' << indent() << "process_function_def = " - << "g_hash_table_lookup (self->process_map, method_name);" << endl - << indent() << "if (process_function_def != NULL)" << endl; + << "g_hash_table_lookup (self->process_map, method_name);" << '\n' + << indent() << "if (process_function_def != NULL)" << '\n'; scope_up(f_service_); args_indent = indent() + string(53, ' '); - f_service_ << indent() << "g_free (method_name);" << endl + f_service_ << indent() << "g_free (method_name);" << '\n' << indent() << "dispatch_result = " - << "(*process_function_def->function) (self," << endl - << args_indent << "sequence_id," << endl - << args_indent << "input_protocol," << endl - << args_indent << "output_protocol," << endl - << args_indent << "error);" << endl; + << "(*process_function_def->function) (self," << '\n' + << args_indent << "sequence_id," << '\n' + << args_indent << "input_protocol," << '\n' + << args_indent << "output_protocol," << '\n' + << args_indent << "error);" << '\n'; scope_down(f_service_); - f_service_ << indent() << "else" << endl; + f_service_ << indent() << "else" << '\n'; scope_up(f_service_); // Method name not recognized; chain up to our parent processor---note the @@ -2622,160 +2620,160 @@ void t_c_glib_generator::generate_service_processor(t_service* tservice) { // will return an application exception to the caller if no class in the // hierarchy recognizes the method name f_service_ << indent() << "dispatch_result = parent_class->dispatch_call " - "(dispatch_processor," << endl; + "(dispatch_processor," << '\n'; args_indent = indent() + string(47, ' '); - f_service_ << args_indent << "input_protocol," << endl << args_indent << "output_protocol," - << endl << args_indent << "method_name," << endl << args_indent << "sequence_id," - << endl << args_indent << "error);" << endl; + f_service_ << args_indent << "input_protocol," << '\n' << args_indent << "output_protocol," + << '\n' << args_indent << "method_name," << '\n' << args_indent << "sequence_id," + << '\n' << args_indent << "error);" << '\n'; scope_down(f_service_); - f_service_ << endl << indent() << "return dispatch_result;" << endl; + f_service_ << '\n' << indent() << "return dispatch_result;" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Generate the processor's property setter function_name = class_name_lc + "_set_property"; args_indent = string(function_name.length() + 2, ' '); - f_service_ << "static void" << endl << function_name << " (GObject *object," << endl - << args_indent << "guint property_id," << endl << args_indent << "const GValue *value," - << endl << args_indent << "GParamSpec *pspec)" << endl; + f_service_ << "static void" << '\n' << function_name << " (GObject *object," << '\n' + << args_indent << "guint property_id," << '\n' << args_indent << "const GValue *value," + << '\n' << args_indent << "GParamSpec *pspec)" << '\n'; scope_up(f_service_); - f_service_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << endl - << endl << indent() << "switch (property_id)" << endl; + f_service_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << '\n' + << '\n' << indent() << "switch (property_id)" << '\n'; scope_up(f_service_); - f_service_ << indent() << "case PROP_" << class_name_uc << "_HANDLER:" << endl; + f_service_ << indent() << "case PROP_" << class_name_uc << "_HANDLER:" << '\n'; indent_up(); - f_service_ << indent() << "if (self->handler != NULL)" << endl; + f_service_ << indent() << "if (self->handler != NULL)" << '\n'; indent_up(); - f_service_ << indent() << "g_object_unref (self->handler);" << endl; + f_service_ << indent() << "g_object_unref (self->handler);" << '\n'; indent_down(); - f_service_ << indent() << "self->handler = g_value_get_object (value);" << endl << indent() - << "g_object_ref (self->handler);" << endl; + f_service_ << indent() << "self->handler = g_value_get_object (value);" << '\n' << indent() + << "g_object_ref (self->handler);" << '\n'; if (extends_service) { // Chain up to set the handler in every superclass as well - f_service_ << endl << indent() << "G_OBJECT_CLASS (" << class_name_lc << "_parent_class)->" - << endl; + f_service_ << '\n' << indent() << "G_OBJECT_CLASS (" << class_name_lc << "_parent_class)->" + << '\n'; indent_up(); - f_service_ << indent() << "set_property (object, property_id, value, pspec);" << endl; + f_service_ << indent() << "set_property (object, property_id, value, pspec);" << '\n'; indent_down(); } - f_service_ << indent() << "break;" << endl; + f_service_ << indent() << "break;" << '\n'; indent_down(); - f_service_ << indent() << "default:" << endl; + f_service_ << indent() << "default:" << '\n'; indent_up(); f_service_ << indent() << "G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);" - << endl << indent() << "break;" << endl; + << '\n' << indent() << "break;" << '\n'; indent_down(); scope_down(f_service_); scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Generate processor's property getter function_name = class_name_lc + "_get_property"; args_indent = string(function_name.length() + 2, ' '); - f_service_ << "static void" << endl << function_name << " (GObject *object," << endl - << args_indent << "guint property_id," << endl << args_indent << "GValue *value," - << endl << args_indent << "GParamSpec *pspec)" << endl; + f_service_ << "static void" << '\n' << function_name << " (GObject *object," << '\n' + << args_indent << "guint property_id," << '\n' << args_indent << "GValue *value," + << '\n' << args_indent << "GParamSpec *pspec)" << '\n'; scope_up(f_service_); - f_service_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << endl - << endl << indent() << "switch (property_id)" << endl; + f_service_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << '\n' + << '\n' << indent() << "switch (property_id)" << '\n'; scope_up(f_service_); - f_service_ << indent() << "case PROP_" << class_name_uc << "_HANDLER:" << endl; + f_service_ << indent() << "case PROP_" << class_name_uc << "_HANDLER:" << '\n'; indent_up(); - f_service_ << indent() << "g_value_set_object (value, self->handler);" << endl << indent() - << "break;" << endl; + f_service_ << indent() << "g_value_set_object (value, self->handler);" << '\n' << indent() + << "break;" << '\n'; indent_down(); - f_service_ << indent() << "default:" << endl; + f_service_ << indent() << "default:" << '\n'; indent_up(); f_service_ << indent() << "G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);" - << endl << indent() << "break;" << endl; + << '\n' << indent() << "break;" << '\n'; indent_down(); scope_down(f_service_); scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Generator the processor's dispose function - f_service_ << "static void" << endl << class_name_lc << "_dispose (GObject *gobject)" << endl; + f_service_ << "static void" << '\n' << class_name_lc << "_dispose (GObject *gobject)" << '\n'; scope_up(f_service_); - f_service_ << indent() << class_name << " *self = " << class_name_uc << " (gobject);" << endl - << endl << indent() << "if (self->handler != NULL)" << endl; + f_service_ << indent() << class_name << " *self = " << class_name_uc << " (gobject);" << '\n' + << '\n' << indent() << "if (self->handler != NULL)" << '\n'; scope_up(f_service_); - f_service_ << indent() << "g_object_unref (self->handler);" << endl << indent() - << "self->handler = NULL;" << endl; + f_service_ << indent() << "g_object_unref (self->handler);" << '\n' << indent() + << "self->handler = NULL;" << '\n'; scope_down(f_service_); - f_service_ << endl << indent() << "G_OBJECT_CLASS (" << class_name_lc << "_parent_class)" + f_service_ << '\n' << indent() << "G_OBJECT_CLASS (" << class_name_lc << "_parent_class)" "->dispose (gobject);" - << endl; + << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Generate processor finalize function - f_service_ << "static void" << endl << class_name_lc << "_finalize (GObject *gobject)" << endl; + f_service_ << "static void" << '\n' << class_name_lc << "_finalize (GObject *gobject)" << '\n'; scope_up(f_service_); f_service_ << indent() << this->nspace << service_name_ << "Processor *self = " << this->nspace_uc - << service_name_uc << "_PROCESSOR (gobject);" << endl << endl << indent() - << "thrift_safe_hash_table_destroy (self->process_map);" << endl << endl << indent() + << service_name_uc << "_PROCESSOR (gobject);" << '\n' << '\n' << indent() + << "thrift_safe_hash_table_destroy (self->process_map);" << '\n' << '\n' << indent() << "G_OBJECT_CLASS (" << class_name_lc << "_parent_class)" - "->finalize (gobject);" << endl; + "->finalize (gobject);" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Generate processor instance initializer - f_service_ << "static void" << endl << class_name_lc << "_init (" << class_name << " *self)" - << endl; + f_service_ << "static void" << '\n' << class_name_lc << "_init (" << class_name << " *self)" + << '\n'; scope_up(f_service_); if (functions.size() > 0) { - f_service_ << indent() << "guint index;" << endl - << endl; + f_service_ << indent() << "guint index;" << '\n' + << '\n'; } - f_service_ << indent() << "self->handler = NULL;" << endl << indent() + f_service_ << indent() << "self->handler = NULL;" << '\n' << indent() << "self->process_map = " - "g_hash_table_new (g_str_hash, g_str_equal);" << endl; + "g_hash_table_new (g_str_hash, g_str_equal);" << '\n'; if (functions.size() > 0) { args_indent = string(21, ' '); - f_service_ << endl + f_service_ << '\n' << indent() << "for (index = 0; index < " - << functions.size() << "; index += 1)" << endl; + << functions.size() << "; index += 1)" << '\n'; indent_up(); - f_service_ << indent() << "g_hash_table_insert (self->process_map," << endl + f_service_ << indent() << "g_hash_table_insert (self->process_map," << '\n' << indent() << args_indent - << class_name_lc << "_process_function_defs[index].name," << endl + << class_name_lc << "_process_function_defs[index].name," << '\n' << indent() << args_indent << "&" << class_name_lc << "_process_function_defs[index]" << ");" - << endl; + << '\n'; indent_down(); } scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Generate processor class initializer - f_service_ << "static void" << endl << class_name_lc << "_class_init (" << class_name - << "Class *cls)" << endl; + f_service_ << "static void" << '\n' << class_name_lc << "_class_init (" << class_name + << "Class *cls)" << '\n'; scope_up(f_service_); - f_service_ << indent() << "GObjectClass *gobject_class = G_OBJECT_CLASS (cls);" << endl - << indent() << "ThriftDispatchProcessorClass *dispatch_processor_class =" << endl; + f_service_ << indent() << "GObjectClass *gobject_class = G_OBJECT_CLASS (cls);" << '\n' + << indent() << "ThriftDispatchProcessorClass *dispatch_processor_class =" << '\n'; indent_up(); - f_service_ << indent() << "THRIFT_DISPATCH_PROCESSOR_CLASS (cls);" << endl; + f_service_ << indent() << "THRIFT_DISPATCH_PROCESSOR_CLASS (cls);" << '\n'; indent_down(); - f_service_ << indent() << "GParamSpec *param_spec;" << endl << endl << indent() - << "gobject_class->dispose = " << class_name_lc << "_dispose;" << endl << indent() - << "gobject_class->finalize = " << class_name_lc << "_finalize;" << endl << indent() - << "gobject_class->set_property = " << class_name_lc << "_set_property;" << endl + f_service_ << indent() << "GParamSpec *param_spec;" << '\n' << '\n' << indent() + << "gobject_class->dispose = " << class_name_lc << "_dispose;" << '\n' << indent() + << "gobject_class->finalize = " << class_name_lc << "_finalize;" << '\n' << indent() + << "gobject_class->set_property = " << class_name_lc << "_set_property;" << '\n' << indent() << "gobject_class->get_property = " << class_name_lc << "_get_property;" - << endl << endl << indent() + << '\n' << '\n' << indent() << "dispatch_processor_class->dispatch_call = " << class_name_lc << "_dispatch_call;" - << endl << indent() << "cls->dispatch_call = " << class_name_lc << "_dispatch_call;" - << endl << endl << indent() << "param_spec = g_param_spec_object (\"handler\"," - << endl; + << '\n' << indent() << "cls->dispatch_call = " << class_name_lc << "_dispatch_call;" + << '\n' << '\n' << indent() << "param_spec = g_param_spec_object (\"handler\"," + << '\n'; args_indent = indent() + string(34, ' '); - f_service_ << args_indent << "\"Service handler implementation\"," << endl << args_indent - << "\"The service handler implementation \"" << endl << args_indent - << "\"to which method calls are dispatched.\"," << endl << args_indent - << this->nspace_uc + "TYPE_" + service_name_uc + "_HANDLER," << endl << args_indent - << "G_PARAM_READWRITE);" << endl; - f_service_ << indent() << "g_object_class_install_property (gobject_class," << endl; + f_service_ << args_indent << "\"Service handler implementation\"," << '\n' << args_indent + << "\"The service handler implementation \"" << '\n' << args_indent + << "\"to which method calls are dispatched.\"," << '\n' << args_indent + << this->nspace_uc + "TYPE_" + service_name_uc + "_HANDLER," << '\n' << args_indent + << "G_PARAM_READWRITE);" << '\n'; + f_service_ << indent() << "g_object_class_install_property (gobject_class," << '\n'; args_indent = indent() + string(33, ' '); - f_service_ << args_indent << "PROP_" << class_name_uc << "_HANDLER," << endl << args_indent - << "param_spec);" << endl; + f_service_ << args_indent << "PROP_" << class_name_uc << "_HANDLER," << '\n' << args_indent + << "param_spec);" << '\n'; scope_down(f_service_); } @@ -2807,60 +2805,60 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { string args_indent; // write the instance definition - f_types_ << "struct _" << this->nspace << name << endl << "{ " << endl - << " ThriftStruct parent; " << endl << endl << " /* public */" << endl; + f_types_ << "struct _" << this->nspace << name << '\n' << "{ " << '\n' + << " ThriftStruct parent; " << '\n' << '\n' << " /* public */" << '\n'; // for each field, add a member variable vector::const_iterator m_iter; const vector& members = tstruct->get_members(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_type* t = get_true_type((*m_iter)->get_type()); - f_types_ << " " << type_name(t) << " " << (*m_iter)->get_name() << ";" << endl; + f_types_ << " " << type_name(t) << " " << (*m_iter)->get_name() << ";" << '\n'; if ((*m_iter)->get_req() != t_field::T_REQUIRED) { - f_types_ << " gboolean __isset_" << (*m_iter)->get_name() << ";" << endl; + f_types_ << " gboolean __isset_" << (*m_iter)->get_name() << ";" << '\n'; } } // close the structure definition and create a typedef - f_types_ << "};" << endl << "typedef struct _" << this->nspace << name << " " << this->nspace - << name << ";" << endl << endl; + f_types_ << "};" << '\n' << "typedef struct _" << this->nspace << name << " " << this->nspace + << name << ";" << '\n' << '\n'; // write the class definition - f_types_ << "struct _" << this->nspace << name << "Class" << endl << "{" << endl - << " ThriftStructClass parent;" << endl << "};" << endl << "typedef struct _" - << this->nspace << name << "Class " << this->nspace << name << "Class;" << endl << endl; + f_types_ << "struct _" << this->nspace << name << "Class" << '\n' << "{" << '\n' + << " ThriftStructClass parent;" << '\n' << "};" << '\n' << "typedef struct _" + << this->nspace << name << "Class " << this->nspace << name << "Class;" << '\n' << '\n'; // write the standard GObject boilerplate - f_types_ << "GType " << this->nspace_lc << name_u << "_get_type (void);" << endl << "#define " + f_types_ << "GType " << this->nspace_lc << name_u << "_get_type (void);" << '\n' << "#define " << this->nspace_uc << "TYPE_" << name_uc << " (" << this->nspace_lc << name_u - << "_get_type())" << endl << "#define " << this->nspace_uc << name_uc + << "_get_type())" << '\n' << "#define " << this->nspace_uc << name_uc << "(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), " << this->nspace_uc << "TYPE_" << name_uc - << ", " << this->nspace << name << "))" << endl << "#define " << this->nspace_uc + << ", " << this->nspace << name << "))" << '\n' << "#define " << this->nspace_uc << name_uc << "_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), " << this->nspace_uc << "_TYPE_" - << name_uc << ", " << this->nspace << name << "Class))" << endl << "#define " + << name_uc << ", " << this->nspace << name << "Class))" << '\n' << "#define " << this->nspace_uc << "IS_" << name_uc << "(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), " - << this->nspace_uc << "TYPE_" << name_uc << "))" << endl << "#define " << this->nspace_uc + << this->nspace_uc << "TYPE_" << name_uc << "))" << '\n' << "#define " << this->nspace_uc << "IS_" << name_uc << "_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), " << this->nspace_uc - << "TYPE_" << name_uc << "))" << endl << "#define " << this->nspace_uc << name_uc + << "TYPE_" << name_uc << "))" << '\n' << "#define " << this->nspace_uc << name_uc << "_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), " << this->nspace_uc << "TYPE_" - << name_uc << ", " << this->nspace << name << "Class))" << endl << endl; + << name_uc << ", " << this->nspace << name << "Class))" << '\n' << '\n'; // start writing the object implementation .c file // generate properties enum if (members.size() > 0) { - f_types_impl_ << "enum _" << class_name << "Properties" << endl << "{" << endl; + f_types_impl_ << "enum _" << class_name << "Properties" << '\n' << "{" << '\n'; indent_up(); f_types_impl_ << indent() << "PROP_" << class_name_uc << "_0"; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { string member_name_uc = to_upper_case(to_lower_case(initial_caps_to_underscores((*m_iter)->get_name()))); - f_types_impl_ << "," << endl << indent() << "PROP_" << class_name_uc << "_" << member_name_uc; + f_types_impl_ << "," << '\n' << indent() << "PROP_" << class_name_uc << "_" << member_name_uc; } - f_types_impl_ << endl; + f_types_impl_ << '\n'; indent_down(); - f_types_impl_ << "};" << endl << endl; + f_types_impl_ << "};" << '\n' << '\n'; } // generate struct I/O methods @@ -2874,12 +2872,12 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { // generate property setter function_name = class_name_lc + "_set_property"; args_indent = string(function_name.length() + 2, ' '); - f_types_impl_ << "static void" << endl << function_name << " (GObject *object," << endl - << args_indent << "guint property_id," << endl << args_indent - << "const GValue *value," << endl << args_indent << "GParamSpec *pspec)" << endl; + f_types_impl_ << "static void" << '\n' << function_name << " (GObject *object," << '\n' + << args_indent << "guint property_id," << '\n' << args_indent + << "const GValue *value," << '\n' << args_indent << "GParamSpec *pspec)" << '\n'; scope_up(f_types_impl_); - f_types_impl_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << endl - << endl << indent() << "switch (property_id)" << endl; + f_types_impl_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << '\n' + << '\n' << indent() << "switch (property_id)" << '\n'; scope_up(f_types_impl_); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* member = (*m_iter); @@ -2890,7 +2888,7 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { string property_identifier = "PROP_" + class_name_uc + "_" + member_name_uc; - f_types_impl_ << indent() << "case " << property_identifier + ":" << endl; + f_types_impl_ << indent() << "case " << property_identifier + ":" << '\n'; indent_up(); if (member_type->is_base_type()) { @@ -2900,7 +2898,7 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { if (base_type->get_base() == t_base_type::TYPE_STRING) { string release_function_name; - f_types_impl_ << indent() << "if (self->" << member_name << " != NULL)" << endl; + f_types_impl_ << indent() << "if (self->" << member_name << " != NULL)" << '\n'; indent_up(); if (base_type->is_binary()) { @@ -2912,7 +2910,7 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { } f_types_impl_ << indent() << release_function_name << " (self->" << member_name << ");" - << endl; + << '\n'; indent_down(); } else { switch (base_type->get_base()) { @@ -2944,10 +2942,10 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { } f_types_impl_ << indent() << "self->" << member_name << " = " << assign_function_name - << " (value);" << endl; + << " (value);" << '\n'; } else if (member_type->is_enum()) { f_types_impl_ << indent() << "self->" << member_name << " = g_value_get_int (value);" - << endl; + << '\n'; } else if (member_type->is_container()) { string release_function_name; string assign_function_name; @@ -2969,47 +2967,47 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { assign_function_name = "g_value_dup_boxed"; } - f_types_impl_ << indent() << "if (self->" << member_name << " != NULL)" << endl; + f_types_impl_ << indent() << "if (self->" << member_name << " != NULL)" << '\n'; indent_up(); f_types_impl_ << indent() << release_function_name << " (self->" << member_name << ");" - << endl; + << '\n'; indent_down(); f_types_impl_ << indent() << "self->" << member_name << " = " << assign_function_name - << " (value);" << endl; + << " (value);" << '\n'; } else if (member_type->is_struct() || member_type->is_xception()) { - f_types_impl_ << indent() << "if (self->" << member_name << " != NULL)" << endl; + f_types_impl_ << indent() << "if (self->" << member_name << " != NULL)" << '\n'; indent_up(); - f_types_impl_ << indent() << "g_object_unref (self->" << member_name << ");" << endl; + f_types_impl_ << indent() << "g_object_unref (self->" << member_name << ");" << '\n'; indent_down(); f_types_impl_ << indent() << "self->" << member_name << " = g_value_dup_object (value);" - << endl; + << '\n'; } if (member->get_req() != t_field::T_REQUIRED) { - f_types_impl_ << indent() << "self->__isset_" << member_name << " = TRUE;" << endl; + f_types_impl_ << indent() << "self->__isset_" << member_name << " = TRUE;" << '\n'; } - f_types_impl_ << indent() << "break;" << endl << endl; + f_types_impl_ << indent() << "break;" << '\n' << '\n'; indent_down(); } - f_types_impl_ << indent() << "default:" << endl; + f_types_impl_ << indent() << "default:" << '\n'; indent_up(); f_types_impl_ << indent() << "G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);" - << endl << indent() << "break;" << endl; + << '\n' << indent() << "break;" << '\n'; indent_down(); scope_down(f_types_impl_); scope_down(f_types_impl_); - f_types_impl_ << endl; + f_types_impl_ << '\n'; // generate property getter function_name = class_name_lc + "_get_property"; args_indent = string(function_name.length() + 2, ' '); - f_types_impl_ << "static void" << endl << function_name << " (GObject *object," << endl - << args_indent << "guint property_id," << endl << args_indent << "GValue *value," - << endl << args_indent << "GParamSpec *pspec)" << endl; + f_types_impl_ << "static void" << '\n' << function_name << " (GObject *object," << '\n' + << args_indent << "guint property_id," << '\n' << args_indent << "GValue *value," + << '\n' << args_indent << "GParamSpec *pspec)" << '\n'; scope_up(f_types_impl_); - f_types_impl_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << endl - << endl << indent() << "switch (property_id)" << endl; + f_types_impl_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << '\n' + << '\n' << indent() << "switch (property_id)" << '\n'; scope_up(f_types_impl_); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* member = (*m_iter); @@ -3070,26 +3068,26 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { "unrecognized type for struct member \"" + member_name + "\""; } - f_types_impl_ << indent() << "case " << property_identifier + ":" << endl; + f_types_impl_ << indent() << "case " << property_identifier + ":" << '\n'; indent_up(); f_types_impl_ << indent() << setter_function_name << " (value, self->" << member_name << ");" - << endl << indent() << "break;" << endl << endl; + << '\n' << indent() << "break;" << '\n' << '\n'; indent_down(); } - f_types_impl_ << indent() << "default:" << endl; + f_types_impl_ << indent() << "default:" << '\n'; indent_up(); f_types_impl_ << indent() << "G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);" - << endl << indent() << "break;" << endl; + << '\n' << indent() << "break;" << '\n'; indent_down(); scope_down(f_types_impl_); scope_down(f_types_impl_); - f_types_impl_ << endl; + f_types_impl_ << '\n'; } // generate the instance init function - f_types_impl_ << "static void " << endl << this->nspace_lc << name_u << "_instance_init (" - << this->nspace << name << " * object)" << endl << "{" << endl; + f_types_impl_ << "static void " << '\n' << this->nspace_lc << name_u << "_instance_init (" + << this->nspace << name << " * object)" << '\n' << "{" << '\n'; indent_up(); // generate default-value structures for container-type members @@ -3109,9 +3107,9 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { // Generate an array with the list literal indent(f_types_impl_) << "static " << type_name(elem_type, false, true) << " __default_" - << member_name << "[" << list.size() << "] = " << endl; + << member_name << "[" << list.size() << "] = " << '\n'; indent_up(); - f_types_impl_ << indent() << constant_literal(member_type, member_value) << ";" << endl; + f_types_impl_ << indent() << constant_literal(member_type, member_value) << ";" << '\n'; indent_down(); constant_declaration_output = true; @@ -3129,15 +3127,15 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { } if (constant_declaration_output) { if (string_list_constant_output) { - indent(f_types_impl_) << "unsigned int list_index;" << endl; + indent(f_types_impl_) << "unsigned int list_index;" << '\n'; } - f_types_impl_ << endl; + f_types_impl_ << '\n'; } // satisfy compilers with -Wall turned on - indent(f_types_impl_) << "/* satisfy -Wall */" << endl << indent() - << "THRIFT_UNUSED_VAR (object);" << endl; + indent(f_types_impl_) << "/* satisfy -Wall */" << '\n' << indent() + << "THRIFT_UNUSED_VAR (object);" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_type* member_type = (*m_iter)->get_type(); @@ -3153,7 +3151,7 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { } else { dval += t->is_string() ? "NULL" : "0"; } - indent(f_types_impl_) << "object->" << (*m_iter)->get_name() << dval << ";" << endl; + indent(f_types_impl_) << "object->" << (*m_iter)->get_name() << dval << ";" << '\n'; } else if (t->is_struct()) { string name = (*m_iter)->get_name(); t_program* type_program = member_type->get_program(); @@ -3163,10 +3161,10 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { string type_name_uc = to_upper_case(initial_caps_to_underscores(member_type->get_name())); indent(f_types_impl_) << "object->" << name << " = g_object_new (" << to_upper_case(type_nspace_prefix) << "TYPE_" << type_name_uc - << ", NULL);" << endl; + << ", NULL);" << '\n'; } else if (t->is_xception()) { string name = (*m_iter)->get_name(); - indent(f_types_impl_) << "object->" << name << " = NULL;" << endl; + indent(f_types_impl_) << "object->" << name << " = NULL;" << '\n'; } else if (t->is_container()) { string name = (*m_iter)->get_name(); string init_function; @@ -3184,7 +3182,7 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { init_function = generate_new_array_from_type(etype); } - indent(f_types_impl_) << "object->" << name << " = " << init_function << endl; + indent(f_types_impl_) << "object->" << name << " = " << init_function << '\n'; // Pre-populate the container with the specified default values, if any if ((*m_iter)->get_value()) { @@ -3196,17 +3194,17 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { if (is_numeric(etype)) { indent(f_types_impl_) << "g_array_append_vals (object->" << name << ", &__default_" << - name << ", " << list.size() << ");" << endl; + name << ", " << list.size() << ");" << '\n'; } else { indent(f_types_impl_) << "for (list_index = 0; list_index < " << list.size() << "; " << - "list_index += 1)" << endl; + "list_index += 1)" << '\n'; indent_up(); indent(f_types_impl_) << - "g_ptr_array_add (object->" << name << "," << endl << + "g_ptr_array_add (object->" << name << "," << '\n' << indent() << string(17, ' ') << "g_strdup (__default_" << - name << "[list_index]));" << endl; + name << "[list_index]));" << '\n'; indent_down(); } } @@ -3217,36 +3215,36 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { /* if not required, initialize the __isset variable */ if ((*m_iter)->get_req() != t_field::T_REQUIRED) { - indent(f_types_impl_) << "object->__isset_" << (*m_iter)->get_name() << " = FALSE;" << endl; + indent(f_types_impl_) << "object->__isset_" << (*m_iter)->get_name() << " = FALSE;" << '\n'; } } indent_down(); - f_types_impl_ << "}" << endl << endl; + f_types_impl_ << "}" << '\n' << '\n'; /* create the destructor */ - f_types_impl_ << "static void " << endl << this->nspace_lc << name_u - << "_finalize (GObject *object)" << endl << "{" << endl; + f_types_impl_ << "static void " << '\n' << this->nspace_lc << name_u + << "_finalize (GObject *object)" << '\n' << "{" << '\n'; indent_up(); f_types_impl_ << indent() << this->nspace << name << " *tobject = " << this->nspace_uc << name_uc - << " (object);" << endl << endl; + << " (object);" << '\n' << '\n'; - f_types_impl_ << indent() << "/* satisfy -Wall in case we don't use tobject */" << endl - << indent() << "THRIFT_UNUSED_VAR (tobject);" << endl; + f_types_impl_ << indent() << "/* satisfy -Wall in case we don't use tobject */" << '\n' + << indent() << "THRIFT_UNUSED_VAR (tobject);" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_type* t = get_true_type((*m_iter)->get_type()); if (t->is_container()) { string name = (*m_iter)->get_name(); if (t->is_map() || t->is_set()) { - f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << endl; - f_types_impl_ << indent() << "{" << endl; + f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << '\n'; + f_types_impl_ << indent() << "{" << '\n'; indent_up(); - f_types_impl_ << indent() << "g_hash_table_destroy (tobject->" << name << ");" << endl; - f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << endl; + f_types_impl_ << indent() << "g_hash_table_destroy (tobject->" << name << ");" << '\n'; + f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << '\n'; indent_down(); - f_types_impl_ << indent() << "}" << endl; + f_types_impl_ << indent() << "}" << '\n'; } else if (t->is_list()) { t_type* etype = ((t_list*)t)->get_elem_type(); string destructor_function = "g_ptr_array_unref"; @@ -3273,59 +3271,59 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { destructor_function = "g_array_unref"; } - f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << endl; - f_types_impl_ << indent() << "{" << endl; + f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << '\n'; + f_types_impl_ << indent() << "{" << '\n'; indent_up(); - f_types_impl_ << indent() << destructor_function << " (tobject->" << name << ");" << endl; - f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << endl; + f_types_impl_ << indent() << destructor_function << " (tobject->" << name << ");" << '\n'; + f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << '\n'; indent_down(); - f_types_impl_ << indent() << "}" << endl; + f_types_impl_ << indent() << "}" << '\n'; } } else if (t->is_struct() || t->is_xception()) { string name = (*m_iter)->get_name(); // TODO: g_clear_object needs glib >= 2.28 - // f_types_impl_ << indent() << "g_clear_object (&(tobject->" << name << "));" << endl; + // f_types_impl_ << indent() << "g_clear_object (&(tobject->" << name << "));" << '\n'; // does g_object_unref the trick? - f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << endl; - f_types_impl_ << indent() << "{" << endl; + f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << '\n'; + f_types_impl_ << indent() << "{" << '\n'; indent_up(); - f_types_impl_ << indent() << "g_object_unref(tobject->" << name << ");" << endl; - f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << endl; + f_types_impl_ << indent() << "g_object_unref(tobject->" << name << ");" << '\n'; + f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << '\n'; indent_down(); - f_types_impl_ << indent() << "}" << endl; + f_types_impl_ << indent() << "}" << '\n'; } else if (t->is_string()) { string name = (*m_iter)->get_name(); - f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << endl; - f_types_impl_ << indent() << "{" << endl; + f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << '\n'; + f_types_impl_ << indent() << "{" << '\n'; indent_up(); f_types_impl_ << indent() << generate_free_func_from_type(t) << "(tobject->" << name << ");" - << endl; - f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << endl; + << '\n'; + f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << '\n'; indent_down(); - f_types_impl_ << indent() << "}" << endl; + f_types_impl_ << indent() << "}" << '\n'; } } indent_down(); - f_types_impl_ << "}" << endl << endl; + f_types_impl_ << "}" << '\n' << '\n'; // generate the class init function - f_types_impl_ << "static void" << endl << class_name_lc << "_class_init (" << class_name - << "Class * cls)" << endl; + f_types_impl_ << "static void" << '\n' << class_name_lc << "_class_init (" << class_name + << "Class * cls)" << '\n'; scope_up(f_types_impl_); - f_types_impl_ << indent() << "GObjectClass *gobject_class = G_OBJECT_CLASS (cls);" << endl + f_types_impl_ << indent() << "GObjectClass *gobject_class = G_OBJECT_CLASS (cls);" << '\n' << indent() << "ThriftStructClass *struct_class = " - << "THRIFT_STRUCT_CLASS (cls);" << endl << endl << indent() - << "struct_class->read = " << class_name_lc << "_read;" << endl << indent() - << "struct_class->write = " << class_name_lc << "_write;" << endl << endl + << "THRIFT_STRUCT_CLASS (cls);" << '\n' << '\n' << indent() + << "struct_class->read = " << class_name_lc << "_read;" << '\n' << indent() + << "struct_class->write = " << class_name_lc << "_write;" << '\n' << '\n' << indent() << "gobject_class->finalize = " << class_name_lc << "_finalize;" - << endl; + << '\n'; if (members.size() > 0) { f_types_impl_ << indent() << "gobject_class->get_property = " << class_name_lc - << "_get_property;" << endl << indent() - << "gobject_class->set_property = " << class_name_lc << "_set_property;" << endl; + << "_get_property;" << '\n' << indent() + << "gobject_class->set_property = " << class_name_lc << "_set_property;" << '\n'; // install a property for each member for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -3338,11 +3336,11 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { string property_identifier = "PROP_" + class_name_uc + "_" + member_name_uc; - f_types_impl_ << endl << indent() << "g_object_class_install_property" << endl; + f_types_impl_ << '\n' << indent() << "g_object_class_install_property" << '\n'; indent_up(); args_indent = indent() + ' '; - f_types_impl_ << indent() << "(gobject_class," << endl << args_indent << property_identifier - << "," << endl << args_indent; + f_types_impl_ << indent() << "(gobject_class," << '\n' << args_indent << property_identifier + << "," << '\n' << args_indent; if (member_type->is_base_type()) { t_base_type::t_base base_type = ((t_base_type*)member_type)->get_base(); @@ -3350,27 +3348,27 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { if (base_type == t_base_type::TYPE_STRING) { if (((t_base_type*)member_type)->is_binary()) { args_indent += string(20, ' '); - f_types_impl_ << "g_param_spec_boxed (\"" << member_name << "\"," << endl << args_indent - << "NULL," << endl << args_indent << "NULL," << endl << args_indent - << "G_TYPE_BYTE_ARRAY," << endl << args_indent << "G_PARAM_READWRITE));" - << endl; + f_types_impl_ << "g_param_spec_boxed (\"" << member_name << "\"," << '\n' << args_indent + << "NULL," << '\n' << args_indent << "NULL," << '\n' << args_indent + << "G_TYPE_BYTE_ARRAY," << '\n' << args_indent << "G_PARAM_READWRITE));" + << '\n'; } else { args_indent += string(21, ' '); - f_types_impl_ << "g_param_spec_string (\"" << member_name << "\"," << endl - << args_indent << "NULL," << endl << args_indent << "NULL," << endl + f_types_impl_ << "g_param_spec_string (\"" << member_name << "\"," << '\n' + << args_indent << "NULL," << '\n' << args_indent << "NULL," << '\n' << args_indent << ((member_value != NULL) ? "\"" + member_value->get_string() + "\"" - : "NULL") << "," << endl << args_indent - << "G_PARAM_READWRITE));" << endl; + : "NULL") << "," << '\n' << args_indent + << "G_PARAM_READWRITE));" << '\n'; } } else if (base_type == t_base_type::TYPE_BOOL) { args_indent += string(22, ' '); - f_types_impl_ << "g_param_spec_boolean (\"" << member_name << "\"," << endl << args_indent - << "NULL," << endl << args_indent << "NULL," << endl << args_indent + f_types_impl_ << "g_param_spec_boolean (\"" << member_name << "\"," << '\n' << args_indent + << "NULL," << '\n' << args_indent << "NULL," << '\n' << args_indent << (((member_value != NULL) && (member_value->get_integer() != 0)) ? "TRUE" - : "FALSE") << "," << endl << args_indent << "G_PARAM_READWRITE));" - << endl; + : "FALSE") << "," << '\n' << args_indent << "G_PARAM_READWRITE));" + << '\n'; } else if ((base_type == t_base_type::TYPE_I8) || (base_type == t_base_type::TYPE_I16) || (base_type == t_base_type::TYPE_I32) || (base_type == t_base_type::TYPE_I64) || (base_type == t_base_type::TYPE_DOUBLE)) { @@ -3423,11 +3421,11 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { } args_indent += string(param_spec_function_name.length() + 2, ' '); - f_types_impl_ << param_spec_function_name << " (\"" << member_name << "\"," << endl - << args_indent << "NULL," << endl << args_indent << "NULL," << endl - << args_indent << min_value << "," << endl << args_indent << max_value - << "," << endl << args_indent << default_value.str() << "," << endl - << args_indent << "G_PARAM_READWRITE));" << endl; + f_types_impl_ << param_spec_function_name << " (\"" << member_name << "\"," << '\n' + << args_indent << "NULL," << '\n' << args_indent << "NULL," << '\n' + << args_indent << min_value << "," << '\n' << args_indent << max_value + << "," << '\n' << args_indent << default_value.str() << "," << '\n' + << args_indent << "G_PARAM_READWRITE));" << '\n'; } indent_down(); @@ -3438,11 +3436,11 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { int max_value = (enum_max_value != nullptr) ? enum_max_value->get_value() : 0; args_indent += string(18, ' '); - f_types_impl_ << "g_param_spec_int (\"" << member_name << "\"," << endl << args_indent - << "NULL," << endl << args_indent << "NULL," << endl << args_indent - << min_value << "," << endl << args_indent << max_value << "," << endl - << args_indent << min_value << "," << endl << args_indent - << "G_PARAM_READWRITE));" << endl; + f_types_impl_ << "g_param_spec_int (\"" << member_name << "\"," << '\n' << args_indent + << "NULL," << '\n' << args_indent << "NULL," << '\n' << args_indent + << min_value << "," << '\n' << args_indent << max_value << "," << '\n' + << args_indent << min_value << "," << '\n' << args_indent + << "G_PARAM_READWRITE));" << '\n'; indent_down(); } else if (member_type->is_struct() || member_type->is_xception()) { t_program* type_program = member_type->get_program(); @@ -3454,9 +3452,9 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { + to_upper_case(initial_caps_to_underscores(member_type->get_name())); args_indent += string(20, ' '); - f_types_impl_ << "g_param_spec_object (\"" << member_name << "\"," << endl << args_indent - << "NULL," << endl << args_indent << "NULL," << endl << args_indent - << param_type << "," << endl << args_indent << "G_PARAM_READWRITE));" << endl; + f_types_impl_ << "g_param_spec_object (\"" << member_name << "\"," << '\n' << args_indent + << "NULL," << '\n' << args_indent << "NULL," << '\n' << args_indent + << param_type << "," << '\n' << args_indent << "G_PARAM_READWRITE));" << '\n'; indent_down(); } else if (member_type->is_list()) { t_type* elem_type = ((t_list*)member_type)->get_elem_type(); @@ -3469,38 +3467,38 @@ void t_c_glib_generator::generate_object(t_struct* tstruct) { } args_indent += string(20, ' '); - f_types_impl_ << "g_param_spec_boxed (\"" << member_name << "\"," << endl << args_indent - << "NULL," << endl << args_indent << "NULL," << endl << args_indent - << param_type << "," << endl << args_indent << "G_PARAM_READWRITE));" << endl; + f_types_impl_ << "g_param_spec_boxed (\"" << member_name << "\"," << '\n' << args_indent + << "NULL," << '\n' << args_indent << "NULL," << '\n' << args_indent + << param_type << "," << '\n' << args_indent << "G_PARAM_READWRITE));" << '\n'; indent_down(); } else if (member_type->is_set() || member_type->is_map()) { args_indent += string(20, ' '); - f_types_impl_ << "g_param_spec_boxed (\"" << member_name << "\"," << endl << args_indent - << "NULL," << endl << args_indent << "NULL," << endl << args_indent - << "G_TYPE_HASH_TABLE," << endl << args_indent << "G_PARAM_READWRITE));" - << endl; + f_types_impl_ << "g_param_spec_boxed (\"" << member_name << "\"," << '\n' << args_indent + << "NULL," << '\n' << args_indent << "NULL," << '\n' << args_indent + << "G_TYPE_HASH_TABLE," << '\n' << args_indent << "G_PARAM_READWRITE));" + << '\n'; indent_down(); } } } scope_down(f_types_impl_); - f_types_impl_ << endl; - - f_types_impl_ << "GType" << endl << this->nspace_lc << name_u << "_get_type (void)" << endl << "{" - << endl << " static GType type = 0;" << endl << endl << " if (type == 0) " << endl - << " {" << endl << " static const GTypeInfo type_info = " << endl << " {" - << endl << " sizeof (" << this->nspace << name << "Class)," << endl - << " NULL, /* base_init */" << endl << " NULL, /* base_finalize */" - << endl << " (GClassInitFunc) " << this->nspace_lc << name_u << "_class_init," - << endl << " NULL, /* class_finalize */" << endl - << " NULL, /* class_data */" << endl << " sizeof (" << this->nspace - << name << ")," << endl << " 0, /* n_preallocs */" << endl + f_types_impl_ << '\n'; + + f_types_impl_ << "GType" << '\n' << this->nspace_lc << name_u << "_get_type (void)" << '\n' << "{" + << '\n' << " static GType type = 0;" << '\n' << '\n' << " if (type == 0) " << '\n' + << " {" << '\n' << " static const GTypeInfo type_info = " << '\n' << " {" + << '\n' << " sizeof (" << this->nspace << name << "Class)," << '\n' + << " NULL, /* base_init */" << '\n' << " NULL, /* base_finalize */" + << '\n' << " (GClassInitFunc) " << this->nspace_lc << name_u << "_class_init," + << '\n' << " NULL, /* class_finalize */" << '\n' + << " NULL, /* class_data */" << '\n' << " sizeof (" << this->nspace + << name << ")," << '\n' << " 0, /* n_preallocs */" << '\n' << " (GInstanceInitFunc) " << this->nspace_lc << name_u << "_instance_init," - << endl << " NULL, /* value_table */" << endl << " };" << endl << endl - << " type = g_type_register_static (THRIFT_TYPE_STRUCT, " << endl + << '\n' << " NULL, /* value_table */" << '\n' << " };" << '\n' << '\n' + << " type = g_type_register_static (THRIFT_TYPE_STRUCT, " << '\n' << " \"" << this->nspace << name << "Type\"," - << endl << " &type_info, 0);" << endl << " }" - << endl << endl << " return type;" << endl << "}" << endl << endl; + << '\n' << " &type_info, 0);" << '\n' << " }" + << '\n' << '\n' << " return type;" << '\n' << "}" << '\n' << '\n'; } /** @@ -3521,59 +3519,59 @@ void t_c_glib_generator::generate_struct_writer(ostream& out, if (is_function) { error_ret = -1; - indent(out) << "static gint32" << endl << this->nspace_lc << name_u + indent(out) << "static gint32" << '\n' << this->nspace_lc << name_u << "_write (ThriftStruct *object, ThriftProtocol *protocol, GError **error)" - << endl; + << '\n'; } - indent(out) << "{" << endl; + indent(out) << "{" << '\n'; indent_up(); - out << indent() << "gint32 ret;" << endl << indent() << "gint32 xfer = 0;" << endl << endl; + out << indent() << "gint32 ret;" << '\n' << indent() << "gint32 xfer = 0;" << '\n' << '\n'; - indent(out) << this_get << endl; + indent(out) << this_get << '\n'; // satisfy -Wall in the case of an empty struct if (!this_get.empty()) { - indent(out) << "THRIFT_UNUSED_VAR (this_object);" << endl; + indent(out) << "THRIFT_UNUSED_VAR (this_object);" << '\n'; } out << indent() << "if ((ret = thrift_protocol_write_struct_begin (protocol, \"" << name - << "\", error)) < 0)" << endl << indent() << " return " << error_ret << ";" << endl - << indent() << "xfer += ret;" << endl; + << "\", error)) < 0)" << '\n' << indent() << " return " << error_ret << ";" << '\n' + << indent() << "xfer += ret;" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_OPTIONAL) { - indent(out) << "if (this_object->__isset_" << (*f_iter)->get_name() << " == TRUE) {" << endl; + indent(out) << "if (this_object->__isset_" << (*f_iter)->get_name() << " == TRUE) {" << '\n'; indent_up(); } out << indent() << "if ((ret = thrift_protocol_write_field_begin (protocol, " << "\"" << (*f_iter)->get_name() << "\", " << type_to_enum((*f_iter)->get_type()) << ", " - << (*f_iter)->get_key() << ", error)) < 0)" << endl << indent() << " return " << error_ret - << ";" << endl << indent() << "xfer += ret;" << endl; + << (*f_iter)->get_key() << ", error)) < 0)" << '\n' << indent() << " return " << error_ret + << ";" << '\n' << indent() << "xfer += ret;" << '\n'; generate_serialize_field(out, *f_iter, this_name, "", error_ret); - out << indent() << "if ((ret = thrift_protocol_write_field_end (protocol, error)) < 0)" << endl - << indent() << " return " << error_ret << ";" << endl << indent() << "xfer += ret;" - << endl; + out << indent() << "if ((ret = thrift_protocol_write_field_end (protocol, error)) < 0)" << '\n' + << indent() << " return " << error_ret << ";" << '\n' << indent() << "xfer += ret;" + << '\n'; if ((*f_iter)->get_req() == t_field::T_OPTIONAL) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } // write the struct map - out << indent() << "if ((ret = thrift_protocol_write_field_stop (protocol, error)) < 0)" << endl - << indent() << " return " << error_ret << ";" << endl << indent() << "xfer += ret;" << endl - << indent() << "if ((ret = thrift_protocol_write_struct_end (protocol, error)) < 0)" << endl - << indent() << " return " << error_ret << ";" << endl << indent() << "xfer += ret;" << endl - << endl; + out << indent() << "if ((ret = thrift_protocol_write_field_stop (protocol, error)) < 0)" << '\n' + << indent() << " return " << error_ret << ";" << '\n' << indent() << "xfer += ret;" << '\n' + << indent() << "if ((ret = thrift_protocol_write_struct_end (protocol, error)) < 0)" << '\n' + << indent() << " return " << error_ret << ";" << '\n' << indent() << "xfer += ret;" << '\n' + << '\n'; if (is_function) { - indent(out) << "return xfer;" << endl; + indent(out) << "return xfer;" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -3593,127 +3591,127 @@ void t_c_glib_generator::generate_struct_reader(ostream& out, if (is_function) { error_ret = -1; - indent(out) << "/* reads a " << name_u << " object */" << endl << "static gint32" << endl + indent(out) << "/* reads a " << name_u << " object */" << '\n' << "static gint32" << '\n' << this->nspace_lc << name_u - << "_read (ThriftStruct *object, ThriftProtocol *protocol, GError **error)" << endl; + << "_read (ThriftStruct *object, ThriftProtocol *protocol, GError **error)" << '\n'; } - indent(out) << "{" << endl; + indent(out) << "{" << '\n'; indent_up(); // declare stack temp variables - out << indent() << "gint32 ret;" << endl << indent() << "gint32 xfer = 0;" << endl << indent() - << "gchar *name = NULL;" << endl << indent() << "ThriftType ftype;" << endl << indent() - << "gint16 fid;" << endl << indent() << "guint32 len = 0;" << endl << indent() - << "gpointer data = NULL;" << endl << indent() << this_get << endl; + out << indent() << "gint32 ret;" << '\n' << indent() << "gint32 xfer = 0;" << '\n' << indent() + << "gchar *name = NULL;" << '\n' << indent() << "ThriftType ftype;" << '\n' << indent() + << "gint16 fid;" << '\n' << indent() << "guint32 len = 0;" << '\n' << indent() + << "gpointer data = NULL;" << '\n' << indent() << this_get << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) { - indent(out) << "gboolean isset_" << (*f_iter)->get_name() << " = FALSE;" << endl; + indent(out) << "gboolean isset_" << (*f_iter)->get_name() << " = FALSE;" << '\n'; } } - out << endl; + out << '\n'; // satisfy -Wall in case we don't use some variables - out << indent() << "/* satisfy -Wall in case these aren't used */" << endl << indent() - << "THRIFT_UNUSED_VAR (len);" << endl << indent() << "THRIFT_UNUSED_VAR (data);" << endl; + out << indent() << "/* satisfy -Wall in case these aren't used */" << '\n' << indent() + << "THRIFT_UNUSED_VAR (len);" << '\n' << indent() << "THRIFT_UNUSED_VAR (data);" << '\n'; if (!this_get.empty()) { - out << indent() << "THRIFT_UNUSED_VAR (this_object);" << endl; + out << indent() << "THRIFT_UNUSED_VAR (this_object);" << '\n'; } - out << endl; + out << '\n'; // read the beginning of the structure marker - out << indent() << "/* read the struct begin marker */" << endl << indent() - << "if ((ret = thrift_protocol_read_struct_begin (protocol, &name, error)) < 0)" << endl - << indent() << "{" << endl << indent() << " if (name) g_free (name);" << endl << indent() - << " return " << error_ret << ";" << endl << indent() << "}" << endl << indent() - << "xfer += ret;" << endl << indent() << "if (name) g_free (name);" << endl << indent() - << "name = NULL;" << endl << endl; + out << indent() << "/* read the struct begin marker */" << '\n' << indent() + << "if ((ret = thrift_protocol_read_struct_begin (protocol, &name, error)) < 0)" << '\n' + << indent() << "{" << '\n' << indent() << " if (name) g_free (name);" << '\n' << indent() + << " return " << error_ret << ";" << '\n' << indent() << "}" << '\n' << indent() + << "xfer += ret;" << '\n' << indent() << "if (name) g_free (name);" << '\n' << indent() + << "name = NULL;" << '\n' << '\n'; // read the struct fields - out << indent() << "/* read the struct fields */" << endl << indent() << "while (1)" << endl; + out << indent() << "/* read the struct fields */" << '\n' << indent() << "while (1)" << '\n'; scope_up(out); // read beginning field marker - out << indent() << "/* read the beginning of a field */" << endl << indent() + out << indent() << "/* read the beginning of a field */" << '\n' << indent() << "if ((ret = thrift_protocol_read_field_begin (protocol, &name, &ftype, &fid, error)) < 0)" - << endl << indent() << "{" << endl << indent() << " if (name) g_free (name);" << endl - << indent() << " return " << error_ret << ";" << endl << indent() << "}" << endl << indent() - << "xfer += ret;" << endl << indent() << "if (name) g_free (name);" << endl << indent() - << "name = NULL;" << endl << endl; + << '\n' << indent() << "{" << '\n' << indent() << " if (name) g_free (name);" << '\n' + << indent() << " return " << error_ret << ";" << '\n' << indent() << "}" << '\n' << indent() + << "xfer += ret;" << '\n' << indent() << "if (name) g_free (name);" << '\n' << indent() + << "name = NULL;" << '\n' << '\n'; // check for field STOP marker - out << indent() << "/* break if we get a STOP field */" << endl << indent() - << "if (ftype == T_STOP)" << endl << indent() << "{" << endl << indent() << " break;" << endl - << indent() << "}" << endl << endl; + out << indent() << "/* break if we get a STOP field */" << '\n' << indent() + << "if (ftype == T_STOP)" << '\n' << indent() << "{" << '\n' << indent() << " break;" << '\n' + << indent() << "}" << '\n' << '\n'; // switch depending on the field type - indent(out) << "switch (fid)" << endl; + indent(out) << "switch (fid)" << '\n'; // start switch scope_up(out); // generate deserialization code for known types for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - indent(out) << "case " << (*f_iter)->get_key() << ":" << endl; + indent(out) << "case " << (*f_iter)->get_key() << ":" << '\n'; indent_up(); - indent(out) << "if (ftype == " << type_to_enum((*f_iter)->get_type()) << ")" << endl; - indent(out) << "{" << endl; + indent(out) << "if (ftype == " << type_to_enum((*f_iter)->get_type()) << ")" << '\n'; + indent(out) << "{" << '\n'; indent_up(); // generate deserialize field generate_deserialize_field(out, *f_iter, this_name, "", error_ret, false); indent_down(); - out << indent() << "} else {" << endl << indent() - << " if ((ret = thrift_protocol_skip (protocol, ftype, error)) < 0)" << endl << indent() - << " return " << error_ret << ";" << endl << indent() << " xfer += ret;" << endl - << indent() << "}" << endl << indent() << "break;" << endl; + out << indent() << "} else {" << '\n' << indent() + << " if ((ret = thrift_protocol_skip (protocol, ftype, error)) < 0)" << '\n' << indent() + << " return " << error_ret << ";" << '\n' << indent() << " xfer += ret;" << '\n' + << indent() << "}" << '\n' << indent() << "break;" << '\n'; indent_down(); } // create the default case - out << indent() << "default:" << endl << indent() - << " if ((ret = thrift_protocol_skip (protocol, ftype, error)) < 0)" << endl << indent() - << " return " << error_ret << ";" << endl << indent() << " xfer += ret;" << endl - << indent() << " break;" << endl; + out << indent() << "default:" << '\n' << indent() + << " if ((ret = thrift_protocol_skip (protocol, ftype, error)) < 0)" << '\n' << indent() + << " return " << error_ret << ";" << '\n' << indent() << " xfer += ret;" << '\n' + << indent() << " break;" << '\n'; // end switch scope_down(out); // read field end marker - out << indent() << "if ((ret = thrift_protocol_read_field_end (protocol, error)) < 0)" << endl - << indent() << " return " << error_ret << ";" << endl << indent() << "xfer += ret;" << endl; + out << indent() << "if ((ret = thrift_protocol_read_field_end (protocol, error)) < 0)" << '\n' + << indent() << " return " << error_ret << ";" << '\n' << indent() << "xfer += ret;" << '\n'; // end while loop scope_down(out); - out << endl; + out << '\n'; // read the end of the structure - out << indent() << "if ((ret = thrift_protocol_read_struct_end (protocol, error)) < 0)" << endl - << indent() << " return " << error_ret << ";" << endl << indent() << "xfer += ret;" << endl - << endl; + out << indent() << "if ((ret = thrift_protocol_read_struct_end (protocol, error)) < 0)" << '\n' + << indent() << " return " << error_ret << ";" << '\n' << indent() << "xfer += ret;" << '\n' + << '\n'; // if a required field is missing, throw an error for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) { - out << indent() << "if (!isset_" << (*f_iter)->get_name() << ")" << endl << indent() << "{" - << endl << indent() << " g_set_error (error, THRIFT_PROTOCOL_ERROR," << endl << indent() - << " THRIFT_PROTOCOL_ERROR_INVALID_DATA," << endl << indent() - << " \"missing field\");" << endl << indent() << " return -1;" << endl - << indent() << "}" << endl << endl; + out << indent() << "if (!isset_" << (*f_iter)->get_name() << ")" << '\n' << indent() << "{" + << '\n' << indent() << " g_set_error (error, THRIFT_PROTOCOL_ERROR," << '\n' << indent() + << " THRIFT_PROTOCOL_ERROR_INVALID_DATA," << '\n' << indent() + << " \"missing field\");" << '\n' << indent() << " return -1;" << '\n' + << indent() << "}" << '\n' << '\n'; } } if (is_function) { - indent(out) << "return xfer;" << endl; + indent(out) << "return xfer;" << '\n'; } // end the function/structure indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } void t_c_glib_generator::generate_serialize_field(ostream& out, @@ -3773,9 +3771,9 @@ void t_c_glib_generator::generate_serialize_field(ostream& out, } else { out << "i32 (protocol, (gint32) " << name; } - out << ", error)) < 0)" << endl - << indent() << " return " << error_ret << ";" << endl - << indent() << "xfer += ret;" << endl << endl; + out << ", error)) < 0)" << '\n' + << indent() << " return " << error_ret << ";" << '\n' + << indent() << "xfer += ret;" << '\n' << '\n'; } else { throw std::logic_error("DO NOT KNOW HOW TO SERIALIZE FIELD '" + name + "' TYPE '" + type_name(type)); @@ -3788,8 +3786,8 @@ void t_c_glib_generator::generate_serialize_struct(ostream& out, int error_ret) { (void)tstruct; out << indent() << "if ((ret = thrift_struct_write (THRIFT_STRUCT (" << prefix - << "), protocol, error)) < 0)" << endl << indent() << " return " << error_ret << ";" << endl - << indent() << "xfer += ret;" << endl << endl; + << "), protocol, error)) < 0)" << '\n' << indent() << " return " << error_ret << ";" << '\n' + << indent() << "xfer += ret;" << '\n' << '\n'; } void t_c_glib_generator::generate_serialize_container(ostream& out, @@ -3826,39 +3824,39 @@ void t_c_glib_generator::generate_serialize_container(ostream& out, * This is because we may exit early before we get a chance to free the * GList. */ - out << indent() << "GList *key_list = NULL, *iter = NULL;" << endl - << indent() << tkey_name << tkey_ptr << "* keys;" << endl - << indent() << "int i = 0, key_count;" << endl - << endl + out << indent() << "GList *key_list = NULL, *iter = NULL;" << '\n' + << indent() << tkey_name << tkey_ptr << "* keys;" << '\n' + << indent() << "int i = 0, key_count;" << '\n' + << '\n' << indent() << "if ((ret = thrift_protocol_write_map_begin (protocol, " << type_to_enum(tkey) << ", " << type_to_enum(tval) << ", " << prefix << " ? " << "(gint32) g_hash_table_size ((GHashTable *) " << prefix << ") : 0" - << ", error)) < 0)" << endl; + << ", error)) < 0)" << '\n'; indent_up(); - out << indent() << "return " << error_ret << ";" << endl; + out << indent() << "return " << error_ret << ";" << '\n'; indent_down(); - out << indent() << "xfer += ret;" << endl - << indent() << "if (" << prefix << ")" << endl + out << indent() << "xfer += ret;" << '\n' + << indent() << "if (" << prefix << ")" << '\n' << indent() << " g_hash_table_foreach ((GHashTable *) " << prefix - << ", thrift_hash_table_get_keys, &key_list);" << endl - << indent() << "key_count = g_list_length (key_list);" << endl + << ", thrift_hash_table_get_keys, &key_list);" << '\n' + << indent() << "key_count = g_list_length (key_list);" << '\n' << indent() << "keys = g_newa (" << tkey_name << tkey_ptr - << ", key_count);" << endl + << ", key_count);" << '\n' << indent() << "for (iter = g_list_first (key_list); iter; " - "iter = iter->next)" << endl; + "iter = iter->next)" << '\n'; indent_up(); out << indent() << "keys[i++] = (" << tkey_name << tkey_ptr - << ") iter->data;" << endl; + << ") iter->data;" << '\n'; indent_down(); - out << indent() << "g_list_free (key_list);" << endl - << endl - << indent() << "for (i = 0; i < key_count; ++i)" << endl; + out << indent() << "g_list_free (key_list);" << '\n' + << '\n' + << indent() << "for (i = 0; i < key_count; ++i)" << '\n'; scope_up(out); - out << indent() << keyname << " = keys[i];" << endl + out << indent() << keyname << " = keys[i];" << '\n' << indent() << valname << " = (" << tval_name << tval_ptr << ") g_hash_table_lookup (((GHashTable *) " << prefix - << "), (gpointer) " << keyname << ");" << endl - << endl; + << "), (gpointer) " << keyname << ");" << '\n' + << '\n'; generate_serialize_map_element(out, (t_map*)ttype, tkey_ptr + " " + keyname, @@ -3866,84 +3864,84 @@ void t_c_glib_generator::generate_serialize_container(ostream& out, error_ret); scope_down(out); out << indent() << "if ((ret = thrift_protocol_write_map_end (protocol, " - "error)) < 0)" << endl; + "error)) < 0)" << '\n'; indent_up(); - out << indent() << "return " << error_ret << ";" << endl; + out << indent() << "return " << error_ret << ";" << '\n'; indent_down(); - out << indent() << "xfer += ret;" << endl; + out << indent() << "xfer += ret;" << '\n'; } else if (ttype->is_set()) { t_type* telem = ((t_set*)ttype)->get_elem_type(); string telem_name = type_name(telem); string telem_ptr = telem->is_string() || !telem->is_base_type() ? "" : "*"; - out << indent() << "GList *key_list = NULL, *iter = NULL;" << endl - << indent() << telem_name << telem_ptr << "* keys;" << endl - << indent() << "int i = 0, key_count;" << endl - << indent() << telem_name << telem_ptr << " elem;" << endl - << indent() << "gpointer value;" << endl - << indent() << "THRIFT_UNUSED_VAR (value);" << endl - << endl + out << indent() << "GList *key_list = NULL, *iter = NULL;" << '\n' + << indent() << telem_name << telem_ptr << "* keys;" << '\n' + << indent() << "int i = 0, key_count;" << '\n' + << indent() << telem_name << telem_ptr << " elem;" << '\n' + << indent() << "gpointer value;" << '\n' + << indent() << "THRIFT_UNUSED_VAR (value);" << '\n' + << '\n' << indent() << "if ((ret = thrift_protocol_write_set_begin (protocol, " << type_to_enum(telem) << ", " << prefix << " ? " << "(gint32) g_hash_table_size ((GHashTable *) " << prefix << ") : 0" - << ", error)) < 0)" << endl; + << ", error)) < 0)" << '\n'; indent_up(); - out << indent() << "return " << error_ret << ";" << endl; + out << indent() << "return " << error_ret << ";" << '\n'; indent_down(); - out << indent() << "xfer += ret;" << endl - << indent() << "if (" << prefix << ")" << endl + out << indent() << "xfer += ret;" << '\n' + << indent() << "if (" << prefix << ")" << '\n' << indent() << " g_hash_table_foreach ((GHashTable *) " << prefix - << ", thrift_hash_table_get_keys, &key_list);" << endl - << indent() << "key_count = g_list_length (key_list);" << endl + << ", thrift_hash_table_get_keys, &key_list);" << '\n' + << indent() << "key_count = g_list_length (key_list);" << '\n' << indent() << "keys = g_newa (" << telem_name << telem_ptr - << ", key_count);" << endl + << ", key_count);" << '\n' << indent() << "for (iter = g_list_first (key_list); iter; " - "iter = iter->next)" << endl; + "iter = iter->next)" << '\n'; indent_up(); out << indent() << "keys[i++] = (" << telem_name << telem_ptr - << ") iter->data;" << endl; + << ") iter->data;" << '\n'; indent_down(); - out << indent() << "g_list_free (key_list);" << endl - << endl - << indent() << "for (i = 0; i < key_count; ++i)" << endl; + out << indent() << "g_list_free (key_list);" << '\n' + << '\n' + << indent() << "for (i = 0; i < key_count; ++i)" << '\n'; scope_up(out); - out << indent() << "elem = keys[i];" << endl + out << indent() << "elem = keys[i];" << '\n' << indent() << "value = (gpointer) g_hash_table_lookup " - "(((GHashTable *) " << prefix << "), (gpointer) elem);" << endl - << endl; + "(((GHashTable *) " << prefix << "), (gpointer) elem);" << '\n' + << '\n'; generate_serialize_set_element(out, (t_set*)ttype, telem_ptr + "elem", error_ret); scope_down(out); out << indent() << "if ((ret = thrift_protocol_write_set_end (protocol, " - "error)) < 0)" << endl; + "error)) < 0)" << '\n'; indent_up(); - out << indent() << "return " << error_ret << ";" << endl; + out << indent() << "return " << error_ret << ";" << '\n'; indent_down(); - out << indent() << "xfer += ret;" << endl; + out << indent() << "xfer += ret;" << '\n'; } else if (ttype->is_list()) { string length = "(" + prefix + " ? " + prefix + "->len : 0)"; string i = tmp("i"); - out << indent() << "guint " << i << ";" << endl - << endl + out << indent() << "guint " << i << ";" << '\n' + << '\n' << indent() << "if ((ret = thrift_protocol_write_list_begin (protocol, " << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", (gint32) " - << length << ", error)) < 0)" << endl; + << length << ", error)) < 0)" << '\n'; indent_up(); - out << indent() << "return " << error_ret << ";" << endl; + out << indent() << "return " << error_ret << ";" << '\n'; indent_down(); - out << indent() << "xfer += ret;" << endl + out << indent() << "xfer += ret;" << '\n' << indent() << "for (" << i << " = 0; " << i << " < " << length << "; " - << i << "++)" << endl; + << i << "++)" << '\n'; scope_up(out); generate_serialize_list_element(out, (t_list*)ttype, prefix, i, error_ret); scope_down(out); out << indent() << "if ((ret = thrift_protocol_write_list_end (protocol, " - "error)) < 0)" << endl; + "error)) < 0)" << '\n'; indent_up(); - out << indent() << "return " << error_ret << ";" << endl; + out << indent() << "return " << error_ret << ";" << '\n'; indent_down(); - out << indent() << "xfer += ret;" << endl; + out << indent() << "xfer += ret;" << '\n'; } scope_down(out); @@ -4023,11 +4021,11 @@ void t_c_glib_generator::generate_deserialize_field(ostream& out, } else if (type->is_base_type()) { t_base_type::t_base tbase = ((t_base_type*)type)->get_base(); if (tbase == t_base_type::TYPE_STRING) { - indent(out) << "if (" << name << " != NULL)" << endl << indent() << "{" << endl; + indent(out) << "if (" << name << " != NULL)" << '\n' << indent() << "{" << '\n'; indent_up(); - indent(out) << "g_free(" << name << ");" << endl << indent() << name << " = NULL;" << endl; + indent(out) << "g_free(" << name << ");" << '\n' << indent() << name << " = NULL;" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } indent(out) << "if ((ret = thrift_protocol_read_"; @@ -4063,22 +4061,22 @@ void t_c_glib_generator::generate_deserialize_field(ostream& out, default: throw "compiler error: no C reader for base type " + t_base_type::t_base_name(tbase) + name; } - out << ", error)) < 0)" << endl; - out << indent() << " return " << error_ret << ";" << endl << indent() << "xfer += ret;" - << endl; + out << ", error)) < 0)" << '\n'; + out << indent() << " return " << error_ret << ";" << '\n' << indent() << "xfer += ret;" + << '\n'; // load the byte array with the data if (tbase == t_base_type::TYPE_STRING && type->is_binary()) { - indent(out) << name << " = g_byte_array_new();" << endl; - indent(out) << "g_byte_array_append (" << name << ", (guint8 *) data, (guint) len);" << endl; - indent(out) << "g_free (data);" << endl; + indent(out) << name << " = g_byte_array_new();" << '\n'; + indent(out) << "g_byte_array_append (" << name << ", (guint8 *) data, (guint) len);" << '\n'; + indent(out) << "g_free (data);" << '\n'; } } else if (type->is_enum()) { string t = tmp("ecast"); - out << indent() << "gint32 " << t << ";" << endl << indent() - << "if ((ret = thrift_protocol_read_i32 (protocol, &" << t << ", error)) < 0)" << endl - << indent() << " return " << error_ret << ";" << endl << indent() << "xfer += ret;" << endl - << indent() << name << " = (" << type_name(type) << ")" << t << ";" << endl; + out << indent() << "gint32 " << t << ";" << '\n' << indent() + << "if ((ret = thrift_protocol_read_i32 (protocol, &" << t << ", error)) < 0)" << '\n' + << indent() << " return " << error_ret << ";" << '\n' << indent() << "xfer += ret;" << '\n' + << indent() << name << " = (" << type_name(type) << ")" << t << ";" << '\n'; } else { throw std::logic_error("DO NOT KNOW HOW TO SERIALIZE FIELD '" + tfield->get_name() + "' TYPE '" + type_name(type)); @@ -4088,9 +4086,9 @@ void t_c_glib_generator::generate_deserialize_field(ostream& out, // set the isset variable. if the type is required, then set the // local variable indicating the value was set, so that we can do // validation later. if (prefix != "" && tfield->get_req() != t_field::T_REQUIRED) { - indent(out) << prefix << "__isset_" << tfield->get_name() << suffix << " = TRUE;" << endl; + indent(out) << prefix << "__isset_" << tfield->get_name() << suffix << " = TRUE;" << '\n'; } else if (prefix != "" && tfield->get_req() == t_field::T_REQUIRED) { - indent(out) << "isset_" << tfield->get_name() << " = TRUE;" << endl; + indent(out) << "isset_" << tfield->get_name() << " = TRUE;" << '\n'; } } @@ -4101,30 +4099,30 @@ void t_c_glib_generator::generate_deserialize_struct(ostream& out, bool allocate) { string name_uc = to_upper_case(initial_caps_to_underscores(tstruct->get_name())); if (tstruct->is_xception()) { - out << indent() << "/* This struct is an exception */" << endl; + out << indent() << "/* This struct is an exception */" << '\n'; allocate = true; } if (allocate) { - out << indent() << "if ( " << prefix << " != NULL)" << endl << indent() << "{" << endl; + out << indent() << "if ( " << prefix << " != NULL)" << '\n' << indent() << "{" << '\n'; indent_up(); - out << indent() << "g_object_unref (" << prefix << ");" << endl; + out << indent() << "g_object_unref (" << prefix << ");" << '\n'; indent_down(); - out << indent() << "}" << endl << indent() << prefix << " = g_object_new (" << this->nspace_uc - << "TYPE_" << name_uc << ", NULL);" << endl; + out << indent() << "}" << '\n' << indent() << prefix << " = g_object_new (" << this->nspace_uc + << "TYPE_" << name_uc << ", NULL);" << '\n'; } out << indent() << "if ((ret = thrift_struct_read (THRIFT_STRUCT (" << prefix - << "), protocol, error)) < 0)" << endl << indent() << "{" << endl; + << "), protocol, error)) < 0)" << '\n' << indent() << "{" << '\n'; indent_up(); if (allocate) { - indent(out) << "g_object_unref (" << prefix << ");" << endl; + indent(out) << "g_object_unref (" << prefix << ");" << '\n'; if (tstruct->is_xception()) { - indent(out) << prefix << " = NULL;" << endl; + indent(out) << prefix << " = NULL;" << '\n'; } } - out << indent() << "return " << error_ret << ";" << endl; + out << indent() << "return " << error_ret << ";" << '\n'; indent_down(); - out << indent() << "}" << endl << indent() << "xfer += ret;" << endl; + out << indent() << "}" << '\n' << indent() << "xfer += ret;" << '\n'; } void t_c_glib_generator::generate_deserialize_container(ostream& out, @@ -4134,80 +4132,80 @@ void t_c_glib_generator::generate_deserialize_container(ostream& out, scope_up(out); if (ttype->is_map()) { - out << indent() << "guint32 size;" << endl - << indent() << "guint32 i;" << endl - << indent() << "ThriftType key_type;" << endl - << indent() << "ThriftType value_type;" << endl - << endl - << indent() << "/* read the map begin marker */" << endl + out << indent() << "guint32 size;" << '\n' + << indent() << "guint32 i;" << '\n' + << indent() << "ThriftType key_type;" << '\n' + << indent() << "ThriftType value_type;" << '\n' + << '\n' + << indent() << "/* read the map begin marker */" << '\n' << indent() << "if ((ret = thrift_protocol_read_map_begin (protocol, " - "&key_type, &value_type, &size, error)) < 0)" << endl; + "&key_type, &value_type, &size, error)) < 0)" << '\n'; indent_up(); - out << indent() << "return " << error_ret << ";" << endl; + out << indent() << "return " << error_ret << ";" << '\n'; indent_down(); - out << indent() << "xfer += ret;" << endl - << endl; + out << indent() << "xfer += ret;" << '\n' + << '\n'; // iterate over map elements - out << indent() << "/* iterate through each of the map's fields */" << endl - << indent() << "for (i = 0; i < size; i++)" << endl; + out << indent() << "/* iterate through each of the map's fields */" << '\n' + << indent() << "for (i = 0; i < size; i++)" << '\n'; scope_up(out); generate_deserialize_map_element(out, (t_map*)ttype, prefix, error_ret); scope_down(out); - out << endl; + out << '\n'; // read map end - out << indent() << "/* read the map end marker */" << endl + out << indent() << "/* read the map end marker */" << '\n' << indent() << "if ((ret = thrift_protocol_read_map_end (protocol, " - "error)) < 0)" << endl; + "error)) < 0)" << '\n'; indent_up(); - out << indent() << "return " << error_ret << ";" << endl; + out << indent() << "return " << error_ret << ";" << '\n'; indent_down(); - out << indent() << "xfer += ret;" << endl; + out << indent() << "xfer += ret;" << '\n'; } else if (ttype->is_set()) { - out << indent() << "guint32 size;" << endl - << indent() << "guint32 i;" << endl - << indent() << "ThriftType element_type;" << endl - << endl + out << indent() << "guint32 size;" << '\n' + << indent() << "guint32 i;" << '\n' + << indent() << "ThriftType element_type;" << '\n' + << '\n' << indent() << "if ((ret = thrift_protocol_read_set_begin (protocol, " - "&element_type, &size, error)) < 0)" << endl; + "&element_type, &size, error)) < 0)" << '\n'; indent_up(); - out << indent() << "return " << error_ret << ";" << endl; + out << indent() << "return " << error_ret << ";" << '\n'; indent_down(); - out << indent() << "xfer += ret;" << endl - << endl; + out << indent() << "xfer += ret;" << '\n' + << '\n'; // iterate over the elements - out << indent() << "/* iterate through the set elements */" << endl - << indent() << "for (i = 0; i < size; ++i)" << endl; + out << indent() << "/* iterate through the set elements */" << '\n' + << indent() << "for (i = 0; i < size; ++i)" << '\n'; scope_up(out); generate_deserialize_set_element(out, (t_set*)ttype, prefix, error_ret); scope_down(out); // read set end out << indent() << "if ((ret = thrift_protocol_read_set_end (protocol, " - "error)) < 0)" << endl; + "error)) < 0)" << '\n'; indent_up(); - out << indent() << "return " << error_ret << ";" << endl; + out << indent() << "return " << error_ret << ";" << '\n'; indent_down(); - out << indent() << "xfer += ret;" << endl - << endl; + out << indent() << "xfer += ret;" << '\n' + << '\n'; } else if (ttype->is_list()) { - out << indent() << "guint32 size;" << endl - << indent() << "guint32 i;" << endl - << indent() << "ThriftType element_type;" << endl - << endl + out << indent() << "guint32 size;" << '\n' + << indent() << "guint32 i;" << '\n' + << indent() << "ThriftType element_type;" << '\n' + << '\n' << indent() << "if ((ret = thrift_protocol_read_list_begin (protocol, " - "&element_type,&size, error)) < 0)" << endl; + "&element_type,&size, error)) < 0)" << '\n'; indent_up(); - out << indent() << "return " << error_ret << ";" << endl; + out << indent() << "return " << error_ret << ";" << '\n'; indent_down(); - out << indent() << "xfer += ret;" << endl - << endl; + out << indent() << "xfer += ret;" << '\n' + << '\n'; // iterate over the elements - out << indent() << "/* iterate through list elements */" << endl - << indent() << "for (i = 0; i < size; i++)" << endl; + out << indent() << "/* iterate through list elements */" << '\n' + << indent() << "for (i = 0; i < size; i++)" << '\n'; scope_up(out); generate_deserialize_list_element(out, (t_list*)ttype, @@ -4218,11 +4216,11 @@ void t_c_glib_generator::generate_deserialize_container(ostream& out, // read list end out << indent() << "if ((ret = thrift_protocol_read_list_end (protocol, " - "error)) < 0)" << endl; + "error)) < 0)" << '\n'; indent_up(); - out << indent() << "return " << error_ret << ";" << endl; + out << indent() << "return " << error_ret << ";" << '\n'; indent_down(); - out << indent() << "xfer += ret;" << endl; + out << indent() << "xfer += ret;" << '\n'; } scope_down(out); @@ -4239,16 +4237,16 @@ void t_c_glib_generator::declare_local_variable(ostream& out, t_type* ttype, str if (ttype->is_map()) { t_map* tmap = (t_map*)ttype; out << indent() << tname << ptr << " " << name << " = " - << generate_new_hash_from_type(tmap->get_key_type(), tmap->get_val_type()) << endl; + << generate_new_hash_from_type(tmap->get_key_type(), tmap->get_val_type()) << '\n'; } else if (ttype->is_list()) { t_list* tlist = (t_list*)ttype; out << indent() << tname << ptr << " " << name << " = " - << generate_new_array_from_type(tlist->get_elem_type()) << endl; + << generate_new_array_from_type(tlist->get_elem_type()) << '\n'; } else if (for_hash_table && ttype->is_enum()) { - out << indent() << tname << " " << name << ";" << endl; + out << indent() << tname << " " << name << ";" << '\n'; } else { out << indent() << tname << ptr << " " << name - << (ptr != "" ? " = g_new (" + tname + ", 1)" : " = NULL") << ";" << endl; + << (ptr != "" ? " = g_new (" + tname + ", 1)" : " = NULL") << ";" << '\n'; } } @@ -4259,7 +4257,7 @@ void t_c_glib_generator::declore_local_variable_for_write(ostream& out, ttype = get_true_type(ttype); string ptr = ttype->is_string() || !ttype->is_base_type() ? " " : "* "; string init_val = ttype->is_enum() ? "" : " = NULL"; - out << indent() << tname << ptr << name << init_val << ";" << endl; + out << indent() << tname << ptr << name << init_val << ";" << '\n'; } void t_c_glib_generator::generate_deserialize_map_element(ostream& out, @@ -4289,10 +4287,10 @@ void t_c_glib_generator::generate_deserialize_map_element(ostream& out, t_field fval(tval, tval_ptr + valname); generate_deserialize_field(out, &fval, "", "", error_ret); - indent(out) << "if (" << prefix << " && " << keyname << ")" << endl; + indent(out) << "if (" << prefix << " && " << keyname << ")" << '\n'; indent_up(); indent(out) << "g_hash_table_insert ((GHashTable *)" << prefix << ", (gpointer) " << keyname - << ", (gpointer) " << valname << ");" << endl; + << ", (gpointer) " << valname << ");" << '\n'; indent_down(); } @@ -4309,10 +4307,10 @@ void t_c_glib_generator::generate_deserialize_set_element(ostream& out, t_field felem(telem, telem_ptr + elem); generate_deserialize_field(out, &felem, "", "", error_ret); - indent(out) << "if (" << prefix << " && " << elem << ")" << endl; + indent(out) << "if (" << prefix << " && " << elem << ")" << '\n'; indent_up(); indent(out) << "g_hash_table_insert ((GHashTable *) " << prefix << ", (gpointer) " << elem - << ", (gpointer) " << elem << ");" << endl; + << ", (gpointer) " << elem << ");" << '\n'; indent_down(); } @@ -4334,10 +4332,10 @@ void t_c_glib_generator::generate_deserialize_list_element(ostream& out, if (ttype->is_void()) { throw std::runtime_error("compiler error: list element type cannot be void"); } else if (is_numeric(ttype)) { - indent(out) << "g_array_append_vals (" << prefix << ", " << elem << ", 1);" << endl; - indent(out) << "g_free (" << elem << ");" << endl; + indent(out) << "g_array_append_vals (" << prefix << ", " << elem << ", 1);" << '\n'; + indent(out) << "g_free (" << elem << ");" << '\n'; } else { - indent(out) << "g_ptr_array_add (" << prefix << ", " << elem << ");" << endl; + indent(out) << "g_ptr_array_add (" << prefix << ", " << elem << ");" << '\n'; } } diff --git a/compiler/cpp/src/thrift/generate/t_cl_generator.cc b/compiler/cpp/src/thrift/generate/t_cl_generator.cc index e0dcc46af4b..dccecdc53f7 100644 --- a/compiler/cpp/src/thrift/generate/t_cl_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_cl_generator.cc @@ -130,9 +130,9 @@ void t_cl_generator::init_generator() { string f_vars_name = program_dir + "/" + program_name_ + "-vars.lisp"; f_types_.open(f_types_name); - f_types_ << cl_autogen_comment() << endl; + f_types_ << cl_autogen_comment() << '\n'; f_vars_.open(f_vars_name); - f_vars_ << cl_autogen_comment() << endl; + f_vars_ << cl_autogen_comment() << '\n'; package_def(f_types_); package_in(f_types_); @@ -141,7 +141,7 @@ void t_cl_generator::init_generator() { if (!no_asd) { string f_asd_name = program_dir + "/" + system_prefix + program_name_ + ".asd"; f_asd_.open(f_asd_name); - f_asd_ << cl_autogen_comment() << endl; + f_asd_ << cl_autogen_comment() << '\n'; asdf_def(f_asd_); } } @@ -197,13 +197,13 @@ string t_cl_generator::generated_package() { } void t_cl_generator::asdf_def(std::ostream &out) { - out << "(asdf:defsystem #:" << system_prefix << program_name_ << endl; + out << "(asdf:defsystem #:" << system_prefix << program_name_ << '\n'; indent_up(); out << indent() << render_includes() - << indent() << ":serial t" << endl + << indent() << ":serial t" << '\n' << indent() << ":components (" << "(:file \"" << program_name_ << "-types\") " - << "(:file \"" << program_name_ << "-vars\")))" << endl; + << "(:file \"" << program_name_ << "-vars\")))" << '\n'; indent_down(); } @@ -221,11 +221,11 @@ void t_cl_generator::package_def(std::ostream &out) { } out << ")"; } - out << ")" << endl << endl; + out << ")" << '\n' << '\n'; } void t_cl_generator::package_in(std::ostream &out) { - out << "(cl:in-package :" << package() << ")" << endl << endl; + out << "(cl:in-package :" << package() << ")" << '\n' << '\n'; } /** @@ -238,7 +238,7 @@ void t_cl_generator::generate_typedef(t_typedef* ttypedef) { } void t_cl_generator::generate_enum(t_enum* tenum) { - f_types_ << "(thrift:def-enum " << prefix(tenum->get_name()) << endl; + f_types_ << "(thrift:def-enum " << prefix(tenum->get_name()) << '\n'; vector constants = tenum->get_constants(); vector::iterator c_iter; @@ -249,12 +249,12 @@ void t_cl_generator::generate_enum(t_enum* tenum) { for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { value = (*c_iter)->get_value(); - if(c_iter != constants.begin()) f_types_ << endl << indent() << " "; + if(c_iter != constants.begin()) f_types_ << '\n' << indent() << " "; f_types_ << "(\"" << (*c_iter)->get_name() << "\" . " << value << ")"; } indent_down(); - f_types_ << "))" << endl << endl; + f_types_ << "))" << '\n' << '\n'; } /** @@ -266,7 +266,7 @@ void t_cl_generator::generate_const(t_const* tconst) { t_const_value* value = tconst->get_value(); f_vars_ << "(thrift:def-constant " << prefix(name) << " " << render_const_value(type, value) << ")" - << endl << endl; + << '\n' << '\n'; } /** @@ -306,7 +306,7 @@ string t_cl_generator::render_const_value(t_type* type, t_const_value* value) { indent(out) << value->get_integer(); } else if (type->is_struct() || type->is_xception()) { out << (type->is_struct() ? "(make-instance '" : "(make-exception '") << - lowercase(type->get_name()) << " " << endl; + lowercase(type->get_name()) << " " << '\n'; indent_up(); const vector& fields = ((t_struct*)type)->get_members(); @@ -326,7 +326,7 @@ string t_cl_generator::render_const_value(t_type* type, t_const_value* value) { } out << indent() << ":" << v_iter->first->get_string() << " " << - render_const_value(field_type, v_iter->second) << endl; + render_const_value(field_type, v_iter->second) << '\n'; } out << indent() << ")"; @@ -340,7 +340,7 @@ string t_cl_generator::render_const_value(t_type* type, t_const_value* value) { const map& val = value->get_map(); map::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { - out << endl << indent() + out << '\n' << indent() << "(cl:cons " << render_const_value(ktype, v_iter->first) << " " << render_const_value(vtype, v_iter->second) << ")"; } @@ -354,16 +354,16 @@ string t_cl_generator::render_const_value(t_type* type, t_const_value* value) { etype = ((t_set*)type)->get_elem_type(); } if (type->is_set()) { - out << "(thrift:set" << endl; + out << "(thrift:set" << '\n'; } else { - out << "(thrift:list" << endl; + out << "(thrift:list" << '\n'; } indent_up(); indent_up(); const vector& val = value->get_list(); vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { - out << indent() << render_const_value(etype, *v_iter) << endl; + out << indent() << render_const_value(etype, *v_iter) << '\n'; } out << indent() << ")"; indent_down(); @@ -394,7 +394,7 @@ void t_cl_generator::generate_cl_struct_internal(std::ostream& out, t_struct* ts t_type* type = (*m_iter)->get_type(); if (m_iter != members.begin()) { - out << endl << indent() << " "; + out << '\n' << indent() << " "; } out << "(" << prefix((*m_iter)->get_name()) << " " << ( (nullptr != value) ? render_const_value(type, value) : "nil" ) << @@ -421,16 +421,16 @@ void t_cl_generator::generate_cl_struct_internal(std::ostream& out, t_struct* ts void t_cl_generator::generate_cl_struct(std::ostream& out, t_struct* tstruct, bool is_exception = false) { std::string name = type_name(tstruct); out << (is_exception ? "(thrift:def-exception " : "(thrift:def-struct ") << - prefix(name) << endl; + prefix(name) << '\n'; indent_up(); if ( tstruct->has_doc() ) { out << indent() ; - out << "\"" << cl_docstring(tstruct->get_doc()) << "\"" << endl; + out << "\"" << cl_docstring(tstruct->get_doc()) << "\"" << '\n'; } out << indent() ; generate_cl_struct_internal(out, tstruct, is_exception); indent_down(); - out << ")" << endl << endl; + out << ")" << '\n' << '\n'; } void t_cl_generator::generate_exception_sig(std::ostream& out, t_function* f) { @@ -454,7 +454,7 @@ void t_cl_generator::generate_service(t_service* tservice) { indent_up(); if ( tservice->has_doc()) { - f_types_ << endl << indent() + f_types_ << '\n' << indent() << "(:documentation \"" << cl_docstring(tservice->get_doc()) << "\")"; } @@ -465,23 +465,23 @@ void t_cl_generator::generate_service(t_service* tservice) { t_struct* exceptions = function->get_xceptions(); const vector& xmembers = exceptions->get_members(); - f_types_ << endl << indent() << "(:method " << prefix(fname); + f_types_ << '\n' << indent() << "(:method " << prefix(fname); f_types_ << " (" << signature << " " << typespec((*f_iter)->get_returntype()) << ")"; if (xmembers.size() > 0) { - f_types_ << endl << indent() << " :exceptions " ; + f_types_ << '\n' << indent() << " :exceptions " ; generate_exception_sig(f_types_, function); } if ( (*f_iter)->is_oneway() ) { - f_types_ << endl << indent() << " :oneway t"; + f_types_ << '\n' << indent() << " :oneway t"; } if ( (*f_iter)->has_doc() ) { - f_types_ << endl << indent() << " :documentation \"" + f_types_ << '\n' << indent() << " :documentation \"" << cl_docstring((*f_iter)->get_doc()) << "\""; } f_types_ << ")"; } - f_types_ << ")" << endl << endl; + f_types_ << ")" << '\n' << '\n'; indent_down(); } diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc index e21252e8f6e..dc74a92aa05 100644 --- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc @@ -42,8 +42,6 @@ using std::ostream; using std::string; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /** * C++ code generator. This is legitimacy incarnate. * @@ -438,69 +436,69 @@ void t_cpp_generator::init_generator() { f_types_tcc_ << autogen_comment(); // Start ifndef - f_types_ << "#ifndef " << program_name_ << "_TYPES_H" << endl << "#define " << program_name_ - << "_TYPES_H" << endl << endl; - f_types_tcc_ << "#ifndef " << program_name_ << "_TYPES_TCC" << endl << "#define " << program_name_ - << "_TYPES_TCC" << endl << endl; + f_types_ << "#ifndef " << program_name_ << "_TYPES_H" << '\n' << "#define " << program_name_ + << "_TYPES_H" << '\n' << '\n'; + f_types_tcc_ << "#ifndef " << program_name_ << "_TYPES_TCC" << '\n' << "#define " << program_name_ + << "_TYPES_TCC" << '\n' << '\n'; // Include base types - f_types_ << "#include " << endl - << endl - << "#include " << endl - << "#include " << endl - << "#include " << endl - << "#include " << endl - << "#include " << endl - << endl; + f_types_ << "#include " << '\n' + << '\n' + << "#include " << '\n' + << "#include " << '\n' + << "#include " << '\n' + << "#include " << '\n' + << "#include " << '\n' + << '\n'; // Include C++xx compatibility header - f_types_ << "#include " << endl; - f_types_ << "#include " << endl; + f_types_ << "#include " << '\n'; + f_types_ << "#include " << '\n'; // Include other Thrift includes const vector& includes = program_->get_includes(); for (auto include : includes) { f_types_ << "#include \"" << get_include_prefix(*include) << include->get_name() - << "_types.h\"" << endl; + << "_types.h\"" << '\n'; // XXX(simpkins): If gen_templates_ is enabled, we currently assume all // included files were also generated with templates enabled. f_types_tcc_ << "#include \"" << get_include_prefix(*include) << include->get_name() - << "_types.tcc\"" << endl; + << "_types.tcc\"" << '\n'; } - f_types_ << endl; + f_types_ << '\n'; // Include custom headers const vector& cpp_includes = program_->get_cpp_includes(); for (const auto & cpp_include : cpp_includes) { if (cpp_include[0] == '<') { - f_types_ << "#include " << cpp_include << endl; + f_types_ << "#include " << cpp_include << '\n'; } else { - f_types_ << "#include \"" << cpp_include << "\"" << endl; + f_types_ << "#include \"" << cpp_include << "\"" << '\n'; } } - f_types_ << endl; + f_types_ << '\n'; // Include the types file f_types_impl_ << "#include \"" << get_include_prefix(*get_program()) << program_name_ - << "_types.h\"" << endl << endl; + << "_types.h\"" << '\n' << '\n'; f_types_tcc_ << "#include \"" << get_include_prefix(*get_program()) << program_name_ - << "_types.h\"" << endl << endl; + << "_types.h\"" << '\n' << '\n'; // The swap() code needs for std::swap() - f_types_impl_ << "#include " << endl; + f_types_impl_ << "#include " << '\n'; // for operator<< - f_types_impl_ << "#include " << endl << endl; - f_types_impl_ << "#include " << endl << endl; + f_types_impl_ << "#include " << '\n' << '\n'; + f_types_impl_ << "#include " << '\n' << '\n'; // Open namespace ns_open_ = namespace_open(program_->get_namespace("cpp")); ns_close_ = namespace_close(program_->get_namespace("cpp")); - f_types_ << ns_open_ << endl << endl; + f_types_ << ns_open_ << '\n' << '\n'; - f_types_impl_ << ns_open_ << endl << endl; + f_types_impl_ << ns_open_ << '\n' << '\n'; - f_types_tcc_ << ns_open_ << endl << endl; + f_types_tcc_ << ns_open_ << '\n' << '\n'; } /** @@ -508,21 +506,21 @@ void t_cpp_generator::init_generator() { */ void t_cpp_generator::close_generator() { // Close namespace - f_types_ << ns_close_ << endl << endl; - f_types_impl_ << ns_close_ << endl; - f_types_tcc_ << ns_close_ << endl << endl; + f_types_ << ns_close_ << '\n' << '\n'; + f_types_impl_ << ns_close_ << '\n'; + f_types_tcc_ << ns_close_ << '\n' << '\n'; // Include the types.tcc file from the types header file, // so clients don't have to explicitly include the tcc file. // TODO(simpkins): Make this a separate option. if (gen_templates_) { f_types_ << "#include \"" << get_include_prefix(*get_program()) << program_name_ - << "_types.tcc\"" << endl << endl; + << "_types.tcc\"" << '\n' << '\n'; } // Close ifndef - f_types_ << "#endif" << endl; - f_types_tcc_ << "#endif" << endl; + f_types_ << "#endif" << '\n'; + f_types_tcc_ << "#endif" << '\n'; // Close output file f_types_.close(); @@ -544,7 +542,7 @@ void t_cpp_generator::close_generator() { void t_cpp_generator::generate_typedef(t_typedef* ttypedef) { generate_java_doc(f_types_, ttypedef); f_types_ << indent() << "typedef " << type_name(ttypedef->get_type(), true) << " " - << ttypedef->get_symbolic() << ";" << endl << endl; + << ttypedef->get_symbolic() << ";" << '\n' << '\n'; } void t_cpp_generator::generate_enum_constant_list(std::ostream& f, @@ -552,7 +550,7 @@ void t_cpp_generator::generate_enum_constant_list(std::ostream& f, const char* prefix, const char* suffix, bool include_values) { - f << " {" << endl; + f << " {" << '\n'; indent_up(); vector::const_iterator c_iter; @@ -561,7 +559,7 @@ void t_cpp_generator::generate_enum_constant_list(std::ostream& f, if (first) { first = false; } else { - f << "," << endl; + f << "," << '\n'; } generate_java_doc(f, *c_iter); indent(f) << prefix << (*c_iter)->get_name() << suffix; @@ -570,9 +568,9 @@ void t_cpp_generator::generate_enum_constant_list(std::ostream& f, } } - f << endl; + f << '\n'; indent_down(); - indent(f) << "};" << endl; + indent(f) << "};" << '\n'; } /** @@ -588,7 +586,7 @@ void t_cpp_generator::generate_enum(t_enum* tenum) { if (!gen_pure_enums_) { enum_name = "type"; generate_java_doc(f_types_, tenum); - f_types_ << indent() << "struct " << tenum->get_name() << " {" << endl; + f_types_ << indent() << "struct " << tenum->get_name() << " {" << '\n'; indent_up(); } f_types_ << indent() << "enum " << enum_name; @@ -597,10 +595,10 @@ void t_cpp_generator::generate_enum(t_enum* tenum) { if (!gen_pure_enums_) { indent_down(); - f_types_ << "};" << endl; + f_types_ << "};" << '\n'; } - f_types_ << endl; + f_types_ << '\n'; /** Generate a character array of enum names for debugging purposes. @@ -617,13 +615,13 @@ void t_cpp_generator::generate_enum(t_enum* tenum) { generate_enum_constant_list(f_types_impl_, constants, "\"", "\"", false); f_types_ << indent() << "extern const std::map _" << tenum->get_name() - << "_VALUES_TO_NAMES;" << endl << endl; + << "_VALUES_TO_NAMES;" << '\n' << '\n'; f_types_impl_ << indent() << "const std::map _" << tenum->get_name() << "_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(" << constants.size() << ", _k" << tenum->get_name() << "Values" << ", _k" << tenum->get_name() << "Names), " - << "::apache::thrift::TEnumIterator(-1, nullptr, nullptr));" << endl << endl; + << "::apache::thrift::TEnumIterator(-1, nullptr, nullptr));" << '\n' << '\n'; generate_enum_ostream_operator_decl(f_types_, tenum); generate_enum_ostream_operator(f_types_impl_, tenum); @@ -642,8 +640,8 @@ void t_cpp_generator::generate_enum_ostream_operator_decl(std::ostream& out, t_e } else { out << tenum->get_name() << "::type&"; } - out << " val);" << endl; - out << endl; + out << " val);" << '\n'; + out << '\n'; } void t_cpp_generator::generate_enum_ostream_operator(std::ostream& out, t_enum* tenum) { @@ -662,20 +660,20 @@ void t_cpp_generator::generate_enum_ostream_operator(std::ostream& out, t_enum* scope_up(out); out << indent() << "std::map::const_iterator it = _" - << tenum->get_name() << "_VALUES_TO_NAMES.find(val);" << endl; - out << indent() << "if (it != _" << tenum->get_name() << "_VALUES_TO_NAMES.end()) {" << endl; + << tenum->get_name() << "_VALUES_TO_NAMES.find(val);" << '\n'; + out << indent() << "if (it != _" << tenum->get_name() << "_VALUES_TO_NAMES.end()) {" << '\n'; indent_up(); - out << indent() << "out << it->second;" << endl; + out << indent() << "out << it->second;" << '\n'; indent_down(); - out << indent() << "} else {" << endl; + out << indent() << "} else {" << '\n'; indent_up(); - out << indent() << "out << static_cast(val);" << endl; + out << indent() << "out << static_cast(val);" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; - out << indent() << "return out;" << endl; + out << indent() << "return out;" << '\n'; scope_down(out); - out << endl; + out << '\n'; } } @@ -686,8 +684,8 @@ void t_cpp_generator::generate_enum_to_string_helper_function_decl(std::ostream& } else { out << tenum->get_name() << "::type&"; } - out << " val);" << endl; - out << endl; + out << " val);" << '\n'; + out << '\n'; } void t_cpp_generator::generate_enum_to_string_helper_function(std::ostream& out, t_enum* tenum) { @@ -702,19 +700,19 @@ void t_cpp_generator::generate_enum_to_string_helper_function(std::ostream& out, scope_up(out); out << indent() << "std::map::const_iterator it = _" - << tenum->get_name() << "_VALUES_TO_NAMES.find(val);" << endl; - out << indent() << "if (it != _" << tenum->get_name() << "_VALUES_TO_NAMES.end()) {" << endl; + << tenum->get_name() << "_VALUES_TO_NAMES.find(val);" << '\n'; + out << indent() << "if (it != _" << tenum->get_name() << "_VALUES_TO_NAMES.end()) {" << '\n'; indent_up(); - out << indent() << "return std::string(it->second);" << endl; + out << indent() << "return std::string(it->second);" << '\n'; indent_down(); - out << indent() << "} else {" << endl; + out << indent() << "} else {" << '\n'; indent_up(); - out << indent() << "return std::to_string(static_cast(val));" << endl; + out << indent() << "return std::to_string(static_cast(val));" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; scope_down(out); - out << endl; + out << '\n'; } } @@ -736,28 +734,28 @@ void t_cpp_generator::generate_consts(std::vector consts) { f_consts_impl << autogen_comment(); // Start ifndef - f_consts << "#ifndef " << program_name_ << "_CONSTANTS_H" << endl << "#define " << program_name_ - << "_CONSTANTS_H" << endl << endl << "#include \"" << get_include_prefix(*get_program()) - << program_name_ << "_types.h\"" << endl << endl << ns_open_ << endl << endl; + f_consts << "#ifndef " << program_name_ << "_CONSTANTS_H" << '\n' << "#define " << program_name_ + << "_CONSTANTS_H" << '\n' << '\n' << "#include \"" << get_include_prefix(*get_program()) + << program_name_ << "_types.h\"" << '\n' << '\n' << ns_open_ << '\n' << '\n'; f_consts_impl << "#include \"" << get_include_prefix(*get_program()) << program_name_ - << "_constants.h\"" << endl << endl << ns_open_ << endl << endl; + << "_constants.h\"" << '\n' << '\n' << ns_open_ << '\n' << '\n'; - f_consts << "class " << program_name_ << "Constants {" << endl << " public:" << endl << " " - << program_name_ << "Constants();" << endl << endl; + f_consts << "class " << program_name_ << "Constants {" << '\n' << " public:" << '\n' << " " + << program_name_ << "Constants();" << '\n' << '\n'; indent_up(); vector::iterator c_iter; for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { string name = (*c_iter)->get_name(); t_type* type = (*c_iter)->get_type(); - f_consts << indent() << type_name(type) << " " << name << ";" << endl; + f_consts << indent() << type_name(type) << " " << name << ";" << '\n'; } indent_down(); - f_consts << "};" << endl; + f_consts << "};" << '\n'; f_consts_impl << "const " << program_name_ << "Constants g_" << program_name_ << "_constants;" - << endl << endl << program_name_ << "Constants::" << program_name_ - << "Constants() {" << endl; + << '\n' << '\n' << program_name_ << "Constants::" << program_name_ + << "Constants() {" << '\n'; indent_up(); for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { print_const_value(f_consts_impl, @@ -766,13 +764,13 @@ void t_cpp_generator::generate_consts(std::vector consts) { (*c_iter)->get_value()); } indent_down(); - indent(f_consts_impl) << "}" << endl; + indent(f_consts_impl) << "}" << '\n'; - f_consts << endl << "extern const " << program_name_ << "Constants g_" << program_name_ - << "_constants;" << endl << endl << ns_close_ << endl << endl << "#endif" << endl; + f_consts << '\n' << "extern const " << program_name_ << "Constants g_" << program_name_ + << "_constants;" << '\n' << '\n' << ns_close_ << '\n' << '\n' << "#endif" << '\n'; f_consts.close(); - f_consts_impl << endl << ns_close_ << endl << endl; + f_consts_impl << '\n' << ns_close_ << '\n' << '\n'; f_consts_impl.close(); } } @@ -789,11 +787,11 @@ void t_cpp_generator::print_const_value(ostream& out, type = get_true_type(type); if (type->is_base_type()) { string v2 = render_const_value(out, name, type, value); - indent(out) << name << " = " << v2 << ";" << endl << endl; + indent(out) << name << " = " << v2 << ";" << '\n' << '\n'; } else if (type->is_enum()) { indent(out) << name << " = static_cast<" << type_name(type) << '>' - << '(' << value->get_integer() << ");" << endl << endl; + << '(' << value->get_integer() << ");" << '\n' << '\n'; } else if (type->is_struct() || type->is_xception()) { const vector& fields = ((t_struct*)type)->get_members(); vector::const_iterator f_iter; @@ -813,12 +811,12 @@ void t_cpp_generator::print_const_value(ostream& out, throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string(); } string item_val = render_const_value(out, name, field_type, v_iter->second); - indent(out) << name << "." << v_iter->first->get_string() << " = " << item_val << ";" << endl; + indent(out) << name << "." << v_iter->first->get_string() << " = " << item_val << ";" << '\n'; if (is_nonrequired_field) { - indent(out) << name << ".__isset." << v_iter->first->get_string() << " = true;" << endl; + indent(out) << name << ".__isset." << v_iter->first->get_string() << " = true;" << '\n'; } } - out << endl; + out << '\n'; } else if (type->is_map()) { t_type* ktype = ((t_map*)type)->get_key_type(); t_type* vtype = ((t_map*)type)->get_val_type(); @@ -827,27 +825,27 @@ void t_cpp_generator::print_const_value(ostream& out, for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string key = render_const_value(out, name, ktype, v_iter->first); string item_val = render_const_value(out, name, vtype, v_iter->second); - indent(out) << name << ".insert(std::make_pair(" << key << ", " << item_val << "));" << endl; + indent(out) << name << ".insert(std::make_pair(" << key << ", " << item_val << "));" << '\n'; } - out << endl; + out << '\n'; } else if (type->is_list()) { t_type* etype = ((t_list*)type)->get_elem_type(); const vector& val = value->get_list(); vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string item_val = render_const_value(out, name, etype, *v_iter); - indent(out) << name << ".push_back(" << item_val << ");" << endl; + indent(out) << name << ".push_back(" << item_val << ");" << '\n'; } - out << endl; + out << '\n'; } else if (type->is_set()) { t_type* etype = ((t_set*)type)->get_elem_type(); const vector& val = value->get_list(); vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string item_val = render_const_value(out, name, etype, *v_iter); - indent(out) << name << ".insert(" << item_val << ");" << endl; + indent(out) << name << ".insert(" << item_val << ");" << '\n'; } - out << endl; + out << '\n'; } else { throw "INVALID TYPE IN print_const_value: " + type->get_name(); } @@ -895,7 +893,7 @@ string t_cpp_generator::render_const_value(ostream& out, << '(' << value->get_integer() << ')'; } else { string t = tmp("tmp"); - indent(out) << type_name(type) << " " << t << ";" << endl; + indent(out) << type_name(type) << " " << t << ";" << '\n'; print_const_value(out, t, type, value); render << t; } @@ -905,7 +903,7 @@ string t_cpp_generator::render_const_value(ostream& out, void t_cpp_generator::generate_forward_declaration(t_struct* tstruct) { // Forward declare struct def - f_types_ << indent() << "class " << tstruct->get_name() << ";" << endl << endl; + f_types_ << indent() << "class " << tstruct->get_name() << ";" << '\n' << '\n'; } /** @@ -953,25 +951,25 @@ void t_cpp_generator::generate_equality_operator(std::ostream& out, t_struct* ts out << indent() << "bool " << tstruct->get_name() << "::operator==(const " << tstruct->get_name() << " & " - << (members.size() > 0 ? "rhs" : "/* rhs */") << ") const" << endl; + << (members.size() > 0 ? "rhs" : "/* rhs */") << ") const" << '\n'; scope_up(out); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { // Most existing Thrift code does not use isset or optional/required, // so we treat "default" fields as required. if ((*m_iter)->get_req() != t_field::T_OPTIONAL) { out << indent() << "if (!(" << (*m_iter)->get_name() << " == rhs." - << (*m_iter)->get_name() << "))" << endl << indent() << " return false;" << endl; + << (*m_iter)->get_name() << "))" << '\n' << indent() << " return false;" << '\n'; } else { out << indent() << "if (__isset." << (*m_iter)->get_name() << " != rhs.__isset." - << (*m_iter)->get_name() << ")" << endl << indent() << " return false;" << endl + << (*m_iter)->get_name() << ")" << '\n' << indent() << " return false;" << '\n' << indent() << "else if (__isset." << (*m_iter)->get_name() << " && !(" - << (*m_iter)->get_name() << " == rhs." << (*m_iter)->get_name() << "))" << endl - << indent() << " return false;" << endl; + << (*m_iter)->get_name() << " == rhs." << (*m_iter)->get_name() << "))" << '\n' + << indent() << " return false;" << '\n'; } } - indent(out) << "return true;" << endl; + indent(out) << "return true;" << '\n'; scope_down(out); - out << "\n"; + out << '\n'; } bool t_cpp_generator::has_field_with_default_value(t_struct* tstruct) @@ -1014,7 +1012,7 @@ void t_cpp_generator::generate_default_constructor(ostream& out, // Default-initialize TException, if it is our base type if (is_exception) { - out << "\n"; + out << '\n'; indent(out) << " : "; out << "TException()"; init_ctor = true; @@ -1054,7 +1052,7 @@ void t_cpp_generator::generate_default_constructor(ostream& out, // Start generating body // - out << " {" << endl; + out << " {" << '\n'; indent_up(); // TODO(dreiss): When everything else in Thrift is perfect, // do more of these in the initializer list. @@ -1111,14 +1109,14 @@ void t_cpp_generator::generate_constructor_helper(ostream& out, out << "noexcept "; if (is_exception) out << ": TException() "; - out << "{" << endl; + out << "{" << '\n'; indent_up(); const vector& members = tstruct->get_members(); // eliminate compiler unused warning if (members.empty()) - indent(out) << "(void) " << tmp_name << ";" << endl; + indent(out) << "(void) " << tmp_name << ";" << '\n'; vector::const_iterator f_iter; bool has_nonrequired_fields = false; @@ -1129,15 +1127,15 @@ void t_cpp_generator::generate_constructor_helper(ostream& out, << maybeMove( tmp_name + "." + (*f_iter)->get_name(), is_move && is_complex_type((*f_iter)->get_type())) - << ";" << endl; + << ";" << '\n'; } if (has_nonrequired_fields) { - indent(out) << "__isset = " << maybeMove(tmp_name + ".__isset", false) << ";" << endl; + indent(out) << "__isset = " << maybeMove(tmp_name + ".__isset", false) << ";" << '\n'; } indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_cpp_generator::generate_assignment_operator(ostream& out, t_struct* tstruct) { @@ -1161,14 +1159,14 @@ void t_cpp_generator::generate_assignment_helper(ostream& out, t_struct* tstruct out << tmp_name << ") "; if(is_move || is_struct_storage_not_throwing(tstruct)) out << "noexcept "; - out << "{" << endl; + out << "{" << '\n'; indent_up(); const vector& members = tstruct->get_members(); // eliminate compiler unused warning if (members.empty()) - indent(out) << "(void) " << tmp_name << ";" << endl; + indent(out) << "(void) " << tmp_name << ";" << '\n'; vector::const_iterator f_iter; bool has_nonrequired_fields = false; @@ -1179,15 +1177,15 @@ void t_cpp_generator::generate_assignment_helper(ostream& out, t_struct* tstruct << maybeMove( tmp_name + "." + (*f_iter)->get_name(), is_move && is_complex_type((*f_iter)->get_type())) - << ";" << endl; + << ";" << '\n'; } if (has_nonrequired_fields) { - indent(out) << "__isset = " << maybeMove(tmp_name + ".__isset", false) << ";" << endl; + indent(out) << "__isset = " << maybeMove(tmp_name + ".__isset", false) << ";" << '\n'; } - indent(out) << "return *this;" << endl; + indent(out) << "return *this;" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } /** @@ -1230,7 +1228,7 @@ void t_cpp_generator::generate_struct_declaration(ostream& out, if (has_nonrequired_fields && (!pointers || read)) { - out << indent() << "typedef struct _" << tstruct->get_name() << "__isset {" << endl; + out << indent() << "typedef struct _" << tstruct->get_name() << "__isset {" << '\n'; indent_up(); indent(out) << "_" << tstruct->get_name() << "__isset() "; @@ -1247,58 +1245,58 @@ void t_cpp_generator::generate_struct_declaration(ostream& out, out << ", " << (*m_iter)->get_name() << "(" << isSet << ")"; } } - out << " {}" << endl; + out << " {}" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() != t_field::T_REQUIRED) { - indent(out) << "bool " << (*m_iter)->get_name() << " :1;" << endl; + indent(out) << "bool " << (*m_iter)->get_name() << " :1;" << '\n'; } } indent_down(); - indent(out) << "} _" << tstruct->get_name() << "__isset;" << endl; + indent(out) << "} _" << tstruct->get_name() << "__isset;" << '\n'; } - out << endl; + out << '\n'; generate_java_doc(out, tstruct); // Open struct def - out << indent() << "class " << tstruct->get_name() << extends << " {" << endl << indent() - << " public:" << endl << endl; + out << indent() << "class " << tstruct->get_name() << extends << " {" << '\n' << indent() + << " public:" << '\n' << '\n'; indent_up(); if (!pointers) { bool ok_noexcept = is_struct_storage_not_throwing(tstruct); // Copy constructor indent(out) << tstruct->get_name() << "(const " << tstruct->get_name() << "&)" - << (ok_noexcept? " noexcept" : "") << ';' << endl; + << (ok_noexcept? " noexcept" : "") << ';' << '\n'; // Move constructor if (gen_moveable_) { indent(out) << tstruct->get_name() << "(" << tstruct->get_name() << "&&) noexcept;" - << endl; + << '\n'; } // Assignment Operator indent(out) << tstruct->get_name() << "& operator=(const " << tstruct->get_name() << "&)" - << (ok_noexcept? " noexcept" : "") << ';' << endl; + << (ok_noexcept? " noexcept" : "") << ';' << '\n'; // Move assignment operator if (gen_moveable_) { indent(out) << tstruct->get_name() << "& operator=(" << tstruct->get_name() << "&&) noexcept;" - << endl; + << '\n'; } bool has_default_value = has_field_with_default_value(tstruct); // Default constructor std::string clsname_ctor = tstruct->get_name() + "()"; - indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept") << ";" << endl; + indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept") << ";" << '\n'; } if (tstruct->annotations_.find("final") == tstruct->annotations_.end()) { - out << endl << indent() << "virtual ~" << tstruct->get_name() << "() noexcept;" << endl; + out << '\n' << indent() << "virtual ~" << tstruct->get_name() << "() noexcept;" << '\n'; } // Declare all fields @@ -1307,12 +1305,12 @@ void t_cpp_generator::generate_struct_declaration(ostream& out, indent(out) << declare_field(*m_iter, false, (pointers && !(*m_iter)->get_type()->is_xception()), - !read) << endl; + !read) << '\n'; } // Add the __isset data member if we need it, using the definition from above if (has_nonrequired_fields && (!pointers || read)) { - out << endl << indent() << "_" << tstruct->get_name() << "__isset __isset;" << endl; + out << '\n' << indent() << "_" << tstruct->get_name() << "__isset __isset;" << '\n'; } // Create a setter function for each field @@ -1321,87 +1319,87 @@ void t_cpp_generator::generate_struct_declaration(ostream& out, continue; } if (is_reference((*m_iter))) { - out << endl << indent() << "void __set_" << (*m_iter)->get_name() << "(::std::shared_ptr<" + out << '\n' << indent() << "void __set_" << (*m_iter)->get_name() << "(::std::shared_ptr<" << type_name((*m_iter)->get_type(), false, false) << ">"; - out << " val);" << endl; + out << " val);" << '\n'; } else { - out << endl << indent() << "void __set_" << (*m_iter)->get_name() << "(" + out << '\n' << indent() << "void __set_" << (*m_iter)->get_name() << "(" << type_name((*m_iter)->get_type(), false, true); - out << " val);" << endl; + out << " val);" << '\n'; } } - out << endl; + out << '\n'; if (!pointers) { // Should we generate default operators? if (!gen_no_default_operators_) { // Generate an equality testing operator. out << indent() << "bool operator == (const " << tstruct->get_name() << " & " - << (members.size() > 0 ? "rhs" : "/* rhs */") << ") const;" << endl; + << (members.size() > 0 ? "rhs" : "/* rhs */") << ") const;" << '\n'; out << indent() << "bool operator != (const " << tstruct->get_name() << " &rhs) const {" - << endl << indent() << " return !(*this == rhs);" << endl << indent() << "}" << endl - << endl; + << '\n' << indent() << " return !(*this == rhs);" << '\n' << indent() << "}" << '\n' + << '\n'; // Generate the declaration of a less-than operator. This must be // implemented by the application developer if they wish to use it. (They // will get a link error if they try to use it without an implementation.) - out << indent() << "bool operator < (const " << tstruct->get_name() << " & ) const;" << endl - << endl; + out << indent() << "bool operator < (const " << tstruct->get_name() << " & ) const;" << '\n' + << '\n'; } } if (read) { if (gen_templates_) { - out << indent() << "template " << endl << indent() - << "uint32_t read(Protocol_* iprot);" << endl; + out << indent() << "template " << '\n' << indent() + << "uint32_t read(Protocol_* iprot);" << '\n'; } else { out << indent() << "uint32_t read(" << "::apache::thrift::protocol::TProtocol* iprot)"; if(!is_exception && !extends.empty()) out << " override"; - out << ';' << endl; + out << ';' << '\n'; } } if (write) { if (gen_templates_) { - out << indent() << "template " << endl << indent() - << "uint32_t write(Protocol_* oprot) const;" << endl; + out << indent() << "template " << '\n' << indent() + << "uint32_t write(Protocol_* oprot) const;" << '\n'; } else { out << indent() << "uint32_t write(" << "::apache::thrift::protocol::TProtocol* oprot) const"; if(!is_exception && !extends.empty()) out << " override"; - out << ';' << endl; + out << ';' << '\n'; } } - out << endl; + out << '\n'; if (is_user_struct && !has_custom_ostream(tstruct)) { out << indent() << "virtual "; generate_struct_print_method_decl(out, nullptr); - out << ";" << endl; + out << ";" << '\n'; } // std::exception::what() if (is_exception) { - out << indent() << "mutable std::string thriftTExceptionMessageHolder_;" << endl; + out << indent() << "mutable std::string thriftTExceptionMessageHolder_;" << '\n'; out << indent(); generate_exception_what_method_decl(out, tstruct, false); - out << ";" << endl; + out << ";" << '\n'; } indent_down(); - indent(out) << "};" << endl << endl; + indent(out) << "};" << '\n' << '\n'; if (swap) { // Generate a namespace-scope swap() function if (tstruct->get_name() == "a" || tstruct->get_name() == "b") { out << indent() << "void swap(" << tstruct->get_name() << " &a1, " << tstruct->get_name() - << " &a2);" << endl << endl; + << " &a2);" << '\n' << '\n'; } else { out << indent() << "void swap(" << tstruct->get_name() << " &a, " << tstruct->get_name() - << " &b);" << endl << endl; + << " &b);" << '\n' << '\n'; } } @@ -1422,12 +1420,12 @@ void t_cpp_generator::generate_struct_definition(ostream& out, // Destructor if (tstruct->annotations_.find("final") == tstruct->annotations_.end()) { - force_cpp_out << endl << indent() << tstruct->get_name() << "::~" << tstruct->get_name() - << "() noexcept {" << endl; + force_cpp_out << '\n' << indent() << tstruct->get_name() << "::~" << tstruct->get_name() + << "() noexcept {" << '\n'; indent_up(); indent_down(); - force_cpp_out << indent() << "}" << endl << endl; + force_cpp_out << indent() << "}" << '\n' << '\n'; } if (!pointers) @@ -1442,32 +1440,32 @@ void t_cpp_generator::generate_struct_definition(ostream& out, if (setters) { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if (is_reference((*m_iter))) { - out << endl << indent() << "void " << tstruct->get_name() << "::__set_" + out << '\n' << indent() << "void " << tstruct->get_name() << "::__set_" << (*m_iter)->get_name() << "(::std::shared_ptr<" << type_name((*m_iter)->get_type(), false, false) << ">"; - out << " val) {" << endl; + out << " val) {" << '\n'; } else { - out << endl << indent() << "void " << tstruct->get_name() << "::__set_" + out << '\n' << indent() << "void " << tstruct->get_name() << "::__set_" << (*m_iter)->get_name() << "(" << type_name((*m_iter)->get_type(), false, true); - out << " val) {" << endl; + out << " val) {" << '\n'; } indent_up(); - out << indent() << "this->" << (*m_iter)->get_name() << " = val;" << endl; + out << indent() << "this->" << (*m_iter)->get_name() << " = val;" << '\n'; indent_down(); // assume all fields are required except optional fields. // for optional fields change __isset.name to true bool is_optional = (*m_iter)->get_req() == t_field::T_OPTIONAL; if (is_optional) { - out << indent() << indent() << "__isset." << (*m_iter)->get_name() << " = true;" << endl; + out << indent() << indent() << "__isset." << (*m_iter)->get_name() << " = true;" << '\n'; } - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } if (is_user_struct) { generate_struct_ostream_operator(out, tstruct); } - out << endl; + out << '\n'; } /** @@ -1478,11 +1476,11 @@ void t_cpp_generator::generate_struct_definition(ostream& out, */ void t_cpp_generator::generate_struct_reader(ostream& out, t_struct* tstruct, bool pointers) { if (gen_templates_) { - out << indent() << "template " << endl << indent() << "uint32_t " - << tstruct->get_name() << "::read(Protocol_* iprot) {" << endl; + out << indent() << "template " << '\n' << indent() << "uint32_t " + << tstruct->get_name() << "::read(Protocol_* iprot) {" << '\n'; } else { indent(out) << "uint32_t " << tstruct->get_name() - << "::read(::apache::thrift::protocol::TProtocol* iprot) {" << endl; + << "::read(::apache::thrift::protocol::TProtocol* iprot) {" << '\n'; } indent_up(); @@ -1490,49 +1488,49 @@ void t_cpp_generator::generate_struct_reader(ostream& out, t_struct* tstruct, bo vector::const_iterator f_iter; // Declare stack tmp variables - out << endl - << indent() << "::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot);" << endl - << indent() << "uint32_t xfer = 0;" << endl - << indent() << "std::string fname;" << endl - << indent() << "::apache::thrift::protocol::TType ftype;" << endl - << indent() << "int16_t fid;" << endl - << endl - << indent() << "xfer += iprot->readStructBegin(fname);" << endl - << endl - << indent() << "using ::apache::thrift::protocol::TProtocolException;" << endl - << endl; + out << '\n' + << indent() << "::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot);" << '\n' + << indent() << "uint32_t xfer = 0;" << '\n' + << indent() << "std::string fname;" << '\n' + << indent() << "::apache::thrift::protocol::TType ftype;" << '\n' + << indent() << "int16_t fid;" << '\n' + << '\n' + << indent() << "xfer += iprot->readStructBegin(fname);" << '\n' + << '\n' + << indent() << "using ::apache::thrift::protocol::TProtocolException;" << '\n' + << '\n'; // Required variables aren't in __isset, so we need tmp vars to check them. for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) - indent(out) << "bool isset_" << (*f_iter)->get_name() << " = false;" << endl; + indent(out) << "bool isset_" << (*f_iter)->get_name() << " = false;" << '\n'; } - out << endl; + out << '\n'; // Loop over reading in fields - indent(out) << "while (true)" << endl; + indent(out) << "while (true)" << '\n'; scope_up(out); // Read beginning field marker - indent(out) << "xfer += iprot->readFieldBegin(fname, ftype, fid);" << endl; + indent(out) << "xfer += iprot->readFieldBegin(fname, ftype, fid);" << '\n'; // Check for field STOP marker - out << indent() << "if (ftype == ::apache::thrift::protocol::T_STOP) {" << endl << indent() - << " break;" << endl << indent() << "}" << endl; + out << indent() << "if (ftype == ::apache::thrift::protocol::T_STOP) {" << '\n' << indent() + << " break;" << '\n' << indent() << "}" << '\n'; if (fields.empty()) { - out << indent() << "xfer += iprot->skip(ftype);" << endl; + out << indent() << "xfer += iprot->skip(ftype);" << '\n'; } else { // Switch statement on the field we are reading - indent(out) << "switch (fid)" << endl; + indent(out) << "switch (fid)" << '\n'; scope_up(out); // Generate deserialization code for known cases for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - indent(out) << "case " << (*f_iter)->get_key() << ":" << endl; + indent(out) << "case " << (*f_iter)->get_key() << ":" << '\n'; indent_up(); - indent(out) << "if (ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl; + indent(out) << "if (ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n'; indent_up(); const char* isset_prefix = ((*f_iter)->get_req() != t_field::T_REQUIRED) ? "this->__isset." @@ -1544,8 +1542,8 @@ void t_cpp_generator::generate_struct_reader(ostream& out, t_struct* tstruct, bo // TODO(dreiss): Generate this code and "if" it out to make it easier // for people recompiling thrift to include it. out << - indent() << "if (" << isset_prefix << (*f_iter)->get_name() << ")" << endl << - indent() << " throw TProtocolException(TProtocolException::INVALID_DATA);" << endl; + indent() << "if (" << isset_prefix << (*f_iter)->get_name() << ")" << '\n' << + indent() << " throw TProtocolException(TProtocolException::INVALID_DATA);" << '\n'; #endif if (pointers && !(*f_iter)->get_type()->is_xception()) { @@ -1553,44 +1551,44 @@ void t_cpp_generator::generate_struct_reader(ostream& out, t_struct* tstruct, bo } else { generate_deserialize_field(out, *f_iter, "this->"); } - out << indent() << isset_prefix << (*f_iter)->get_name() << " = true;" << endl; + out << indent() << isset_prefix << (*f_iter)->get_name() << " = true;" << '\n'; indent_down(); - out << indent() << "} else {" << endl << indent() << " xfer += iprot->skip(ftype);" << endl + out << indent() << "} else {" << '\n' << indent() << " xfer += iprot->skip(ftype);" << '\n' << // TODO(dreiss): Make this an option when thrift structs // have a common base class. - // indent() << " throw TProtocolException(TProtocolException::INVALID_DATA);" << endl << - indent() << "}" << endl << indent() << "break;" << endl; + // indent() << " throw TProtocolException(TProtocolException::INVALID_DATA);" << '\n' << + indent() << "}" << '\n' << indent() << "break;" << '\n'; indent_down(); } // In the default case we skip the field - out << indent() << "default:" << endl << indent() << " xfer += iprot->skip(ftype);" << endl - << indent() << " break;" << endl; + out << indent() << "default:" << '\n' << indent() << " xfer += iprot->skip(ftype);" << '\n' + << indent() << " break;" << '\n'; scope_down(out); } //!fields.empty() // Read field end marker - indent(out) << "xfer += iprot->readFieldEnd();" << endl; + indent(out) << "xfer += iprot->readFieldEnd();" << '\n'; scope_down(out); - out << endl << indent() << "xfer += iprot->readStructEnd();" << endl; + out << '\n' << indent() << "xfer += iprot->readStructEnd();" << '\n'; // Throw if any required fields are missing. // We do this after reading the struct end so that // there might possibly be a chance of continuing. - out << endl; + out << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) - out << indent() << "if (!isset_" << (*f_iter)->get_name() << ')' << endl << indent() - << " throw TProtocolException(TProtocolException::INVALID_DATA);" << endl; + out << indent() << "if (!isset_" << (*f_iter)->get_name() << ')' << '\n' << indent() + << " throw TProtocolException(TProtocolException::INVALID_DATA);" << '\n'; } - indent(out) << "return xfer;" << endl; + indent(out) << "return xfer;" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -1605,33 +1603,33 @@ void t_cpp_generator::generate_struct_writer(ostream& out, t_struct* tstruct, bo vector::const_iterator f_iter; if (gen_templates_) { - out << indent() << "template " << endl << indent() << "uint32_t " - << tstruct->get_name() << "::write(Protocol_* oprot) const {" << endl; + out << indent() << "template " << '\n' << indent() << "uint32_t " + << tstruct->get_name() << "::write(Protocol_* oprot) const {" << '\n'; } else { indent(out) << "uint32_t " << tstruct->get_name() - << "::write(::apache::thrift::protocol::TProtocol* oprot) const {" << endl; + << "::write(::apache::thrift::protocol::TProtocol* oprot) const {" << '\n'; } indent_up(); - out << indent() << "uint32_t xfer = 0;" << endl; + out << indent() << "uint32_t xfer = 0;" << '\n'; - indent(out) << "::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot);" << endl; - indent(out) << "xfer += oprot->writeStructBegin(\"" << name << "\");" << endl; + indent(out) << "::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot);" << '\n'; + indent(out) << "xfer += oprot->writeStructBegin(\"" << name << "\");" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool check_if_set = (*f_iter)->get_req() == t_field::T_OPTIONAL || (*f_iter)->get_type()->is_xception(); if (check_if_set) { - out << endl << indent() << "if (this->__isset." << (*f_iter)->get_name() << ") {" << endl; + out << '\n' << indent() << "if (this->__isset." << (*f_iter)->get_name() << ") {" << '\n'; indent_up(); } else { - out << endl; + out << '\n'; } // Write field header out << indent() << "xfer += oprot->writeFieldBegin(" << "\"" << (*f_iter)->get_name() << "\", " << type_to_enum((*f_iter)->get_type()) << ", " - << (*f_iter)->get_key() << ");" << endl; + << (*f_iter)->get_key() << ");" << '\n'; // Write field contents if (pointers && !(*f_iter)->get_type()->is_xception()) { generate_serialize_field(out, *f_iter, "(*(this->", "))"); @@ -1639,22 +1637,22 @@ void t_cpp_generator::generate_struct_writer(ostream& out, t_struct* tstruct, bo generate_serialize_field(out, *f_iter, "this->"); } // Write field closer - indent(out) << "xfer += oprot->writeFieldEnd();" << endl; + indent(out) << "xfer += oprot->writeFieldEnd();" << '\n'; if (check_if_set) { indent_down(); indent(out) << '}'; } } - out << endl; + out << '\n'; // Write the struct map - out << indent() << "xfer += oprot->writeFieldStop();" << endl << indent() - << "xfer += oprot->writeStructEnd();" << endl << indent() - << "return xfer;" << endl; + out << indent() << "xfer += oprot->writeFieldStop();" << '\n' << indent() + << "xfer += oprot->writeStructEnd();" << '\n' << indent() + << "return xfer;" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -1673,35 +1671,35 @@ void t_cpp_generator::generate_struct_result_writer(ostream& out, vector::const_iterator f_iter; if (gen_templates_) { - out << indent() << "template " << endl << indent() << "uint32_t " - << tstruct->get_name() << "::write(Protocol_* oprot) const {" << endl; + out << indent() << "template " << '\n' << indent() << "uint32_t " + << tstruct->get_name() << "::write(Protocol_* oprot) const {" << '\n'; } else { indent(out) << "uint32_t " << tstruct->get_name() - << "::write(::apache::thrift::protocol::TProtocol* oprot) const {" << endl; + << "::write(::apache::thrift::protocol::TProtocol* oprot) const {" << '\n'; } indent_up(); - out << endl << indent() << "uint32_t xfer = 0;" << endl << endl; + out << '\n' << indent() << "uint32_t xfer = 0;" << '\n' << '\n'; - indent(out) << "xfer += oprot->writeStructBegin(\"" << name << "\");" << endl; + indent(out) << "xfer += oprot->writeStructBegin(\"" << name << "\");" << '\n'; bool first = true; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if (first) { first = false; - out << endl << indent() << "if "; + out << '\n' << indent() << "if "; } else { out << " else if "; } - out << "(this->__isset." << (*f_iter)->get_name() << ") {" << endl; + out << "(this->__isset." << (*f_iter)->get_name() << ") {" << '\n'; indent_up(); // Write field header out << indent() << "xfer += oprot->writeFieldBegin(" << "\"" << (*f_iter)->get_name() << "\", " << type_to_enum((*f_iter)->get_type()) << ", " - << (*f_iter)->get_key() << ");" << endl; + << (*f_iter)->get_key() << ");" << '\n'; // Write field contents if (pointers) { generate_serialize_field(out, *f_iter, "(*(this->", "))"); @@ -1709,18 +1707,18 @@ void t_cpp_generator::generate_struct_result_writer(ostream& out, generate_serialize_field(out, *f_iter, "this->"); } // Write field closer - indent(out) << "xfer += oprot->writeFieldEnd();" << endl; + indent(out) << "xfer += oprot->writeFieldEnd();" << '\n'; indent_down(); indent(out) << "}"; } // Write the struct map - out << endl << indent() << "xfer += oprot->writeFieldStop();" << endl << indent() - << "xfer += oprot->writeStructEnd();" << endl << indent() << "return xfer;" << endl; + out << '\n' << indent() << "xfer += oprot->writeFieldStop();" << '\n' << indent() + << "xfer += oprot->writeStructEnd();" << '\n' << indent() << "return xfer;" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -1732,10 +1730,10 @@ void t_cpp_generator::generate_struct_result_writer(ostream& out, void t_cpp_generator::generate_struct_swap(ostream& out, t_struct* tstruct) { if (tstruct->get_name() == "a" || tstruct->get_name() == "b") { out << indent() << "void swap(" << tstruct->get_name() << " &a1, " << tstruct->get_name() - << " &a2) {" << endl; + << " &a2) {" << '\n'; } else { out << indent() << "void swap(" << tstruct->get_name() << " &a, " << tstruct->get_name() - << " &b) {" << endl; + << " &b) {" << '\n'; } indent_up(); @@ -1743,7 +1741,7 @@ void t_cpp_generator::generate_struct_swap(ostream& out, t_struct* tstruct) { // Let argument-dependent name lookup find the correct swap() function to // use based on the argument types. If none is found in the arguments' // namespaces, fall back to ::std::swap(). - out << indent() << "using ::std::swap;" << endl; + out << indent() << "using ::std::swap;" << '\n'; bool has_nonrequired_fields = false; const vector& fields = tstruct->get_members(); @@ -1754,41 +1752,41 @@ void t_cpp_generator::generate_struct_swap(ostream& out, t_struct* tstruct) { if (tstruct->get_name() == "a" || tstruct->get_name() == "b") { out << indent() << "swap(a1." << tfield->get_name() << ", a2." << tfield->get_name() << ");" - << endl; + << '\n'; } else { out << indent() << "swap(a." << tfield->get_name() << ", b." << tfield->get_name() << ");" - << endl; + << '\n'; } } if (has_nonrequired_fields) { if (tstruct->get_name() == "a" || tstruct->get_name() == "b") { - out << indent() << "swap(a1.__isset, a2.__isset);" << endl; + out << indent() << "swap(a1.__isset, a2.__isset);" << '\n'; } else { - out << indent() << "swap(a.__isset, b.__isset);" << endl; + out << indent() << "swap(a.__isset, b.__isset);" << '\n'; } } // handle empty structs if (fields.size() == 0) { if (tstruct->get_name() == "a" || tstruct->get_name() == "b") { - out << indent() << "(void) a1;" << endl; - out << indent() << "(void) a2;" << endl; + out << indent() << "(void) a1;" << '\n'; + out << indent() << "(void) a2;" << '\n'; } else { - out << indent() << "(void) a;" << endl; - out << indent() << "(void) b;" << endl; + out << indent() << "(void) a;" << '\n'; + out << indent() << "(void) b;" << '\n'; } } scope_down(out); - out << endl; + out << '\n'; } void t_cpp_generator::generate_struct_ostream_operator_decl(std::ostream& out, t_struct* tstruct) { out << "std::ostream& operator<<(std::ostream& out, const " << tstruct->get_name() - << "& obj);" << endl; - out << endl; + << "& obj);" << '\n'; + out << '\n'; } void t_cpp_generator::generate_struct_ostream_operator(std::ostream& out, t_struct* tstruct) { @@ -1796,12 +1794,12 @@ void t_cpp_generator::generate_struct_ostream_operator(std::ostream& out, t_stru // thrift defines this behavior out << "std::ostream& operator<<(std::ostream& out, const " << tstruct->get_name() - << "& obj)" << endl; + << "& obj)" << '\n'; scope_up(out); - out << indent() << "obj.printTo(out);" << endl - << indent() << "return out;" << endl; + out << indent() << "obj.printTo(out);" << '\n' + << indent() << "return out;" << '\n'; scope_down(out); - out << endl; + out << '\n'; } } @@ -1866,7 +1864,7 @@ void generate_fields(std::ostream& out, } generate_field(out, *it); - out << ";" << endl; + out << ";" << '\n'; } } } @@ -1877,17 +1875,17 @@ void generate_fields(std::ostream& out, void t_cpp_generator::generate_struct_print_method(std::ostream& out, t_struct* tstruct) { out << indent(); generate_struct_print_method_decl(out, tstruct); - out << " {" << endl; + out << " {" << '\n'; indent_up(); - out << indent() << "using ::apache::thrift::to_string;" << endl; - out << indent() << "out << \"" << tstruct->get_name() << "(\";" << endl; + out << indent() << "using ::apache::thrift::to_string;" << '\n'; + out << indent() << "out << \"" << tstruct->get_name() << "(\";" << '\n'; struct_ostream_operator_generator::generate_fields(out, tstruct->get_members(), indent()); - out << indent() << "out << \")\";" << endl; + out << indent() << "out << \")\";" << '\n'; indent_down(); - out << "}" << endl << endl; + out << "}" << '\n' << '\n'; } /** @@ -1896,29 +1894,29 @@ void t_cpp_generator::generate_struct_print_method(std::ostream& out, t_struct* void t_cpp_generator::generate_exception_what_method(std::ostream& out, t_struct* tstruct) { out << indent(); generate_exception_what_method_decl(out, tstruct, true); - out << " {" << endl; + out << " {" << '\n'; indent_up(); - out << indent() << "try {" << endl; + out << indent() << "try {" << '\n'; indent_up(); - out << indent() << "std::stringstream ss;" << endl; - out << indent() << "ss << \"TException - service has thrown: \" << *this;" << endl; - out << indent() << "this->thriftTExceptionMessageHolder_ = ss.str();" << endl; - out << indent() << "return this->thriftTExceptionMessageHolder_.c_str();" << endl; + out << indent() << "std::stringstream ss;" << '\n'; + out << indent() << "ss << \"TException - service has thrown: \" << *this;" << '\n'; + out << indent() << "this->thriftTExceptionMessageHolder_ = ss.str();" << '\n'; + out << indent() << "return this->thriftTExceptionMessageHolder_.c_str();" << '\n'; indent_down(); - out << indent() << "} catch (const std::exception&) {" << endl; + out << indent() << "} catch (const std::exception&) {" << '\n'; indent_up(); out << indent() << "return \"TException - service has thrown: " << tstruct->get_name() << "\";" - << endl; + << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << "}" << endl << endl; + out << "}" << '\n' << '\n'; } /** @@ -1938,30 +1936,30 @@ void t_cpp_generator::generate_service(t_service* tservice) { // Print header file includes f_header_ << autogen_comment(); - f_header_ << "#ifndef " << svcname << "_H" << endl << "#define " << svcname << "_H" << endl - << endl; + f_header_ << "#ifndef " << svcname << "_H" << '\n' << "#define " << svcname << "_H" << '\n' + << '\n'; if (gen_cob_style_) { - f_header_ << "#include " << endl // TMemoryBuffer - << "#include " << endl - << "namespace apache { namespace thrift { namespace async {" << endl - << "class TAsyncChannel;" << endl << "}}}" << endl; + f_header_ << "#include " << '\n' // TMemoryBuffer + << "#include " << '\n' + << "namespace apache { namespace thrift { namespace async {" << '\n' + << "class TAsyncChannel;" << '\n' << "}}}" << '\n'; } - f_header_ << "#include " << endl; + f_header_ << "#include " << '\n'; if (gen_cob_style_) { - f_header_ << "#include " << endl; + f_header_ << "#include " << '\n'; } - f_header_ << "#include " << endl; - f_header_ << "#include " << endl; + f_header_ << "#include " << '\n'; + f_header_ << "#include " << '\n'; f_header_ << "#include \"" << get_include_prefix(*get_program()) << program_name_ << "_types.h\"" - << endl; + << '\n'; t_service* extends_service = tservice->get_extends(); if (extends_service != nullptr) { f_header_ << "#include \"" << get_include_prefix(*(extends_service->get_program())) - << extends_service->get_name() << ".h\"" << endl; + << extends_service->get_name() << ".h\"" << '\n'; } - f_header_ << endl << ns_open_ << endl << endl; + f_header_ << '\n' << ns_open_ << '\n' << '\n'; f_header_ << "#ifdef _MSC_VER\n" " #pragma warning( push )\n" @@ -1972,30 +1970,30 @@ void t_cpp_generator::generate_service(t_service* tservice) { string f_service_name = get_out_dir() + svcname + ".cpp"; f_service_.open(f_service_name.c_str()); f_service_ << autogen_comment(); - f_service_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" << endl; + f_service_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" << '\n'; if (gen_cob_style_) { - f_service_ << "#include \"thrift/async/TAsyncChannel.h\"" << endl; + f_service_ << "#include \"thrift/async/TAsyncChannel.h\"" << '\n'; } if (gen_templates_) { f_service_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".tcc\"" - << endl; + << '\n'; string f_service_tcc_name = get_out_dir() + svcname + ".tcc"; f_service_tcc_.open(f_service_tcc_name.c_str()); f_service_tcc_ << autogen_comment(); f_service_tcc_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" - << endl; + << '\n'; - f_service_tcc_ << "#ifndef " << svcname << "_TCC" << endl << "#define " << svcname << "_TCC" - << endl << endl; + f_service_tcc_ << "#ifndef " << svcname << "_TCC" << '\n' << "#define " << svcname << "_TCC" + << '\n' << '\n'; if (gen_cob_style_) { - f_service_tcc_ << "#include \"thrift/async/TAsyncChannel.h\"" << endl; + f_service_tcc_ << "#include \"thrift/async/TAsyncChannel.h\"" << '\n'; } } - f_service_ << endl << ns_open_ << endl << endl; - f_service_tcc_ << endl << ns_open_ << endl << endl; + f_service_ << '\n' << ns_open_ << '\n' << '\n'; + f_service_tcc_ << '\n' << ns_open_ << '\n' << '\n'; // Generate all the components generate_service_interface(tservice, ""); @@ -2032,19 +2030,19 @@ void t_cpp_generator::generate_service(t_service* tservice) { "#endif\n\n"; // Close the namespace - f_service_ << ns_close_ << endl << endl; - f_service_tcc_ << ns_close_ << endl << endl; - f_header_ << ns_close_ << endl << endl; + f_service_ << ns_close_ << '\n' << '\n'; + f_service_tcc_ << ns_close_ << '\n' << '\n'; + f_header_ << ns_close_ << '\n' << '\n'; // TODO(simpkins): Make this a separate option if (gen_templates_) { - f_header_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".tcc\"" << endl + f_header_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".tcc\"" << '\n' << "#include \"" << get_include_prefix(*get_program()) << program_name_ - << "_types.tcc\"" << endl << endl; + << "_types.tcc\"" << '\n' << '\n'; } - f_header_ << "#endif" << endl; - f_service_tcc_ << "#endif" << endl; + f_header_ << "#endif" << '\n'; + f_service_tcc_ << "#endif" << '\n'; // Close the files f_service_tcc_.close(); @@ -2098,9 +2096,9 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty if (gen_templates_) { client_name += "T"; service_if_name += "T"; - indent(f_header_) << "template " << endl; + indent(f_header_) << "template " << '\n'; } - indent(f_header_) << "class " << client_name << ";" << endl << endl; + indent(f_header_) << "class " << client_name << ";" << '\n' << '\n'; } string extends = ""; @@ -2114,31 +2112,31 @@ void t_cpp_generator::generate_service_interface(t_service* tservice, string sty } if (style == "CobCl" && gen_templates_) { - f_header_ << "template " << endl; + f_header_ << "template " << '\n'; } generate_java_doc(f_header_, tservice); - f_header_ << "class " << service_if_name << extends << " {" << endl << " public:" << endl; + f_header_ << "class " << service_if_name << extends << " {" << '\n' << " public:" << '\n'; indent_up(); - f_header_ << indent() << "virtual ~" << service_if_name << "() {}" << endl; + f_header_ << indent() << "virtual ~" << service_if_name << "() {}" << '\n'; vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { if ((*f_iter)->has_doc()) - f_header_ << endl; + f_header_ << '\n'; generate_java_doc(f_header_, *f_iter); - f_header_ << indent() << "virtual " << function_signature(*f_iter, style) << " = 0;" << endl; + f_header_ << indent() << "virtual " << function_signature(*f_iter, style) << " = 0;" << '\n'; } indent_down(); - f_header_ << "};" << endl << endl; + f_header_ << "};" << '\n' << '\n'; if (style == "CobCl" && gen_templates_) { // generate a backwards-compatible typedef for clients that do not // know about the new template-style code f_header_ << "typedef " << service_if_name << "< ::apache::thrift::protocol::TProtocol> " - << service_name_ << style << "If;" << endl << endl; + << service_name_ << style << "If;" << '\n' << '\n'; } } @@ -2181,37 +2179,37 @@ void t_cpp_generator::generate_service_interface_factory(t_service* tservice, st extends = " : virtual public " + type_name(tservice->get_extends()) + style + "IfFactory"; } - f_header_ << "class " << factory_name << extends << " {" << endl << " public:" << endl; + f_header_ << "class " << factory_name << extends << " {" << '\n' << " public:" << '\n'; indent_up(); - f_header_ << indent() << "typedef " << service_if_name << " Handler;" << endl << endl << indent() - << "virtual ~" << factory_name << "() {}" << endl << endl << indent() << "virtual " + f_header_ << indent() << "typedef " << service_if_name << " Handler;" << '\n' << '\n' << indent() + << "virtual ~" << factory_name << "() {}" << '\n' << '\n' << indent() << "virtual " << service_if_name << "* getHandler(" << "const ::apache::thrift::TConnectionInfo& connInfo)" - << (extends.empty() ? "" : " override") << " = 0;" << endl << indent() + << (extends.empty() ? "" : " override") << " = 0;" << '\n' << indent() << "virtual void releaseHandler(" << base_if_name << "* /* handler */)" - << (extends.empty() ? "" : " override") << " = 0;" << endl << indent(); + << (extends.empty() ? "" : " override") << " = 0;" << '\n' << indent(); indent_down(); - f_header_ << "};" << endl << endl; + f_header_ << "};" << '\n' << '\n'; // Generate the singleton factory class string singleton_factory_name = service_if_name + "SingletonFactory"; f_header_ << "class " << singleton_factory_name << " : virtual public " << factory_name << " {" - << endl << " public:" << endl; + << '\n' << " public:" << '\n'; indent_up(); f_header_ << indent() << singleton_factory_name << "(const ::std::shared_ptr<" << service_if_name - << ">& iface) : iface_(iface) {}" << endl << indent() << "virtual ~" - << singleton_factory_name << "() {}" << endl << endl << indent() << "virtual " + << ">& iface) : iface_(iface) {}" << '\n' << indent() << "virtual ~" + << singleton_factory_name << "() {}" << '\n' << '\n' << indent() << "virtual " << service_if_name << "* getHandler(" - << "const ::apache::thrift::TConnectionInfo&) override {" << endl << indent() - << " return iface_.get();" << endl << indent() << "}" << endl << indent() - << "virtual void releaseHandler(" << base_if_name << "* /* handler */) override {}" << endl; + << "const ::apache::thrift::TConnectionInfo&) override {" << '\n' << indent() + << " return iface_.get();" << '\n' << indent() << "}" << '\n' << indent() + << "virtual void releaseHandler(" << base_if_name << "* /* handler */) override {}" << '\n'; - f_header_ << endl << " protected:" << endl << indent() << "::std::shared_ptr<" << service_if_name - << "> iface_;" << endl; + f_header_ << '\n' << " protected:" << '\n' << indent() << "::std::shared_ptr<" << service_if_name + << "> iface_;" << '\n'; indent_down(); - f_header_ << "};" << endl << endl; + f_header_ << "};" << '\n' << '\n'; } /** @@ -2225,14 +2223,14 @@ void t_cpp_generator::generate_service_null(t_service* tservice, string style) { extends = " , virtual public " + type_name(tservice->get_extends()) + style + "Null"; } f_header_ << "class " << service_name_ << style << "Null : virtual public " << service_name_ - << style << "If" << extends << " {" << endl << " public:" << endl; + << style << "If" << extends << " {" << '\n' << " public:" << '\n'; indent_up(); - f_header_ << indent() << "virtual ~" << service_name_ << style << "Null() {}" << endl; + f_header_ << indent() << "virtual ~" << service_name_ << style << "Null() {}" << '\n'; vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { f_header_ << indent() << function_signature(*f_iter, style, "", false) - << " override {" << endl; + << " override {" << '\n'; indent_up(); t_type* returntype = (*f_iter)->get_returntype(); @@ -2240,18 +2238,18 @@ void t_cpp_generator::generate_service_null(t_service* tservice, string style) { if (style == "") { if (returntype->is_void() || is_complex_type(returntype)) { - f_header_ << indent() << "return;" << endl; + f_header_ << indent() << "return;" << '\n'; } else { - f_header_ << indent() << declare_field(&returnfield, true) << endl << indent() - << "return _return;" << endl; + f_header_ << indent() << declare_field(&returnfield, true) << '\n' << indent() + << "return _return;" << '\n'; } } else if (style == "CobSv") { if (returntype->is_void()) { - f_header_ << indent() << "return cob();" << endl; + f_header_ << indent() << "return cob();" << '\n'; } else { t_field returnfield(returntype, "_return"); - f_header_ << indent() << declare_field(&returnfield, true) << endl << indent() - << "return cob(_return);" << endl; + f_header_ << indent() << declare_field(&returnfield, true) << '\n' << indent() + << "return cob(_return);" << '\n'; } } else { @@ -2259,10 +2257,10 @@ void t_cpp_generator::generate_service_null(t_service* tservice, string style) { } indent_down(); - f_header_ << indent() << "}" << endl; + f_header_ << indent() << "}" << '\n'; } indent_down(); - f_header_ << "};" << endl << endl; + f_header_ << "};" << '\n' << '\n'; } void t_cpp_generator::generate_function_call(ostream& out, @@ -2293,7 +2291,7 @@ void t_cpp_generator::generate_function_call(ostream& out, } out << arg_prefix << (*f_iter)->get_name(); } - out << ");" << endl; + out << ");" << '\n'; } void t_cpp_generator::generate_service_async_skeleton(t_service* tservice) { @@ -2307,58 +2305,58 @@ void t_cpp_generator::generate_service_async_skeleton(t_service* tservice) { ofstream_with_content_based_conditional_update f_skeleton; f_skeleton.open(f_skeleton_name.c_str()); f_skeleton << "// This autogenerated skeleton file illustrates one way to adapt a synchronous" - << endl << "// interface into an asynchronous interface. You should copy it to another" - << endl + << '\n' << "// interface into an asynchronous interface. You should copy it to another" + << '\n' << "// filename to avoid overwriting it and rewrite as asynchronous any functions" - << endl << "// that would otherwise introduce unwanted latency." << endl << endl - << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" << endl - << "#include " << endl - << "#include " << endl - << "#include " << endl - << "#include " << endl - << "#include " << endl << endl - << "using namespace ::apache::thrift;" << endl - << "using namespace ::apache::thrift::protocol;" << endl - << "using namespace ::apache::thrift::transport;" << endl - << "using namespace ::apache::thrift::async;" << endl << endl; + << '\n' << "// that would otherwise introduce unwanted latency." << '\n' << '\n' + << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" << '\n' + << "#include " << '\n' + << "#include " << '\n' + << "#include " << '\n' + << "#include " << '\n' + << "#include " << '\n' << '\n' + << "using namespace ::apache::thrift;" << '\n' + << "using namespace ::apache::thrift::protocol;" << '\n' + << "using namespace ::apache::thrift::transport;" << '\n' + << "using namespace ::apache::thrift::async;" << '\n' << '\n'; // the following code would not compile: // using namespace ; // using namespace ::; if ((!ns.empty()) && (ns.compare(" ::") != 0)) { - f_skeleton << "using namespace " << string(ns, 0, ns.size() - 2) << ";" << endl << endl; + f_skeleton << "using namespace " << string(ns, 0, ns.size() - 2) << ";" << '\n' << '\n'; } - f_skeleton << "class " << svcname << "Handler : virtual public " << svcname << "If {" << endl - << " public:" << endl; + f_skeleton << "class " << svcname << "Handler : virtual public " << svcname << "If {" << '\n' + << " public:" << '\n'; indent_up(); - f_skeleton << indent() << svcname << "Handler() {" << endl << indent() - << " // Your initialization goes here" << endl << indent() << "}" << endl << endl; + f_skeleton << indent() << svcname << "Handler() {" << '\n' << indent() + << " // Your initialization goes here" << '\n' << indent() << "}" << '\n' << '\n'; vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_java_doc(f_skeleton, *f_iter); - f_skeleton << indent() << function_signature(*f_iter, "") << " {" << endl << indent() - << " // Your implementation goes here" << endl << indent() << " printf(\"" - << (*f_iter)->get_name() << "\\n\");" << endl << indent() << "}" << endl << endl; + f_skeleton << indent() << function_signature(*f_iter, "") << " {" << '\n' << indent() + << " // Your implementation goes here" << '\n' << indent() << " printf(\"" + << (*f_iter)->get_name() << "\\n\");" << '\n' << indent() << "}" << '\n' << '\n'; } indent_down(); - f_skeleton << "};" << endl << endl; + f_skeleton << "};" << '\n' << '\n'; f_skeleton << "class " << svcname << "AsyncHandler : " - << "public " << svcname << "CobSvIf {" << endl << " public:" << endl; + << "public " << svcname << "CobSvIf {" << '\n' << " public:" << '\n'; indent_up(); - f_skeleton << indent() << svcname << "AsyncHandler() {" << endl << indent() + f_skeleton << indent() << svcname << "AsyncHandler() {" << '\n' << indent() << " syncHandler_ = std::unique_ptr<" << svcname << "Handler>(new " << svcname - << "Handler);" << endl << indent() << " // Your initialization goes here" << endl - << indent() << "}" << endl; - f_skeleton << indent() << "virtual ~" << service_name_ << "AsyncHandler();" << endl; + << "Handler);" << '\n' << indent() << " // Your initialization goes here" << '\n' + << indent() << "}" << '\n'; + f_skeleton << indent() << "virtual ~" << service_name_ << "AsyncHandler();" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { - f_skeleton << endl << indent() << function_signature(*f_iter, "CobSv", "", true) << " {" - << endl; + f_skeleton << '\n' << indent() << function_signature(*f_iter, "CobSv", "", true) << " {" + << '\n'; indent_up(); t_type* returntype = (*f_iter)->get_returntype(); @@ -2366,32 +2364,32 @@ void t_cpp_generator::generate_service_async_skeleton(t_service* tservice) { string target = returntype->is_void() ? "" : "_return"; if (!returntype->is_void()) { - f_skeleton << indent() << declare_field(&returnfield, true) << endl; + f_skeleton << indent() << declare_field(&returnfield, true) << '\n'; } generate_function_call(f_skeleton, *f_iter, target, "syncHandler_", ""); - f_skeleton << indent() << "return cob(" << target << ");" << endl; + f_skeleton << indent() << "return cob(" << target << ");" << '\n'; scope_down(f_skeleton); } - f_skeleton << endl << " protected:" << endl << indent() << "std::unique_ptr<" << svcname - << "Handler> syncHandler_;" << endl; + f_skeleton << '\n' << " protected:" << '\n' << indent() << "std::unique_ptr<" << svcname + << "Handler> syncHandler_;" << '\n'; indent_down(); - f_skeleton << "};" << endl << endl; + f_skeleton << "};" << '\n' << '\n'; - f_skeleton << indent() << "int main(int argc, char **argv) {" << endl; + f_skeleton << indent() << "int main(int argc, char **argv) {" << '\n'; indent_up(); f_skeleton - << indent() << "int port = 9090;" << endl << indent() << "::std::shared_ptr<" << svcname - << "AsyncHandler> handler(new " << svcname << "AsyncHandler());" << endl << indent() - << "::std::shared_ptr<" << svcname << "AsyncProcessor> processor(new " << svcname << "AsyncProcessor(handler));" << endl + << indent() << "int port = 9090;" << '\n' << indent() << "::std::shared_ptr<" << svcname + << "AsyncHandler> handler(new " << svcname << "AsyncHandler());" << '\n' << indent() + << "::std::shared_ptr<" << svcname << "AsyncProcessor> processor(new " << svcname << "AsyncProcessor(handler));" << '\n' << indent() << "::std::shared_ptr protocolFactory(new TBinaryProtocolFactory());" - << endl + << '\n' << indent() << "::std::shared_ptr protocolProcessor(new TAsyncProtocolProcessor(processor, protocolFactory));" - << endl << endl << indent() + << '\n' << '\n' << indent() << "TEvhttpServer server(protocolProcessor, port);" - << endl << indent() << "server.serve();" << endl << indent() << "return 0;" << endl; + << '\n' << indent() << "server.serve();" << '\n' << indent() << "return 0;" << '\n'; indent_down(); - f_skeleton << "}" << endl << endl; + f_skeleton << "}" << '\n' << '\n'; } /** @@ -2417,35 +2415,35 @@ void t_cpp_generator::generate_service_multiface(t_service* tservice) { // Generate the header portion f_header_ << "class " << service_name_ << "Multiface : " - << "virtual public " << service_name_ << "If" << extends_multiface << " {" << endl - << " public:" << endl; + << "virtual public " << service_name_ << "If" << extends_multiface << " {" << '\n' + << " public:" << '\n'; indent_up(); f_header_ << indent() << service_name_ << "Multiface(" << list_type - << "& ifaces) : ifaces_(ifaces) {" << endl; + << "& ifaces) : ifaces_(ifaces) {" << '\n'; if (!extends.empty()) { f_header_ << indent() << " std::vector >::iterator iter;" - << endl << indent() << " for (iter = ifaces.begin(); iter != ifaces.end(); ++iter) {" - << endl << indent() << " " << extends << "Multiface::add(*iter);" << endl - << indent() << " }" << endl; + << '\n' << indent() << " for (iter = ifaces.begin(); iter != ifaces.end(); ++iter) {" + << '\n' << indent() << " " << extends << "Multiface::add(*iter);" << '\n' + << indent() << " }" << '\n'; } - f_header_ << indent() << "}" << endl << indent() << "virtual ~" << service_name_ - << "Multiface() {}" << endl; + f_header_ << indent() << "}" << '\n' << indent() << "virtual ~" << service_name_ + << "Multiface() {}" << '\n'; indent_down(); // Protected data members - f_header_ << " protected:" << endl; + f_header_ << " protected:" << '\n'; indent_up(); - f_header_ << indent() << list_type << " ifaces_;" << endl << indent() << service_name_ - << "Multiface() {}" << endl << indent() << "void add(::std::shared_ptr<" - << service_name_ << "If> iface) {" << endl; + f_header_ << indent() << list_type << " ifaces_;" << '\n' << indent() << service_name_ + << "Multiface() {}" << '\n' << indent() << "void add(::std::shared_ptr<" + << service_name_ << "If> iface) {" << '\n'; if (!extends.empty()) { - f_header_ << indent() << " " << extends << "Multiface::add(iface);" << endl; + f_header_ << indent() << " " << extends << "Multiface::add(iface);" << '\n'; } - f_header_ << indent() << " ifaces_.push_back(iface);" << endl << indent() << "}" << endl; + f_header_ << indent() << " ifaces_.push_back(iface);" << '\n' << indent() << "}" << '\n'; indent_down(); - f_header_ << indent() << " public:" << endl; + f_header_ << indent() << " public:" << '\n'; indent_up(); for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -2470,31 +2468,31 @@ void t_cpp_generator::generate_service_multiface(t_service* tservice) { } call += ")"; - f_header_ << indent() << function_signature(*f_iter, "") << " override {" << endl; + f_header_ << indent() << function_signature(*f_iter, "") << " override {" << '\n'; indent_up(); - f_header_ << indent() << "size_t sz = ifaces_.size();" << endl << indent() << "size_t i = 0;" - << endl << indent() << "for (; i < (sz - 1); ++i) {" << endl; + f_header_ << indent() << "size_t sz = ifaces_.size();" << '\n' << indent() << "size_t i = 0;" + << '\n' << indent() << "for (; i < (sz - 1); ++i) {" << '\n'; indent_up(); - f_header_ << indent() << call << ";" << endl; + f_header_ << indent() << call << ";" << '\n'; indent_down(); - f_header_ << indent() << "}" << endl; + f_header_ << indent() << "}" << '\n'; if (!(*f_iter)->get_returntype()->is_void()) { if (is_complex_type((*f_iter)->get_returntype())) { - f_header_ << indent() << call << ";" << endl << indent() << "return;" << endl; + f_header_ << indent() << call << ";" << '\n' << indent() << "return;" << '\n'; } else { - f_header_ << indent() << "return " << call << ";" << endl; + f_header_ << indent() << "return " << call << ";" << '\n'; } } else { - f_header_ << indent() << call << ";" << endl; + f_header_ << indent() << call << ";" << '\n'; } indent_down(); - f_header_ << indent() << "}" << endl << endl; + f_header_ << indent() << "}" << '\n' << '\n'; } indent_down(); - f_header_ << indent() << "};" << endl << endl; + f_header_ << indent() << "};" << '\n' << '\n'; } /** @@ -2545,7 +2543,7 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) f_header_ << template_header << "class " << service_name_ << style << "Client" << short_suffix << " : " << "virtual public " << service_name_ << ifstyle << if_suffix << extends_client << " {" - << endl << " public:" << endl; + << '\n' << " public:" << '\n'; indent_up(); if (style != "Cob") { @@ -2558,18 +2556,18 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) if (extends.empty()) { if (style == "Concurrent") { - f_header_ << ": sync_(sync)" << endl; + f_header_ << ": sync_(sync)" << '\n'; } - f_header_ << "{" << endl; - f_header_ << indent() << " setProtocol" << short_suffix << "(prot);" << endl << indent() - << "}" << endl; + f_header_ << "{" << '\n'; + f_header_ << indent() << " setProtocol" << short_suffix << "(prot);" << '\n' << indent() + << "}" << '\n'; } else { - f_header_ << ":" << endl; + f_header_ << ":" << '\n'; f_header_ << indent() << " " << extends << style << client_suffix << "(prot, prot"; if (style == "Concurrent") { f_header_ << ", sync"; } - f_header_ << ") {}" << endl; + f_header_ << ") {}" << '\n'; } f_header_ << indent() << service_name_ << style << "Client" << short_suffix << "(" << prot_ptr @@ -2581,38 +2579,38 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) if (extends.empty()) { if (style == "Concurrent") { - f_header_ << ": sync_(sync)" << endl; + f_header_ << ": sync_(sync)" << '\n'; } - f_header_ << "{" << endl; - f_header_ << indent() << " setProtocol" << short_suffix << "(iprot,oprot);" << endl - << indent() << "}" << endl; + f_header_ << "{" << '\n'; + f_header_ << indent() << " setProtocol" << short_suffix << "(iprot,oprot);" << '\n' + << indent() << "}" << '\n'; } else { f_header_ << ":" << indent() << " " << extends << style << client_suffix << "(iprot, oprot"; if (style == "Concurrent") { f_header_ << ", sync"; } - f_header_ << ") {}" << endl; + f_header_ << ") {}" << '\n'; } // create the setProtocol methods if (extends.empty()) { - f_header_ << " private:" << endl; + f_header_ << " private:" << '\n'; // 1: one parameter f_header_ << indent() << "void setProtocol" << short_suffix << "(" << prot_ptr << " prot) {" - << endl; - f_header_ << indent() << "setProtocol" << short_suffix << "(prot,prot);" << endl; - f_header_ << indent() << "}" << endl; + << '\n'; + f_header_ << indent() << "setProtocol" << short_suffix << "(prot,prot);" << '\n'; + f_header_ << indent() << "}" << '\n'; // 2: two parameter f_header_ << indent() << "void setProtocol" << short_suffix << "(" << prot_ptr << " iprot, " - << prot_ptr << " oprot) {" << endl; + << prot_ptr << " oprot) {" << '\n'; - f_header_ << indent() << " piprot_=iprot;" << endl << indent() << " poprot_=oprot;" << endl - << indent() << " iprot_ = iprot.get();" << endl << indent() - << " oprot_ = oprot.get();" << endl; + f_header_ << indent() << " piprot_=iprot;" << '\n' << indent() << " poprot_=oprot;" << '\n' + << indent() << " iprot_ = iprot.get();" << '\n' << indent() + << " oprot_ = oprot.get();" << '\n'; - f_header_ << indent() << "}" << endl; - f_header_ << " public:" << endl; + f_header_ << indent() << "}" << '\n'; + f_header_ << " public:" << '\n'; } // Generate getters for the protocols. @@ -2620,45 +2618,45 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) // TODO(simpkins): should they be templated? f_header_ << indent() << "std::shared_ptr< ::apache::thrift::protocol::TProtocol> getInputProtocol() {" - << endl << indent() << " return " << _this << "piprot_;" << endl << indent() << "}" - << endl; + << '\n' << indent() << " return " << _this << "piprot_;" << '\n' << indent() << "}" + << '\n'; f_header_ << indent() << "std::shared_ptr< ::apache::thrift::protocol::TProtocol> getOutputProtocol() {" - << endl << indent() << " return " << _this << "poprot_;" << endl << indent() << "}" - << endl; + << '\n' << indent() << " return " << _this << "poprot_;" << '\n' << indent() << "}" + << '\n'; } else /* if (style == "Cob") */ { f_header_ << indent() << service_name_ << style << "Client" << short_suffix << "(" << "std::shared_ptr< ::apache::thrift::async::TAsyncChannel> channel, " - << "::apache::thrift::protocol::TProtocolFactory* protocolFactory) :" << endl; + << "::apache::thrift::protocol::TProtocolFactory* protocolFactory) :" << '\n'; if (extends.empty()) { - f_header_ << indent() << " channel_(channel)," << endl << indent() - << " itrans_(new ::apache::thrift::transport::TMemoryBuffer())," << endl + f_header_ << indent() << " channel_(channel)," << '\n' << indent() + << " itrans_(new ::apache::thrift::transport::TMemoryBuffer())," << '\n' << indent() << " otrans_(new ::apache::thrift::transport::TMemoryBuffer())," - << endl; + << '\n'; if (gen_templates_) { // TProtocolFactory classes return generic TProtocol pointers. // We have to dynamic cast to the Protocol_ type we are expecting. f_header_ << indent() << " piprot_(::std::dynamic_pointer_cast(" - << "protocolFactory->getProtocol(itrans_)))," << endl << indent() + << "protocolFactory->getProtocol(itrans_)))," << '\n' << indent() << " poprot_(::std::dynamic_pointer_cast(" - << "protocolFactory->getProtocol(otrans_))) {" << endl; + << "protocolFactory->getProtocol(otrans_))) {" << '\n'; // Throw a TException if either dynamic cast failed. - f_header_ << indent() << " if (!piprot_ || !poprot_) {" << endl << indent() + f_header_ << indent() << " if (!piprot_ || !poprot_) {" << '\n' << indent() << " throw ::apache::thrift::TException(\"" << "TProtocolFactory returned unexpected protocol type in " << service_name_ - << style << "Client" << short_suffix << " constructor\");" << endl << indent() - << " }" << endl; + << style << "Client" << short_suffix << " constructor\");" << '\n' << indent() + << " }" << '\n'; } else { - f_header_ << indent() << " piprot_(protocolFactory->getProtocol(itrans_))," << endl - << indent() << " poprot_(protocolFactory->getProtocol(otrans_)) {" << endl; + f_header_ << indent() << " piprot_(protocolFactory->getProtocol(itrans_))," << '\n' + << indent() << " poprot_(protocolFactory->getProtocol(otrans_)) {" << '\n'; } - f_header_ << indent() << " iprot_ = piprot_.get();" << endl << indent() - << " oprot_ = poprot_.get();" << endl << indent() << "}" << endl; + f_header_ << indent() << " iprot_ = piprot_.get();" << '\n' << indent() + << " oprot_ = poprot_.get();" << '\n' << indent() << "}" << '\n'; } else { f_header_ << indent() << " " << extends << style << client_suffix - << "(channel, protocolFactory) {}" << endl; + << "(channel, protocolFactory) {}" << '\n'; } } @@ -2666,10 +2664,10 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) generate_java_doc(f_header_, tservice); f_header_ << indent() - << "::std::shared_ptr< ::apache::thrift::async::TAsyncChannel> getChannel() {" << endl - << indent() << " return " << _this << "channel_;" << endl << indent() << "}" << endl; + << "::std::shared_ptr< ::apache::thrift::async::TAsyncChannel> getChannel() {" << '\n' + << indent() << " return " << _this << "channel_;" << '\n' << indent() << "}" << '\n'; if (!gen_no_client_completion_) { - f_header_ << indent() << "virtual void completed__(bool /* success */) {}" << endl; + f_header_ << indent() << "virtual void completed__(bool /* success */) {}" << '\n'; } } @@ -2678,7 +2676,7 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_java_doc(f_header_, *f_iter); indent(f_header_) << function_signature(*f_iter, ifstyle) - << " override;" << endl; + << " override;" << '\n'; // TODO(dreiss): Use private inheritance to avoid generating thise in cob-style. if (style == "Concurrent" && !(*f_iter)->is_oneway()) { // concurrent clients need to move the seqid from the send function to the @@ -2687,12 +2685,12 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) t_function send_function(g_type_i32, /*returning seqid*/ string("send_") + (*f_iter)->get_name(), (*f_iter)->get_arglist()); - indent(f_header_) << function_signature(&send_function, "") << ";" << endl; + indent(f_header_) << function_signature(&send_function, "") << ";" << '\n'; } else { t_function send_function(g_type_void, string("send_") + (*f_iter)->get_name(), (*f_iter)->get_arglist()); - indent(f_header_) << function_signature(&send_function, "") << ";" << endl; + indent(f_header_) << function_signature(&send_function, "") << ";" << '\n'; } if (!(*f_iter)->is_oneway()) { if (style == "Concurrent") { @@ -2702,52 +2700,52 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) t_function recv_function((*f_iter)->get_returntype(), string("recv_") + (*f_iter)->get_name(), &seqIdArgStruct); - indent(f_header_) << function_signature(&recv_function, "") << ";" << endl; + indent(f_header_) << function_signature(&recv_function, "") << ";" << '\n'; } else { t_struct noargs(program_); t_function recv_function((*f_iter)->get_returntype(), string("recv_") + (*f_iter)->get_name(), &noargs); - indent(f_header_) << function_signature(&recv_function, "") << ";" << endl; + indent(f_header_) << function_signature(&recv_function, "") << ";" << '\n'; } } } indent_down(); if (extends.empty()) { - f_header_ << " protected:" << endl; + f_header_ << " protected:" << '\n'; indent_up(); if (style == "Cob") { f_header_ << indent() - << "::std::shared_ptr< ::apache::thrift::async::TAsyncChannel> channel_;" << endl + << "::std::shared_ptr< ::apache::thrift::async::TAsyncChannel> channel_;" << '\n' << indent() - << "::std::shared_ptr< ::apache::thrift::transport::TMemoryBuffer> itrans_;" << endl + << "::std::shared_ptr< ::apache::thrift::transport::TMemoryBuffer> itrans_;" << '\n' << indent() << "::std::shared_ptr< ::apache::thrift::transport::TMemoryBuffer> otrans_;" - << endl; + << '\n'; } f_header_ << - indent() << prot_ptr << " piprot_;" << endl << - indent() << prot_ptr << " poprot_;" << endl << - indent() << protocol_type << "* iprot_;" << endl << - indent() << protocol_type << "* oprot_;" << endl; + indent() << prot_ptr << " piprot_;" << '\n' << + indent() << prot_ptr << " poprot_;" << '\n' << + indent() << protocol_type << "* iprot_;" << '\n' << + indent() << protocol_type << "* oprot_;" << '\n'; if (style == "Concurrent") { f_header_ << - indent() << "std::shared_ptr< ::apache::thrift::async::TConcurrentClientSyncInfo> sync_;"< sync_;" << '\n'; } indent_down(); } - f_header_ << "};" << endl << endl; + f_header_ << "};" << '\n' << '\n'; if (gen_templates_) { // Output a backwards compatibility typedef using // TProtocol as the template parameter. f_header_ << "typedef " << service_name_ << style << "ClientT< ::apache::thrift::protocol::TProtocol> " << service_name_ << style - << "Client;" << endl << endl; + << "Client;" << '\n' << '\n'; } string scope = service_name_ + style + client_suffix + "::"; @@ -2769,7 +2767,7 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) if (gen_templates_) { indent(out) << template_header; } - indent(out) << function_signature(*f_iter, ifstyle, scope) << endl; + indent(out) << function_signature(*f_iter, ifstyle, scope) << '\n'; scope_up(out); indent(out) << seqIdCapture << "send_" << funname << "("; @@ -2788,33 +2786,33 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) } out << (*fld_iter)->get_name(); } - out << ");" << endl; + out << ");" << '\n'; if (style != "Cob") { if (!(*f_iter)->is_oneway()) { out << indent(); if (!(*f_iter)->get_returntype()->is_void()) { if (is_complex_type((*f_iter)->get_returntype())) { - out << "recv_" << funname << "(_return" << seqIdCommaUse << ");" << endl; + out << "recv_" << funname << "(_return" << seqIdCommaUse << ");" << '\n'; } else { - out << "return recv_" << funname << "(" << seqIdUse << ");" << endl; + out << "return recv_" << funname << "(" << seqIdUse << ");" << '\n'; } } else { - out << "recv_" << funname << "(" << seqIdUse << ");" << endl; + out << "recv_" << funname << "(" << seqIdUse << ");" << '\n'; } } } else { if (!(*f_iter)->is_oneway()) { out << indent() << _this << "channel_->sendAndRecvMessage(" << "::std::bind(cob, this), " << _this << "otrans_.get(), " << _this << "itrans_.get());" - << endl; + << '\n'; } else { out << indent() << _this << "channel_->sendMessage(" - << "::std::bind(cob, this), " << _this << "otrans_.get());" << endl; + << "::std::bind(cob, this), " << _this << "otrans_.get());" << '\n'; } } scope_down(out); - out << endl; + out << '\n'; // if (style != "Cob") // TODO(dreiss): Libify the client and don't generate this for cob-style if (true) { @@ -2831,7 +2829,7 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) if (gen_templates_) { indent(out) << template_header; } - indent(out) << function_signature(&send_function, "", scope) << endl; + indent(out) << function_signature(&send_function, "", scope) << '\n'; scope_up(out); // Function arguments and results @@ -2846,41 +2844,41 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) } // Serialize the request out << - indent() << "int32_t cseqid = " << cseqidVal << ";" << endl; + indent() << "int32_t cseqid = " << cseqidVal << ";" << '\n'; if(style == "Concurrent") { out << - indent() << "::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get());" << endl; + indent() << "::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get());" << '\n'; } if (style == "Cob") { out << - indent() << _this << "otrans_->resetBuffer();" << endl; + indent() << _this << "otrans_->resetBuffer();" << '\n'; } out << indent() << _this << "oprot_->writeMessageBegin(\"" << (*f_iter)->get_name() << "\", ::apache::thrift::protocol::" << ((*f_iter)->is_oneway() ? "T_ONEWAY" : "T_CALL") << - ", cseqid);" << endl << endl << - indent() << argsname << " args;" << endl; + ", cseqid);" << '\n' << '\n' << + indent() << argsname << " args;" << '\n'; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { out << indent() << "args." << (*fld_iter)->get_name() << " = &" << (*fld_iter)->get_name() - << ";" << endl; + << ";" << '\n'; } - out << indent() << "args.write(" << _this << "oprot_);" << endl << endl << indent() << _this - << "oprot_->writeMessageEnd();" << endl << indent() << _this - << "oprot_->getTransport()->writeEnd();" << endl << indent() << _this - << "oprot_->getTransport()->flush();" << endl; + out << indent() << "args.write(" << _this << "oprot_);" << '\n' << '\n' << indent() << _this + << "oprot_->writeMessageEnd();" << '\n' << indent() << _this + << "oprot_->getTransport()->writeEnd();" << '\n' << indent() << _this + << "oprot_->getTransport()->flush();" << '\n'; if (style == "Concurrent") { - out << endl << indent() << "sentry.commit();" << endl; + out << '\n' << indent() << "sentry.commit();" << '\n'; if (!(*f_iter)->is_oneway()) { - out << indent() << "return cseqid;" << endl; + out << indent() << "return cseqid;" << '\n'; } } scope_down(out); - out << endl; + out << '\n'; // Generate recv function only if not an oneway function if (!(*f_iter)->is_oneway()) { @@ -2902,124 +2900,123 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) if (gen_templates_) { indent(out) << template_header; } - indent(out) << function_signature(&recv_function, "", scope) << endl; + indent(out) << function_signature(&recv_function, "", scope) << '\n'; scope_up(out); - out << endl << - indent() << "int32_t rseqid = 0;" << endl << - indent() << "std::string fname;" << endl << - indent() << "::apache::thrift::protocol::TMessageType mtype;" << endl; + out << '\n' << + indent() << "int32_t rseqid = 0;" << '\n' << + indent() << "std::string fname;" << '\n' << + indent() << "::apache::thrift::protocol::TMessageType mtype;" << '\n'; if(style == "Concurrent") { - out << - endl << - indent() << "// the read mutex gets dropped and reacquired as part of waitForWork()" << endl << - indent() << "// The destructor of this sentry wakes up other clients" << endl << - indent() << "::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid);" << endl; + out << '\n' << + indent() << "// the read mutex gets dropped and reacquired as part of waitForWork()" << '\n' << + indent() << "// The destructor of this sentry wakes up other clients" << '\n' << + indent() << "::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid);" << '\n'; } if (style == "Cob" && !gen_no_client_completion_) { - out << indent() << "bool completed = false;" << endl << endl << indent() << "try {"; + out << indent() << "bool completed = false;" << '\n' << '\n' << indent() << "try {"; indent_up(); } - out << endl; + out << '\n'; if (style == "Concurrent") { out << - indent() << "while(true) {" << endl << - indent() << " if(!this->sync_->getPending(fname, mtype, rseqid)) {" << endl; + indent() << "while(true) {" << '\n' << + indent() << " if(!this->sync_->getPending(fname, mtype, rseqid)) {" << '\n'; indent_up(); indent_up(); } out << - indent() << _this << "iprot_->readMessageBegin(fname, mtype, rseqid);" << endl; + indent() << _this << "iprot_->readMessageBegin(fname, mtype, rseqid);" << '\n'; if (style == "Concurrent") { scope_down(out); - out << indent() << "if(seqid == rseqid) {" << endl; + out << indent() << "if(seqid == rseqid) {" << '\n'; indent_up(); } out << - indent() << "if (mtype == ::apache::thrift::protocol::T_EXCEPTION) {" << endl << - indent() << " ::apache::thrift::TApplicationException x;" << endl << - indent() << " x.read(" << _this << "iprot_);" << endl << - indent() << " " << _this << "iprot_->readMessageEnd();" << endl << - indent() << " " << _this << "iprot_->getTransport()->readEnd();" << endl; + indent() << "if (mtype == ::apache::thrift::protocol::T_EXCEPTION) {" << '\n' << + indent() << " ::apache::thrift::TApplicationException x;" << '\n' << + indent() << " x.read(" << _this << "iprot_);" << '\n' << + indent() << " " << _this << "iprot_->readMessageEnd();" << '\n' << + indent() << " " << _this << "iprot_->getTransport()->readEnd();" << '\n'; if (style == "Cob" && !gen_no_client_completion_) { - out << indent() << " completed = true;" << endl << indent() << " completed__(true);" - << endl; + out << indent() << " completed = true;" << '\n' << indent() << " completed__(true);" + << '\n'; } if (style == "Concurrent") { - out << indent() << " sentry.commit();" << endl; + out << indent() << " sentry.commit();" << '\n'; } out << - indent() << " throw x;" << endl << - indent() << "}" << endl << - indent() << "if (mtype != ::apache::thrift::protocol::T_REPLY) {" << endl << - indent() << " " << _this << "iprot_->skip(" << "::apache::thrift::protocol::T_STRUCT);" << endl << - indent() << " " << _this << "iprot_->readMessageEnd();" << endl << - indent() << " " << _this << "iprot_->getTransport()->readEnd();" << endl; + indent() << " throw x;" << '\n' << + indent() << "}" << '\n' << + indent() << "if (mtype != ::apache::thrift::protocol::T_REPLY) {" << '\n' << + indent() << " " << _this << "iprot_->skip(" << "::apache::thrift::protocol::T_STRUCT);" << '\n' << + indent() << " " << _this << "iprot_->readMessageEnd();" << '\n' << + indent() << " " << _this << "iprot_->getTransport()->readEnd();" << '\n'; if (style == "Cob" && !gen_no_client_completion_) { - out << indent() << " completed = true;" << endl << indent() << " completed__(false);" - << endl; + out << indent() << " completed = true;" << '\n' << indent() << " completed__(false);" + << '\n'; } out << - indent() << "}" << endl << - indent() << "if (fname.compare(\"" << (*f_iter)->get_name() << "\") != 0) {" << endl << - indent() << " " << _this << "iprot_->skip(" << "::apache::thrift::protocol::T_STRUCT);" << endl << - indent() << " " << _this << "iprot_->readMessageEnd();" << endl << - indent() << " " << _this << "iprot_->getTransport()->readEnd();" << endl; + indent() << "}" << '\n' << + indent() << "if (fname.compare(\"" << (*f_iter)->get_name() << "\") != 0) {" << '\n' << + indent() << " " << _this << "iprot_->skip(" << "::apache::thrift::protocol::T_STRUCT);" << '\n' << + indent() << " " << _this << "iprot_->readMessageEnd();" << '\n' << + indent() << " " << _this << "iprot_->getTransport()->readEnd();" << '\n'; if (style == "Cob" && !gen_no_client_completion_) { - out << indent() << " completed = true;" << endl << indent() << " completed__(false);" - << endl; + out << indent() << " completed = true;" << '\n' << indent() << " completed__(false);" + << '\n'; } if (style == "Concurrent") { - out << endl << - indent() << " // in a bad state, don't commit" << endl << - indent() << " using ::apache::thrift::protocol::TProtocolException;" << endl << - indent() << " throw TProtocolException(TProtocolException::INVALID_DATA);" << endl; + out << '\n' << + indent() << " // in a bad state, don't commit" << '\n' << + indent() << " using ::apache::thrift::protocol::TProtocolException;" << '\n' << + indent() << " throw TProtocolException(TProtocolException::INVALID_DATA);" << '\n'; } - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; if (!(*f_iter)->get_returntype()->is_void() && !is_complex_type((*f_iter)->get_returntype())) { t_field returnfield((*f_iter)->get_returntype(), "_return"); - out << indent() << declare_field(&returnfield) << endl; + out << indent() << declare_field(&returnfield) << '\n'; } - out << indent() << resultname << " result;" << endl; + out << indent() << resultname << " result;" << '\n'; if (!(*f_iter)->get_returntype()->is_void()) { - out << indent() << "result.success = &_return;" << endl; + out << indent() << "result.success = &_return;" << '\n'; } - out << indent() << "result.read(" << _this << "iprot_);" << endl << indent() << _this - << "iprot_->readMessageEnd();" << endl << indent() << _this - << "iprot_->getTransport()->readEnd();" << endl << endl; + out << indent() << "result.read(" << _this << "iprot_);" << '\n' << indent() << _this + << "iprot_->readMessageEnd();" << '\n' << indent() << _this + << "iprot_->getTransport()->readEnd();" << '\n' << '\n'; // Careful, only look for _result if not a void function if (!(*f_iter)->get_returntype()->is_void()) { if (is_complex_type((*f_iter)->get_returntype())) { out << - indent() << "if (result.__isset.success) {" << endl; + indent() << "if (result.__isset.success) {" << '\n'; out << - indent() << " // _return pointer has now been filled" << endl; + indent() << " // _return pointer has now been filled" << '\n'; if (style == "Cob" && !gen_no_client_completion_) { - out << indent() << " completed = true;" << endl << indent() << " completed__(true);" - << endl; + out << indent() << " completed = true;" << '\n' << indent() << " completed__(true);" + << '\n'; } if (style == "Concurrent") { - out << indent() << " sentry.commit();" << endl; + out << indent() << " sentry.commit();" << '\n'; } out << - indent() << " return;" << endl << - indent() << "}" << endl; + indent() << " return;" << '\n' << + indent() << "}" << '\n'; } else { - out << indent() << "if (result.__isset.success) {" << endl; + out << indent() << "if (result.__isset.success) {" << '\n'; if (style == "Cob" && !gen_no_client_completion_) { - out << indent() << " completed = true;" << endl << indent() << " completed__(true);" - << endl; + out << indent() << " completed = true;" << '\n' << indent() << " completed__(true);" + << '\n'; } if (style == "Concurrent") { - out << indent() << " sentry.commit();" << endl; + out << indent() << " sentry.commit();" << '\n'; } - out << indent() << " return _return;" << endl << indent() << "}" << endl; + out << indent() << " return _return;" << '\n' << indent() << "}" << '\n'; } } @@ -3027,62 +3024,62 @@ void t_cpp_generator::generate_service_client(t_service* tservice, string style) const std::vector& xceptions = xs->get_members(); vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { - out << indent() << "if (result.__isset." << (*x_iter)->get_name() << ") {" << endl; + out << indent() << "if (result.__isset." << (*x_iter)->get_name() << ") {" << '\n'; if (style == "Cob" && !gen_no_client_completion_) { - out << indent() << " completed = true;" << endl << indent() << " completed__(true);" - << endl; + out << indent() << " completed = true;" << '\n' << indent() << " completed__(true);" + << '\n'; } if (style == "Concurrent") { - out << indent() << " sentry.commit();" << endl; + out << indent() << " sentry.commit();" << '\n'; } - out << indent() << " throw result." << (*x_iter)->get_name() << ";" << endl << indent() - << "}" << endl; + out << indent() << " throw result." << (*x_iter)->get_name() << ";" << '\n' << indent() + << "}" << '\n'; } // We only get here if we are a void function if ((*f_iter)->get_returntype()->is_void()) { if (style == "Cob" && !gen_no_client_completion_) { - out << indent() << "completed = true;" << endl << indent() << "completed__(true);" - << endl; + out << indent() << "completed = true;" << '\n' << indent() << "completed__(true);" + << '\n'; } if (style == "Concurrent") { - out << indent() << "sentry.commit();" << endl; + out << indent() << "sentry.commit();" << '\n'; } - indent(out) << "return;" << endl; + indent(out) << "return;" << '\n'; } else { if (style == "Cob" && !gen_no_client_completion_) { - out << indent() << "completed = true;" << endl << indent() << "completed__(true);" - << endl; + out << indent() << "completed = true;" << '\n' << indent() << "completed__(true);" + << '\n'; } if (style == "Concurrent") { - out << indent() << "// in a bad state, don't commit" << endl; + out << indent() << "// in a bad state, don't commit" << '\n'; } out << indent() << "throw " "::apache::thrift::TApplicationException(::apache::thrift::" "TApplicationException::MISSING_RESULT, \"" << (*f_iter)->get_name() - << " failed: unknown result\");" << endl; + << " failed: unknown result\");" << '\n'; } if (style == "Concurrent") { indent_down(); indent_down(); - out << - indent() << " }" << endl << - indent() << " // seqid != rseqid" << endl << - indent() << " this->sync_->updatePending(fname, mtype, rseqid);" << endl << - endl << - indent() << " // this will temporarily unlock the readMutex, and let other clients get work done" << endl << - indent() << " this->sync_->waitForWork(seqid);" << endl << - indent() << "} // end while(true)" << endl; + out << indent() << " }" << '\n' + << indent() << " // seqid != rseqid" << '\n' + << indent() << " this->sync_->updatePending(fname, mtype, rseqid);" << '\n' + << '\n' + << indent() + << " // this will temporarily unlock the readMutex, and let other clients get work done" << '\n' + << indent() << " this->sync_->waitForWork(seqid);" << '\n' + << indent() << "} // end while(true)" << '\n'; } if (style == "Cob" && !gen_no_client_completion_) { indent_down(); - out << indent() << "} catch (...) {" << endl << indent() << " if (!completed) {" << endl - << indent() << " completed__(false);" << endl << indent() << " }" << endl - << indent() << " throw;" << endl << indent() << "}" << endl; + out << indent() << "} catch (...) {" << '\n' << indent() << " if (!completed) {" << '\n' + << indent() << " completed__(false);" << '\n' << indent() << " }" << '\n' + << indent() << " throw;" << '\n' << indent() << "}" << '\n'; } // Close function scope_down(out); - out << endl; + out << '\n'; } } } @@ -3218,61 +3215,61 @@ void ProcessorGenerator::generate_class_definition() { // Generate the header portion f_header_ << template_header_ << "class " << class_name_ << " : public " << parent_class << " {" - << endl; + << '\n'; // Protected data members - f_header_ << " protected:" << endl; + f_header_ << " protected:" << '\n'; indent_up(); - f_header_ << indent() << "::std::shared_ptr<" << if_name_ << "> iface_;" << endl; + f_header_ << indent() << "::std::shared_ptr<" << if_name_ << "> iface_;" << '\n'; f_header_ << indent() << "virtual " << ret_type_ << "dispatchCall(" << finish_cob_ << "::apache::thrift::protocol::TProtocol* iprot, " << "::apache::thrift::protocol::TProtocol* oprot, " << "const std::string& fname, int32_t seqid" << call_context_ - << ") override;" << endl; + << ") override;" << '\n'; if (generator_->gen_templates_) { f_header_ << indent() << "virtual " << ret_type_ << "dispatchCallTemplated(" << finish_cob_ << "Protocol_* iprot, Protocol_* oprot, " - << "const std::string& fname, int32_t seqid" << call_context_ << ");" << endl; + << "const std::string& fname, int32_t seqid" << call_context_ << ");" << '\n'; } indent_down(); // Process function declarations - f_header_ << " private:" << endl; + f_header_ << " private:" << '\n'; indent_up(); // Declare processMap_ f_header_ << indent() << "typedef void (" << class_name_ << "::*" << "ProcessFunction)(" << finish_cob_decl_ << "int32_t, " << "::apache::thrift::protocol::TProtocol*, " - << "::apache::thrift::protocol::TProtocol*" << call_context_decl_ << ");" << endl; + << "::apache::thrift::protocol::TProtocol*" << call_context_decl_ << ");" << '\n'; if (generator_->gen_templates_) { f_header_ << indent() << "typedef void (" << class_name_ << "::*" << "SpecializedProcessFunction)(" << finish_cob_decl_ << "int32_t, " - << "Protocol_*, Protocol_*" << call_context_decl_ << ");" << endl << indent() - << "struct ProcessFunctions {" << endl << indent() << " ProcessFunction generic;" - << endl << indent() << " SpecializedProcessFunction specialized;" << endl << indent() + << "Protocol_*, Protocol_*" << call_context_decl_ << ");" << '\n' << indent() + << "struct ProcessFunctions {" << '\n' << indent() << " ProcessFunction generic;" + << '\n' << indent() << " SpecializedProcessFunction specialized;" << '\n' << indent() << " ProcessFunctions(ProcessFunction g, " - << "SpecializedProcessFunction s) :" << endl << indent() << " generic(g)," << endl - << indent() << " specialized(s) {}" << endl << indent() + << "SpecializedProcessFunction s) :" << '\n' << indent() << " generic(g)," << '\n' + << indent() << " specialized(s) {}" << '\n' << indent() << " ProcessFunctions() : generic(nullptr), specialized(nullptr) " - << "{}" << endl << indent() << "};" << endl << indent() + << "{}" << '\n' << indent() << "};" << '\n' << indent() << "typedef std::map " - << "ProcessMap;" << endl; + << "ProcessMap;" << '\n'; } else { f_header_ << indent() << "typedef std::map " - << "ProcessMap;" << endl; + << "ProcessMap;" << '\n'; } - f_header_ << indent() << "ProcessMap processMap_;" << endl; + f_header_ << indent() << "ProcessMap processMap_;" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { indent(f_header_) << "void process_" << (*f_iter)->get_name() << "(" << finish_cob_ << "int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, " "::apache::thrift::protocol::TProtocol* oprot" << call_context_ << ");" - << endl; + << '\n'; if (generator_->gen_templates_) { indent(f_header_) << "void process_" << (*f_iter)->get_name() << "(" << finish_cob_ << "int32_t seqid, Protocol_* iprot, Protocol_* oprot" << call_context_ - << ");" << endl; + << ");" << '\n'; } if (style_ == "Cob") { // XXX Factor this out, even if it is a pain. @@ -3282,56 +3279,56 @@ void ProcessorGenerator::generate_class_definition() { f_header_ << indent() << "void return_" << (*f_iter)->get_name() << "(::std::function cob, int32_t seqid, " << "::apache::thrift::protocol::TProtocol* oprot, " - << "void* ctx" << ret_arg << ");" << endl; + << "void* ctx" << ret_arg << ");" << '\n'; if (generator_->gen_templates_) { f_header_ << indent() << "void return_" << (*f_iter)->get_name() << "(::std::function cob, int32_t seqid, " - << "Protocol_* oprot, void* ctx" << ret_arg << ");" << endl; + << "Protocol_* oprot, void* ctx" << ret_arg << ");" << '\n'; } // XXX Don't declare throw if it doesn't exist f_header_ << indent() << "void throw_" << (*f_iter)->get_name() << "(::std::function cob, int32_t seqid, " << "::apache::thrift::protocol::TProtocol* oprot, void* ctx, " - << "::apache::thrift::TDelayedException* _throw);" << endl; + << "::apache::thrift::TDelayedException* _throw);" << '\n'; if (generator_->gen_templates_) { f_header_ << indent() << "void throw_" << (*f_iter)->get_name() << "(::std::function cob, int32_t seqid, " << "Protocol_* oprot, void* ctx, " - << "::apache::thrift::TDelayedException* _throw);" << endl; + << "::apache::thrift::TDelayedException* _throw);" << '\n'; } } } - f_header_ << " public:" << endl << indent() << class_name_ << "(::std::shared_ptr<" << if_name_ - << "> iface) :" << endl; + f_header_ << " public:" << '\n' << indent() << class_name_ << "(::std::shared_ptr<" << if_name_ + << "> iface) :" << '\n'; if (!extends_.empty()) { - f_header_ << indent() << " " << extends_ << "(iface)," << endl; + f_header_ << indent() << " " << extends_ << "(iface)," << '\n'; } - f_header_ << indent() << " iface_(iface) {" << endl; + f_header_ << indent() << " iface_(iface) {" << '\n'; indent_up(); for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { f_header_ << indent() << "processMap_[\"" << (*f_iter)->get_name() << "\"] = "; if (generator_->gen_templates_) { - f_header_ << "ProcessFunctions(" << endl; + f_header_ << "ProcessFunctions(" << '\n'; if (generator_->gen_templates_only_) { - indent(f_header_) << " nullptr," << endl; + indent(f_header_) << " nullptr," << '\n'; } else { indent(f_header_) << " &" << class_name_ << "::process_" << (*f_iter)->get_name() << "," - << endl; + << '\n'; } indent(f_header_) << " &" << class_name_ << "::process_" << (*f_iter)->get_name() << ")"; } else { f_header_ << "&" << class_name_ << "::process_" << (*f_iter)->get_name(); } - f_header_ << ";" << endl; + f_header_ << ";" << '\n'; } indent_down(); - f_header_ << indent() << "}" << endl << endl << indent() << "virtual ~" << class_name_ << "() {}" - << endl; + f_header_ << indent() << "}" << '\n' << '\n' << indent() << "virtual ~" << class_name_ << "() {}" + << '\n'; indent_down(); - f_header_ << "};" << endl << endl; + f_header_ << "};" << '\n' << '\n'; if (generator_->gen_templates_) { // Generate a backwards compatible typedef, for callers who don't know @@ -3344,7 +3341,7 @@ void ProcessorGenerator::generate_class_definition() { // Therefore, we define TDummyProtocol solely so we can use it as the // template parameter here. f_header_ << "typedef " << class_name_ << "< ::apache::thrift::protocol::TDummyProtocol > " - << service_name_ << pstyle_ << "Processor;" << endl << endl; + << service_name_ << pstyle_ << "Processor;" << '\n' << '\n'; } } @@ -3366,32 +3363,32 @@ void ProcessorGenerator::generate_dispatch_call(bool template_protocol) { f_out_ << template_header_ << ret_type_ << class_name_ << template_suffix_ << "::dispatchCall" << function_suffix << "(" << finish_cob_ << protocol << "* iprot, " << protocol << "* oprot, " - << "const std::string& fname, int32_t seqid" << call_context_ << ") {" << endl; + << "const std::string& fname, int32_t seqid" << call_context_ << ") {" << '\n'; indent_up(); // HOT: member function pointer map - f_out_ << indent() << typename_str_ << "ProcessMap::iterator pfn;" << endl << indent() - << "pfn = processMap_.find(fname);" << endl << indent() - << "if (pfn == processMap_.end()) {" << endl; + f_out_ << indent() << typename_str_ << "ProcessMap::iterator pfn;" << '\n' << indent() + << "pfn = processMap_.find(fname);" << '\n' << indent() + << "if (pfn == processMap_.end()) {" << '\n'; if (extends_.empty()) { - f_out_ << indent() << " iprot->skip(::apache::thrift::protocol::T_STRUCT);" << endl << indent() - << " iprot->readMessageEnd();" << endl << indent() - << " iprot->getTransport()->readEnd();" << endl << indent() + f_out_ << indent() << " iprot->skip(::apache::thrift::protocol::T_STRUCT);" << '\n' << indent() + << " iprot->readMessageEnd();" << '\n' << indent() + << " iprot->getTransport()->readEnd();" << '\n' << indent() << " ::apache::thrift::TApplicationException " "x(::apache::thrift::TApplicationException::UNKNOWN_METHOD, \"Invalid method name: " - "'\"+fname+\"'\");" << endl << indent() + "'\"+fname+\"'\");" << '\n' << indent() << " oprot->writeMessageBegin(fname, ::apache::thrift::protocol::T_EXCEPTION, seqid);" - << endl << indent() << " x.write(oprot);" << endl << indent() - << " oprot->writeMessageEnd();" << endl << indent() - << " oprot->getTransport()->writeEnd();" << endl << indent() - << " oprot->getTransport()->flush();" << endl << indent() - << (style_ == "Cob" ? " return cob(true);" : " return true;") << endl; + << '\n' << indent() << " x.write(oprot);" << '\n' << indent() + << " oprot->writeMessageEnd();" << '\n' << indent() + << " oprot->getTransport()->writeEnd();" << '\n' << indent() + << " oprot->getTransport()->flush();" << '\n' << indent() + << (style_ == "Cob" ? " return cob(true);" : " return true;") << '\n'; } else { f_out_ << indent() << " return " << extends_ << "::dispatchCall(" << (style_ == "Cob" ? "cob, " : "") << "iprot, oprot, fname, seqid" << call_context_arg_ - << ");" << endl; + << ");" << '\n'; } - f_out_ << indent() << "}" << endl; + f_out_ << indent() << "}" << '\n'; if (template_protocol) { f_out_ << indent() << "(this->*(pfn->second.specialized))"; } else { @@ -3405,17 +3402,17 @@ void ProcessorGenerator::generate_dispatch_call(bool template_protocol) { f_out_ << indent() << "(this->*(pfn->second))"; } } - f_out_ << "(" << cob_arg_ << "seqid, iprot, oprot" << call_context_arg_ << ");" << endl; + f_out_ << "(" << cob_arg_ << "seqid, iprot, oprot" << call_context_arg_ << ");" << '\n'; // TODO(dreiss): return pfn ret? if (style_ == "Cob") { - f_out_ << indent() << "return;" << endl; + f_out_ << indent() << "return;" << '\n'; } else { - f_out_ << indent() << "return true;" << endl; + f_out_ << indent() << "return true;" << '\n'; } indent_down(); - f_out_ << "}" << endl << endl; + f_out_ << "}" << '\n' << '\n'; } void ProcessorGenerator::generate_process_functions() { @@ -3437,49 +3434,49 @@ void ProcessorGenerator::generate_factory() { // Generate the factory class definition f_header_ << template_header_ << "class " << factory_class_name_ << " : public ::apache::thrift::" << (style_ == "Cob" ? "async::TAsyncProcessorFactory" : "TProcessorFactory") << " {" - << endl << " public:" << endl; + << '\n' << " public:" << '\n'; indent_up(); f_header_ << indent() << factory_class_name_ << "(const ::std::shared_ptr< " << if_factory_name - << " >& handlerFactory) noexcept :" << endl << indent() - << " handlerFactory_(handlerFactory) {}" << endl << endl << indent() + << " >& handlerFactory) noexcept :" << '\n' << indent() + << " handlerFactory_(handlerFactory) {}" << '\n' << '\n' << indent() << "::std::shared_ptr< ::apache::thrift::" << (style_ == "Cob" ? "async::TAsyncProcessor" : "TProcessor") << " > " << "getProcessor(const ::apache::thrift::TConnectionInfo& connInfo) override;" - << endl; + << '\n'; - f_header_ << endl << " protected:" << endl << indent() << "::std::shared_ptr< " - << if_factory_name << " > handlerFactory_;" << endl; + f_header_ << '\n' << " protected:" << '\n' << indent() << "::std::shared_ptr< " + << if_factory_name << " > handlerFactory_;" << '\n'; indent_down(); - f_header_ << "};" << endl << endl; + f_header_ << "};" << '\n' << '\n'; // If we are generating templates, output a typedef for the plain // factory name. if (generator_->gen_templates_) { f_header_ << "typedef " << factory_class_name_ << "< ::apache::thrift::protocol::TDummyProtocol > " << service_name_ << pstyle_ - << "ProcessorFactory;" << endl << endl; + << "ProcessorFactory;" << '\n' << '\n'; } // Generate the getProcessor() method f_out_ << template_header_ << indent() << "::std::shared_ptr< ::apache::thrift::" << (style_ == "Cob" ? "async::TAsyncProcessor" : "TProcessor") << " > " << factory_class_name_ << template_suffix_ << "::getProcessor(" - << "const ::apache::thrift::TConnectionInfo& connInfo) {" << endl; + << "const ::apache::thrift::TConnectionInfo& connInfo) {" << '\n'; indent_up(); f_out_ << indent() << "::apache::thrift::ReleaseHandler< " << if_factory_name - << " > cleanup(handlerFactory_);" << endl << indent() << "::std::shared_ptr< " + << " > cleanup(handlerFactory_);" << '\n' << indent() << "::std::shared_ptr< " << if_name_ << " > handler(" - << "handlerFactory_->getHandler(connInfo), cleanup);" << endl << indent() + << "handlerFactory_->getHandler(connInfo), cleanup);" << '\n' << indent() << "::std::shared_ptr< ::apache::thrift::" << (style_ == "Cob" ? "async::TAsyncProcessor" : "TProcessor") << " > " - << "processor(new " << class_name_ << template_suffix_ << "(handler));" << endl << indent() - << "return processor;" << endl; + << "processor(new " << class_name_ << template_suffix_ << "(handler));" << '\n' << indent() + << "return processor;" << '\n'; indent_down(); - f_out_ << indent() << "}" << endl << endl; + f_out_ << indent() << "}" << '\n' << '\n'; } /** @@ -3561,45 +3558,45 @@ void t_cpp_generator::generate_process_function(t_service* tservice, if (style != "Cob") { // Open function if (gen_templates_) { - out << indent() << "template " << endl; + out << indent() << "template " << '\n'; } const bool unnamed_oprot_seqid = tfunction->is_oneway() && !(gen_templates_ && !specialized); out << "void " << tservice->get_name() << "Processor" << class_suffix << "::" << "process_" << tfunction->get_name() << "(" << "int32_t" << (unnamed_oprot_seqid ? ", " : " seqid, ") << prot_type << "* iprot, " << prot_type << "*" << (unnamed_oprot_seqid ? ", " : " oprot, ") << "void* callContext)" - << endl; + << '\n'; scope_up(out); string argsname = tservice->get_name() + "_" + tfunction->get_name() + "_args"; string resultname = tservice->get_name() + "_" + tfunction->get_name() + "_result"; if (tfunction->is_oneway() && !unnamed_oprot_seqid) { - out << indent() << "(void) seqid;" << endl << indent() << "(void) oprot;" << endl; + out << indent() << "(void) seqid;" << '\n' << indent() << "(void) oprot;" << '\n'; } - out << indent() << "void* ctx = nullptr;" << endl << indent() - << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() + out << indent() << "void* ctx = nullptr;" << '\n' << indent() + << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() << " ctx = this->eventHandler_->getContext(" << service_func_name << ", callContext);" - << endl << indent() << "}" << endl << indent() + << '\n' << indent() << "}" << '\n' << indent() << "::apache::thrift::TProcessorContextFreer freer(" - << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << endl << endl - << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->preRead(ctx, " << service_func_name << ");" << endl << indent() - << "}" << endl << endl << indent() << argsname << " args;" << endl << indent() - << "args.read(iprot);" << endl << indent() << "iprot->readMessageEnd();" << endl << indent() - << "uint32_t bytes = iprot->getTransport()->readEnd();" << endl << endl << indent() - << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->postRead(ctx, " << service_func_name << ", bytes);" << endl - << indent() << "}" << endl << endl; + << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << '\n' << '\n' + << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->preRead(ctx, " << service_func_name << ");" << '\n' << indent() + << "}" << '\n' << '\n' << indent() << argsname << " args;" << '\n' << indent() + << "args.read(iprot);" << '\n' << indent() << "iprot->readMessageEnd();" << '\n' << indent() + << "uint32_t bytes = iprot->getTransport()->readEnd();" << '\n' << '\n' << indent() + << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->postRead(ctx, " << service_func_name << ", bytes);" << '\n' + << indent() << "}" << '\n' << '\n'; // Declare result if (!tfunction->is_oneway()) { - out << indent() << resultname << " result;" << endl; + out << indent() << resultname << " result;" << '\n'; } // Try block for functions with exceptions - out << indent() << "try {" << endl; + out << indent() << "try {" << '\n'; indent_up(); // Generate the function call @@ -3623,11 +3620,11 @@ void t_cpp_generator::generate_process_function(t_service* tservice, } out << "args." << (*f_iter)->get_name(); } - out << ");" << endl; + out << ");" << '\n'; // Set isset on success field if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()) { - out << indent() << "result.__isset.success = true;" << endl; + out << indent() << "result.__isset.success = true;" << '\n'; } indent_down(); @@ -3636,12 +3633,12 @@ void t_cpp_generator::generate_process_function(t_service* tservice, if (!tfunction->is_oneway()) { for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { out << " catch (" << type_name((*x_iter)->get_type()) << " &" << (*x_iter)->get_name() - << ") {" << endl; + << ") {" << '\n'; if (!tfunction->is_oneway()) { indent_up(); out << indent() << "result." << (*x_iter)->get_name() - << " = std::move(" << (*x_iter)->get_name() << ");" << endl - << indent() << "result.__isset." << (*x_iter)->get_name() << " = true;" << endl; + << " = std::move(" << (*x_iter)->get_name() << ");" << '\n' + << indent() << "result.__isset." << (*x_iter)->get_name() << " = true;" << '\n'; indent_down(); out << indent() << "}"; } else { @@ -3651,53 +3648,53 @@ void t_cpp_generator::generate_process_function(t_service* tservice, } if (!tfunction->is_oneway()) { - out << " catch (const std::exception& e) {" << endl; + out << " catch (const std::exception& e) {" << '\n'; } else { - out << " catch (const std::exception&) {" << endl; + out << " catch (const std::exception&) {" << '\n'; } indent_up(); - out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->handlerError(ctx, " << service_func_name << ");" << endl - << indent() << "}" << endl; + out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->handlerError(ctx, " << service_func_name << ");" << '\n' + << indent() << "}" << '\n'; if (!tfunction->is_oneway()) { - out << endl << indent() << "::apache::thrift::TApplicationException x(e.what());" << endl + out << '\n' << indent() << "::apache::thrift::TApplicationException x(e.what());" << '\n' << indent() << "oprot->writeMessageBegin(\"" << tfunction->get_name() - << "\", ::apache::thrift::protocol::T_EXCEPTION, seqid);" << endl << indent() - << "x.write(oprot);" << endl << indent() << "oprot->writeMessageEnd();" << endl - << indent() << "oprot->getTransport()->writeEnd();" << endl << indent() - << "oprot->getTransport()->flush();" << endl; + << "\", ::apache::thrift::protocol::T_EXCEPTION, seqid);" << '\n' << indent() + << "x.write(oprot);" << '\n' << indent() << "oprot->writeMessageEnd();" << '\n' + << indent() << "oprot->getTransport()->writeEnd();" << '\n' << indent() + << "oprot->getTransport()->flush();" << '\n'; } - out << indent() << "return;" << endl; + out << indent() << "return;" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; // Shortcut out here for oneway functions if (tfunction->is_oneway()) { - out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->asyncComplete(ctx, " << service_func_name << ");" << endl - << indent() << "}" << endl << endl << indent() << "return;" << endl; + out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->asyncComplete(ctx, " << service_func_name << ");" << '\n' + << indent() << "}" << '\n' << '\n' << indent() << "return;" << '\n'; indent_down(); - out << "}" << endl << endl; + out << "}" << '\n' << '\n'; return; } // Serialize the result into a struct - out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->preWrite(ctx, " << service_func_name << ");" << endl << indent() - << "}" << endl << endl << indent() << "oprot->writeMessageBegin(\"" << tfunction->get_name() - << "\", ::apache::thrift::protocol::T_REPLY, seqid);" << endl << indent() - << "result.write(oprot);" << endl << indent() << "oprot->writeMessageEnd();" << endl - << indent() << "bytes = oprot->getTransport()->writeEnd();" << endl << indent() - << "oprot->getTransport()->flush();" << endl << endl << indent() - << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->postWrite(ctx, " << service_func_name << ", bytes);" << endl - << indent() << "}" << endl; + out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->preWrite(ctx, " << service_func_name << ");" << '\n' << indent() + << "}" << '\n' << '\n' << indent() << "oprot->writeMessageBegin(\"" << tfunction->get_name() + << "\", ::apache::thrift::protocol::T_REPLY, seqid);" << '\n' << indent() + << "result.write(oprot);" << '\n' << indent() << "oprot->writeMessageEnd();" << '\n' + << indent() << "bytes = oprot->getTransport()->writeEnd();" << '\n' << indent() + << "oprot->getTransport()->flush();" << '\n' << '\n' << indent() + << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->postWrite(ctx, " << service_func_name << ", bytes);" << '\n' + << indent() << "}" << '\n'; // Close function scope_down(out); - out << endl; + out << '\n'; } // Cob style. @@ -3705,11 +3702,11 @@ void t_cpp_generator::generate_process_function(t_service* tservice, // Processor entry point. // TODO(edhall) update for callContext when TEventServer is ready if (gen_templates_) { - out << indent() << "template " << endl; + out << indent() << "template " << '\n'; } out << "void " << tservice->get_name() << "AsyncProcessor" << class_suffix << "::process_" << tfunction->get_name() << "(::std::function cob, int32_t seqid, " - << prot_type << "* iprot, " << prot_type << "* oprot)" << endl; + << prot_type << "* iprot, " << prot_type << "* oprot)" << '\n'; scope_up(out); // TODO(simpkins): we could try to consoldate this @@ -3717,55 +3714,55 @@ void t_cpp_generator::generate_process_function(t_service* tservice, if (gen_templates_ && !specialized) { // If these are instances of Protocol_, instead of any old TProtocol, // use the specialized process function instead. - out << indent() << "Protocol_* _iprot = dynamic_cast(iprot);" << endl << indent() - << "Protocol_* _oprot = dynamic_cast(oprot);" << endl << indent() - << "if (_iprot && _oprot) {" << endl << indent() << " return process_" - << tfunction->get_name() << "(cob, seqid, _iprot, _oprot);" << endl << indent() << "}" - << endl << indent() << "T_GENERIC_PROTOCOL(this, iprot, _iprot);" << endl << indent() - << "T_GENERIC_PROTOCOL(this, oprot, _oprot);" << endl << endl; + out << indent() << "Protocol_* _iprot = dynamic_cast(iprot);" << '\n' << indent() + << "Protocol_* _oprot = dynamic_cast(oprot);" << '\n' << indent() + << "if (_iprot && _oprot) {" << '\n' << indent() << " return process_" + << tfunction->get_name() << "(cob, seqid, _iprot, _oprot);" << '\n' << indent() << "}" + << '\n' << indent() << "T_GENERIC_PROTOCOL(this, iprot, _iprot);" << '\n' << indent() + << "T_GENERIC_PROTOCOL(this, oprot, _oprot);" << '\n' << '\n'; } if (tfunction->is_oneway()) { - out << indent() << "(void) seqid;" << endl << indent() << "(void) oprot;" << endl; + out << indent() << "(void) seqid;" << '\n' << indent() << "(void) oprot;" << '\n'; } - out << indent() << tservice->get_name() + "_" + tfunction->get_name() << "_args args;" << endl - << indent() << "void* ctx = nullptr;" << endl << indent() - << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " ctx = this->eventHandler_->getContext(" << service_func_name << ", nullptr);" << endl - << indent() << "}" << endl << indent() << "::apache::thrift::TProcessorContextFreer freer(" - << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << endl << endl - << indent() << "try {" << endl; + out << indent() << tservice->get_name() + "_" + tfunction->get_name() << "_args args;" << '\n' + << indent() << "void* ctx = nullptr;" << '\n' << indent() + << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " ctx = this->eventHandler_->getContext(" << service_func_name << ", nullptr);" << '\n' + << indent() << "}" << '\n' << indent() << "::apache::thrift::TProcessorContextFreer freer(" + << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << '\n' << '\n' + << indent() << "try {" << '\n'; indent_up(); - out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->preRead(ctx, " << service_func_name << ");" << endl << indent() - << "}" << endl << indent() << "args.read(iprot);" << endl << indent() - << "iprot->readMessageEnd();" << endl << indent() - << "uint32_t bytes = iprot->getTransport()->readEnd();" << endl << indent() - << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->postRead(ctx, " << service_func_name << ", bytes);" << endl - << indent() << "}" << endl; + out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->preRead(ctx, " << service_func_name << ");" << '\n' << indent() + << "}" << '\n' << indent() << "args.read(iprot);" << '\n' << indent() + << "iprot->readMessageEnd();" << '\n' << indent() + << "uint32_t bytes = iprot->getTransport()->readEnd();" << '\n' << indent() + << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->postRead(ctx, " << service_func_name << ", bytes);" << '\n' + << indent() << "}" << '\n'; scope_down(out); // TODO(dreiss): Handle TExceptions? Expose to server? - out << indent() << "catch (const std::exception&) {" << endl << indent() - << " if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->handlerError(ctx, " << service_func_name << ");" << endl - << indent() << " }" << endl << indent() << " return cob(false);" << endl << indent() - << "}" << endl; + out << indent() << "catch (const std::exception&) {" << '\n' << indent() + << " if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->handlerError(ctx, " << service_func_name << ");" << '\n' + << indent() << " }" << '\n' << indent() << " return cob(false);" << '\n' << indent() + << "}" << '\n'; if (tfunction->is_oneway()) { - out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->asyncComplete(ctx, " << service_func_name << ");" << endl - << indent() << "}" << endl; + out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->asyncComplete(ctx, " << service_func_name << ");" << '\n' + << indent() << "}" << '\n'; } // TODO(dreiss): Figure out a strategy for exceptions in async handlers. - out << indent() << "freer.unregister();" << endl; + out << indent() << "freer.unregister();" << '\n'; if (tfunction->is_oneway()) { // No return. Just hand off our cob. // TODO(dreiss): Call the cob immediately? out << indent() << "iface_->" << tfunction->get_name() << "(" - << "::std::bind(cob, true)" << endl; + << "::std::bind(cob, true)" << '\n'; indent_up(); indent_up(); } else { @@ -3781,38 +3778,38 @@ void t_cpp_generator::generate_process_function(t_service* tservice, out << indent() << "void (" << tservice->get_name() << "AsyncProcessor" << class_suffix << "::*return_fn)(::std::function " << "cob, int32_t seqid, " << prot_type << "* oprot, void* ctx" << ret_arg - << ") =" << endl; + << ") =" << '\n'; out << indent() << " &" << tservice->get_name() << "AsyncProcessor" << class_suffix - << "::return_" << tfunction->get_name() << ";" << endl; + << "::return_" << tfunction->get_name() << ";" << '\n'; if (!xceptions.empty()) { out << indent() << "void (" << tservice->get_name() << "AsyncProcessor" << class_suffix << "::*throw_fn)(::std::function " << "cob, int32_t seqid, " << prot_type << "* oprot, void* ctx, " - << "::apache::thrift::TDelayedException* _throw) =" << endl; + << "::apache::thrift::TDelayedException* _throw) =" << '\n'; out << indent() << " &" << tservice->get_name() << "AsyncProcessor" << class_suffix - << "::throw_" << tfunction->get_name() << ";" << endl; + << "::throw_" << tfunction->get_name() << ";" << '\n'; } - out << indent() << "iface_->" << tfunction->get_name() << "(" << endl; + out << indent() << "iface_->" << tfunction->get_name() << "(" << '\n'; indent_up(); indent_up(); out << indent() << "::std::bind(return_fn, this, cob, seqid, oprot, ctx" << ret_placeholder << ")"; if (!xceptions.empty()) { - out << ',' << endl << indent() << "::std::bind(throw_fn, this, cob, seqid, oprot, " + out << ',' << '\n' << indent() << "::std::bind(throw_fn, this, cob, seqid, oprot, " << "ctx, ::std::placeholders::_1)"; } } // XXX Whitespace cleanup. for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - out << ',' << endl << indent() << "args." << (*f_iter)->get_name(); + out << ',' << '\n' << indent() << "args." << (*f_iter)->get_name(); } - out << ");" << endl; + out << ");" << '\n'; indent_down(); indent_down(); scope_down(out); - out << endl; + out << '\n'; // Normal return. if (!tfunction->is_oneway()) { @@ -3822,128 +3819,128 @@ void t_cpp_generator::generate_process_function(t_service* tservice, ret_arg_name = ", _return"; } if (gen_templates_) { - out << indent() << "template " << endl; + out << indent() << "template " << '\n'; } out << "void " << tservice->get_name() << "AsyncProcessor" << class_suffix << "::return_" << tfunction->get_name() << "(::std::function cob, int32_t seqid, " - << prot_type << "* oprot, void* ctx" << ret_arg_decl << ')' << endl; + << prot_type << "* oprot, void* ctx" << ret_arg_decl << ')' << '\n'; scope_up(out); if (gen_templates_ && !specialized) { // If oprot is a Protocol_ instance, // use the specialized return function instead. - out << indent() << "Protocol_* _oprot = dynamic_cast(oprot);" << endl - << indent() << "if (_oprot) {" << endl << indent() << " return return_" - << tfunction->get_name() << "(cob, seqid, _oprot, ctx" << ret_arg_name << ");" << endl - << indent() << "}" << endl << indent() << "T_GENERIC_PROTOCOL(this, oprot, _oprot);" - << endl << endl; + out << indent() << "Protocol_* _oprot = dynamic_cast(oprot);" << '\n' + << indent() << "if (_oprot) {" << '\n' << indent() << " return return_" + << tfunction->get_name() << "(cob, seqid, _oprot, ctx" << ret_arg_name << ");" << '\n' + << indent() << "}" << '\n' << indent() << "T_GENERIC_PROTOCOL(this, oprot, _oprot);" + << '\n' << '\n'; } out << indent() << tservice->get_name() << "_" << tfunction->get_name() << "_presult result;" - << endl; + << '\n'; if (!tfunction->get_returntype()->is_void()) { // The const_cast here is unfortunate, but it would be a pain to avoid, // and we only do a write with this struct, which is const-safe. out << indent() << "result.success = const_cast<" << type_name(tfunction->get_returntype()) - << "*>(&_return);" << endl << indent() << "result.__isset.success = true;" << endl; + << "*>(&_return);" << '\n' << indent() << "result.__isset.success = true;" << '\n'; } // Serialize the result into a struct - out << endl << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " ctx = this->eventHandler_->getContext(" << service_func_name << ", nullptr);" << endl - << indent() << "}" << endl << indent() + out << '\n' << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " ctx = this->eventHandler_->getContext(" << service_func_name << ", nullptr);" << '\n' + << indent() << "}" << '\n' << indent() << "::apache::thrift::TProcessorContextFreer freer(" - << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << endl << endl - << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->preWrite(ctx, " << service_func_name << ");" << endl - << indent() << "}" << endl << endl << indent() << "oprot->writeMessageBegin(\"" - << tfunction->get_name() << "\", ::apache::thrift::protocol::T_REPLY, seqid);" << endl - << indent() << "result.write(oprot);" << endl << indent() << "oprot->writeMessageEnd();" - << endl << indent() << "uint32_t bytes = oprot->getTransport()->writeEnd();" << endl - << indent() << "oprot->getTransport()->flush();" << endl << indent() - << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->postWrite(ctx, " << service_func_name << ", bytes);" << endl - << indent() << "}" << endl << indent() << "return cob(true);" << endl; + << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << '\n' << '\n' + << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->preWrite(ctx, " << service_func_name << ");" << '\n' + << indent() << "}" << '\n' << '\n' << indent() << "oprot->writeMessageBegin(\"" + << tfunction->get_name() << "\", ::apache::thrift::protocol::T_REPLY, seqid);" << '\n' + << indent() << "result.write(oprot);" << '\n' << indent() << "oprot->writeMessageEnd();" + << '\n' << indent() << "uint32_t bytes = oprot->getTransport()->writeEnd();" << '\n' + << indent() << "oprot->getTransport()->flush();" << '\n' << indent() + << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->postWrite(ctx, " << service_func_name << ", bytes);" << '\n' + << indent() << "}" << '\n' << indent() << "return cob(true);" << '\n'; scope_down(out); - out << endl; + out << '\n'; } // Exception return. if (!tfunction->is_oneway() && !xceptions.empty()) { if (gen_templates_) { - out << indent() << "template " << endl; + out << indent() << "template " << '\n'; } out << "void " << tservice->get_name() << "AsyncProcessor" << class_suffix << "::throw_" << tfunction->get_name() << "(::std::function cob, int32_t seqid, " << prot_type << "* oprot, void* ctx, " - << "::apache::thrift::TDelayedException* _throw)" << endl; + << "::apache::thrift::TDelayedException* _throw)" << '\n'; scope_up(out); if (gen_templates_ && !specialized) { // If oprot is a Protocol_ instance, // use the specialized throw function instead. - out << indent() << "Protocol_* _oprot = dynamic_cast(oprot);" << endl - << indent() << "if (_oprot) {" << endl << indent() << " return throw_" - << tfunction->get_name() << "(cob, seqid, _oprot, ctx, _throw);" << endl << indent() - << "}" << endl << indent() << "T_GENERIC_PROTOCOL(this, oprot, _oprot);" << endl - << endl; + out << indent() << "Protocol_* _oprot = dynamic_cast(oprot);" << '\n' + << indent() << "if (_oprot) {" << '\n' << indent() << " return throw_" + << tfunction->get_name() << "(cob, seqid, _oprot, ctx, _throw);" << '\n' << indent() + << "}" << '\n' << indent() << "T_GENERIC_PROTOCOL(this, oprot, _oprot);" << '\n' + << '\n'; } // Get the event handler context - out << endl << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " ctx = this->eventHandler_->getContext(" << service_func_name << ", nullptr);" << endl - << indent() << "}" << endl << indent() + out << '\n' << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " ctx = this->eventHandler_->getContext(" << service_func_name << ", nullptr);" << '\n' + << indent() << "}" << '\n' << indent() << "::apache::thrift::TProcessorContextFreer freer(" - << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << endl << endl; + << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << '\n' << '\n'; // Throw the TDelayedException, and catch the result out << indent() << tservice->get_name() << "_" << tfunction->get_name() << "_result result;" - << endl << endl << indent() << "try {" << endl; + << '\n' << '\n' << indent() << "try {" << '\n'; indent_up(); - out << indent() << "_throw->throw_it();" << endl << indent() << "return cob(false);" - << endl; // Is this possible? TBD. + out << indent() << "_throw->throw_it();" << '\n' << indent() << "return cob(false);" + << '\n'; // Is this possible? TBD. indent_down(); out << indent() << '}'; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { out << " catch (" << type_name((*x_iter)->get_type()) << " &" << (*x_iter)->get_name() - << ") {" << endl; + << ") {" << '\n'; indent_up(); out << indent() << "result." << (*x_iter)->get_name() << " = " << (*x_iter)->get_name() - << ";" << endl << indent() << "result.__isset." << (*x_iter)->get_name() << " = true;" - << endl; + << ";" << '\n' << indent() << "result.__isset." << (*x_iter)->get_name() << " = true;" + << '\n'; scope_down(out); } // Handle the case where an undeclared exception is thrown - out << " catch (std::exception& e) {" << endl; + out << " catch (std::exception& e) {" << '\n'; indent_up(); - out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->handlerError(ctx, " << service_func_name << ");" << endl - << indent() << "}" << endl << endl << indent() - << "::apache::thrift::TApplicationException x(e.what());" << endl << indent() + out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->handlerError(ctx, " << service_func_name << ");" << '\n' + << indent() << "}" << '\n' << '\n' << indent() + << "::apache::thrift::TApplicationException x(e.what());" << '\n' << indent() << "oprot->writeMessageBegin(\"" << tfunction->get_name() - << "\", ::apache::thrift::protocol::T_EXCEPTION, seqid);" << endl << indent() - << "x.write(oprot);" << endl << indent() << "oprot->writeMessageEnd();" << endl - << indent() << "oprot->getTransport()->writeEnd();" << endl << indent() - << "oprot->getTransport()->flush();" << endl << + << "\", ::apache::thrift::protocol::T_EXCEPTION, seqid);" << '\n' << indent() + << "x.write(oprot);" << '\n' << indent() << "oprot->writeMessageEnd();" << '\n' + << indent() << "oprot->getTransport()->writeEnd();" << '\n' << indent() + << "oprot->getTransport()->flush();" << '\n' << // We pass true to the cob here, since we did successfully write a // response, even though it is an exception response. // It looks like the argument is currently ignored, anyway. - indent() << "return cob(true);" << endl; + indent() << "return cob(true);" << '\n'; scope_down(out); // Serialize the result into a struct - out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->preWrite(ctx, " << service_func_name << ");" << endl - << indent() << "}" << endl << endl << indent() << "oprot->writeMessageBegin(\"" - << tfunction->get_name() << "\", ::apache::thrift::protocol::T_REPLY, seqid);" << endl - << indent() << "result.write(oprot);" << endl << indent() << "oprot->writeMessageEnd();" - << endl << indent() << "uint32_t bytes = oprot->getTransport()->writeEnd();" << endl - << indent() << "oprot->getTransport()->flush();" << endl << indent() - << "if (this->eventHandler_.get() != nullptr) {" << endl << indent() - << " this->eventHandler_->postWrite(ctx, " << service_func_name << ", bytes);" << endl - << indent() << "}" << endl << indent() << "return cob(true);" << endl; + out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->preWrite(ctx, " << service_func_name << ");" << '\n' + << indent() << "}" << '\n' << '\n' << indent() << "oprot->writeMessageBegin(\"" + << tfunction->get_name() << "\", ::apache::thrift::protocol::T_REPLY, seqid);" << '\n' + << indent() << "result.write(oprot);" << '\n' << indent() << "oprot->writeMessageEnd();" + << '\n' << indent() << "uint32_t bytes = oprot->getTransport()->writeEnd();" << '\n' + << indent() << "oprot->getTransport()->flush();" << '\n' << indent() + << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent() + << " this->eventHandler_->postWrite(ctx, " << service_func_name << ", bytes);" << '\n' + << indent() << "}" << '\n' << indent() << "return cob(true);" << '\n'; scope_down(out); - out << endl; + out << '\n'; } // for each function } // cob style } @@ -3963,58 +3960,58 @@ void t_cpp_generator::generate_service_skeleton(t_service* tservice) { ofstream_with_content_based_conditional_update f_skeleton; f_skeleton.open(f_skeleton_name.c_str()); - f_skeleton << "// This autogenerated skeleton file illustrates how to build a server." << endl - << "// You should copy it to another filename to avoid overwriting it." << endl << endl - << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" << endl - << "#include " << endl - << "#include " << endl - << "#include " << endl - << "#include " << endl << endl - << "using namespace ::apache::thrift;" << endl - << "using namespace ::apache::thrift::protocol;" << endl - << "using namespace ::apache::thrift::transport;" << endl - << "using namespace ::apache::thrift::server;" << endl << endl; + f_skeleton << "// This autogenerated skeleton file illustrates how to build a server." << '\n' + << "// You should copy it to another filename to avoid overwriting it." << '\n' << '\n' + << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" << '\n' + << "#include " << '\n' + << "#include " << '\n' + << "#include " << '\n' + << "#include " << '\n' << '\n' + << "using namespace ::apache::thrift;" << '\n' + << "using namespace ::apache::thrift::protocol;" << '\n' + << "using namespace ::apache::thrift::transport;" << '\n' + << "using namespace ::apache::thrift::server;" << '\n' << '\n'; // the following code would not compile: // using namespace ; // using namespace ::; if ((!ns.empty()) && (ns.compare(" ::") != 0)) { - f_skeleton << "using namespace " << string(ns, 0, ns.size() - 2) << ";" << endl << endl; + f_skeleton << "using namespace " << string(ns, 0, ns.size() - 2) << ";" << '\n' << '\n'; } - f_skeleton << "class " << svcname << "Handler : virtual public " << svcname << "If {" << endl - << " public:" << endl; + f_skeleton << "class " << svcname << "Handler : virtual public " << svcname << "If {" << '\n' + << " public:" << '\n'; indent_up(); - f_skeleton << indent() << svcname << "Handler() {" << endl << indent() - << " // Your initialization goes here" << endl << indent() << "}" << endl << endl; + f_skeleton << indent() << svcname << "Handler() {" << '\n' << indent() + << " // Your initialization goes here" << '\n' << indent() << "}" << '\n' << '\n'; vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_java_doc(f_skeleton, *f_iter); - f_skeleton << indent() << function_signature(*f_iter, "") << " {" << endl << indent() - << " // Your implementation goes here" << endl << indent() << " printf(\"" - << (*f_iter)->get_name() << "\\n\");" << endl << indent() << "}" << endl << endl; + f_skeleton << indent() << function_signature(*f_iter, "") << " {" << '\n' << indent() + << " // Your implementation goes here" << '\n' << indent() << " printf(\"" + << (*f_iter)->get_name() << "\\n\");" << '\n' << indent() << "}" << '\n' << '\n'; } indent_down(); - f_skeleton << "};" << endl << endl; + f_skeleton << "};" << '\n' << '\n'; - f_skeleton << indent() << "int main(int argc, char **argv) {" << endl; + f_skeleton << indent() << "int main(int argc, char **argv) {" << '\n'; indent_up(); f_skeleton - << indent() << "int port = 9090;" << endl << indent() << "::std::shared_ptr<" << svcname - << "Handler> handler(new " << svcname << "Handler());" << endl << indent() - << "::std::shared_ptr processor(new " << svcname << "Processor(handler));" << endl + << indent() << "int port = 9090;" << '\n' << indent() << "::std::shared_ptr<" << svcname + << "Handler> handler(new " << svcname << "Handler());" << '\n' << indent() + << "::std::shared_ptr processor(new " << svcname << "Processor(handler));" << '\n' << indent() << "::std::shared_ptr serverTransport(new TServerSocket(port));" - << endl << indent() - << "::std::shared_ptr transportFactory(new TBufferedTransportFactory());" << endl + << '\n' << indent() + << "::std::shared_ptr transportFactory(new TBufferedTransportFactory());" << '\n' << indent() << "::std::shared_ptr protocolFactory(new TBinaryProtocolFactory());" - << endl << endl << indent() + << '\n' << '\n' << indent() << "TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);" - << endl << indent() << "server.serve();" << endl << indent() << "return 0;" << endl; + << '\n' << indent() << "server.serve();" << '\n' << indent() << "return 0;" << '\n'; indent_down(); - f_skeleton << "}" << endl << endl; + f_skeleton << "}" << '\n' << '\n'; // Close the files f_skeleton.close(); @@ -4077,12 +4074,12 @@ void t_cpp_generator::generate_deserialize_field(ostream& out, default: throw "compiler error: no C++ reader for base type " + t_base_type::t_base_name(tbase) + " " + name; } - out << endl; + out << '\n'; } else if (type->is_enum()) { string t = tmp("ecast"); - out << indent() << "int32_t " << t << ";" << endl << indent() << "xfer += iprot->readI32(" << t - << ");" << endl << indent() << name << " = static_cast<" - << type_name(type) << ">(" << t << ");" << endl; + out << indent() << "int32_t " << t << ";" << '\n' << indent() << "xfer += iprot->readI32(" << t + << ");" << '\n' << indent() << name << " = static_cast<" + << type_name(type) << ">(" << t << ");" << '\n'; } else { printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", tfield->get_name().c_str(), @@ -4101,22 +4098,22 @@ void t_cpp_generator::generate_deserialize_struct(ostream& out, string prefix, bool pointer) { if (pointer) { - indent(out) << "if (!" << prefix << ") { " << endl; + indent(out) << "if (!" << prefix << ") { " << '\n'; indent(out) << " " << prefix << " = ::std::shared_ptr<" << type_name(tstruct) << ">(new " - << type_name(tstruct) << ");" << endl; - indent(out) << "}" << endl; - indent(out) << "xfer += " << prefix << "->read(iprot);" << endl; - indent(out) << "bool wasSet = false;" << endl; + << type_name(tstruct) << ");" << '\n'; + indent(out) << "}" << '\n'; + indent(out) << "xfer += " << prefix << "->read(iprot);" << '\n'; + indent(out) << "bool wasSet = false;" << '\n'; const vector& members = tstruct->get_members(); vector::const_iterator f_iter; for (f_iter = members.begin(); f_iter != members.end(); ++f_iter) { indent(out) << "if (" << prefix << "->__isset." << (*f_iter)->get_name() - << ") { wasSet = true; }" << endl; + << ") { wasSet = true; }" << '\n'; } - indent(out) << "if (!wasSet) { " << prefix << ".reset(); }" << endl; + indent(out) << "if (!wasSet) { " << prefix << ".reset(); }" << '\n'; } else { - indent(out) << "xfer += " << prefix << ".read(iprot);" << endl; + indent(out) << "xfer += " << prefix << ".read(iprot);" << '\n'; } } @@ -4131,28 +4128,28 @@ void t_cpp_generator::generate_deserialize_container(ostream& out, t_type* ttype t_container* tcontainer = (t_container*)ttype; bool use_push = tcontainer->has_cpp_name(); - indent(out) << prefix << ".clear();" << endl << indent() << "uint32_t " << size << ";" << endl; + indent(out) << prefix << ".clear();" << '\n' << indent() << "uint32_t " << size << ";" << '\n'; // Declare variables, read header if (ttype->is_map()) { - out << indent() << "::apache::thrift::protocol::TType " << ktype << ";" << endl << indent() - << "::apache::thrift::protocol::TType " << vtype << ";" << endl << indent() - << "xfer += iprot->readMapBegin(" << ktype << ", " << vtype << ", " << size << ");" << endl; + out << indent() << "::apache::thrift::protocol::TType " << ktype << ";" << '\n' << indent() + << "::apache::thrift::protocol::TType " << vtype << ";" << '\n' << indent() + << "xfer += iprot->readMapBegin(" << ktype << ", " << vtype << ", " << size << ");" << '\n'; } else if (ttype->is_set()) { - out << indent() << "::apache::thrift::protocol::TType " << etype << ";" << endl << indent() - << "xfer += iprot->readSetBegin(" << etype << ", " << size << ");" << endl; + out << indent() << "::apache::thrift::protocol::TType " << etype << ";" << '\n' << indent() + << "xfer += iprot->readSetBegin(" << etype << ", " << size << ");" << '\n'; } else if (ttype->is_list()) { - out << indent() << "::apache::thrift::protocol::TType " << etype << ";" << endl << indent() - << "xfer += iprot->readListBegin(" << etype << ", " << size << ");" << endl; + out << indent() << "::apache::thrift::protocol::TType " << etype << ";" << '\n' << indent() + << "xfer += iprot->readListBegin(" << etype << ", " << size << ");" << '\n'; if (!use_push) { - indent(out) << prefix << ".resize(" << size << ");" << endl; + indent(out) << prefix << ".resize(" << size << ");" << '\n'; } } // For loop iterates over elements string i = tmp("_i"); - out << indent() << "uint32_t " << i << ";" << endl << indent() << "for (" << i << " = 0; " << i - << " < " << size << "; ++" << i << ")" << endl; + out << indent() << "uint32_t " << i << ";" << '\n' << indent() << "for (" << i << " = 0; " << i + << " < " << size << "; ++" << i << ")" << '\n'; scope_up(out); @@ -4168,11 +4165,11 @@ void t_cpp_generator::generate_deserialize_container(ostream& out, t_type* ttype // Read container end if (ttype->is_map()) { - indent(out) << "xfer += iprot->readMapEnd();" << endl; + indent(out) << "xfer += iprot->readMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "xfer += iprot->readSetEnd();" << endl; + indent(out) << "xfer += iprot->readSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "xfer += iprot->readListEnd();" << endl; + indent(out) << "xfer += iprot->readListEnd();" << '\n'; } scope_down(out); @@ -4187,11 +4184,11 @@ void t_cpp_generator::generate_deserialize_map_element(ostream& out, t_map* tmap t_field fkey(tmap->get_key_type(), key); t_field fval(tmap->get_val_type(), val); - out << indent() << declare_field(&fkey) << endl; + out << indent() << declare_field(&fkey) << '\n'; generate_deserialize_field(out, &fkey); indent(out) << declare_field(&fval, false, false, false, true) << " = " << prefix << "[" << key - << "];" << endl; + << "];" << '\n'; generate_deserialize_field(out, &fval); } @@ -4200,11 +4197,11 @@ void t_cpp_generator::generate_deserialize_set_element(ostream& out, t_set* tset string elem = tmp("_elem"); t_field felem(tset->get_elem_type(), elem); - indent(out) << declare_field(&felem) << endl; + indent(out) << declare_field(&felem) << '\n'; generate_deserialize_field(out, &felem); - indent(out) << prefix << ".insert(" << elem << ");" << endl; + indent(out) << prefix << ".insert(" << elem << ");" << '\n'; } void t_cpp_generator::generate_deserialize_list_element(ostream& out, @@ -4215,9 +4212,9 @@ void t_cpp_generator::generate_deserialize_list_element(ostream& out, if (use_push) { string elem = tmp("_elem"); t_field felem(tlist->get_elem_type(), elem); - indent(out) << declare_field(&felem) << endl; + indent(out) << declare_field(&felem) << '\n'; generate_deserialize_field(out, &felem); - indent(out) << prefix << ".push_back(" << elem << ");" << endl; + indent(out) << prefix << ".push_back(" << elem << ");" << '\n'; } else { t_field felem(tlist->get_elem_type(), prefix + "[" + index + "]"); generate_deserialize_field(out, &felem); @@ -4292,7 +4289,7 @@ void t_cpp_generator::generate_serialize_field(ostream& out, } else if (type->is_enum()) { out << "writeI32(static_cast(" << name << "));"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s' TYPE '%s'\n", name.c_str(), @@ -4311,15 +4308,15 @@ void t_cpp_generator::generate_serialize_struct(ostream& out, string prefix, bool pointer) { if (pointer) { - indent(out) << "if (" << prefix << ") {" << endl; - indent(out) << " xfer += " << prefix << "->write(oprot); " << endl; + indent(out) << "if (" << prefix << ") {" << '\n'; + indent(out) << " xfer += " << prefix << "->write(oprot); " << '\n'; indent(out) << "} else {" - << "oprot->writeStructBegin(\"" << tstruct->get_name() << "\"); " << endl; - indent(out) << " oprot->writeStructEnd();" << endl; - indent(out) << " oprot->writeFieldStop();" << endl; - indent(out) << "}" << endl; + << "oprot->writeStructBegin(\"" << tstruct->get_name() << "\"); " << '\n'; + indent(out) << " oprot->writeStructEnd();" << '\n'; + indent(out) << " oprot->writeFieldStop();" << '\n'; + indent(out) << "}" << '\n'; } else { - indent(out) << "xfer += " << prefix << ".write(oprot);" << endl; + indent(out) << "xfer += " << prefix << ".write(oprot);" << '\n'; } } @@ -4329,21 +4326,21 @@ void t_cpp_generator::generate_serialize_container(ostream& out, t_type* ttype, if (ttype->is_map()) { indent(out) << "xfer += oprot->writeMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " - << "static_cast(" << prefix << ".size()));" << endl; + << "static_cast(" << prefix << ".size()));" << '\n'; } else if (ttype->is_set()) { indent(out) << "xfer += oprot->writeSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " - << "static_cast(" << prefix << ".size()));" << endl; + << "static_cast(" << prefix << ".size()));" << '\n'; } else if (ttype->is_list()) { indent(out) << "xfer += oprot->writeListBegin(" << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " - << "static_cast(" << prefix << ".size()));" << endl; + << "static_cast(" << prefix << ".size()));" << '\n'; } string iter = tmp("_iter"); - out << indent() << type_name(ttype) << "::const_iterator " << iter << ";" << endl << indent() + out << indent() << type_name(ttype) << "::const_iterator " << iter << ";" << '\n' << indent() << "for (" << iter << " = " << prefix << ".begin(); " << iter << " != " << prefix - << ".end(); ++" << iter << ")" << endl; + << ".end(); ++" << iter << ")" << '\n'; scope_up(out); if (ttype->is_map()) { generate_serialize_map_element(out, (t_map*)ttype, iter); @@ -4355,11 +4352,11 @@ void t_cpp_generator::generate_serialize_container(ostream& out, t_type* ttype, scope_down(out); if (ttype->is_map()) { - indent(out) << "xfer += oprot->writeMapEnd();" << endl; + indent(out) << "xfer += oprot->writeMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "xfer += oprot->writeSetEnd();" << endl; + indent(out) << "xfer += oprot->writeSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "xfer += oprot->writeListEnd();" << endl; + indent(out) << "xfer += oprot->writeListEnd();" << '\n'; } scope_down(out); diff --git a/compiler/cpp/src/thrift/generate/t_d_generator.cc b/compiler/cpp/src/thrift/generate/t_d_generator.cc index 38194c20719..61988dfc491 100644 --- a/compiler/cpp/src/thrift/generate/t_d_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_d_generator.cc @@ -43,8 +43,6 @@ using std::set; using std::string; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /** * D code generator. * @@ -105,7 +103,7 @@ class t_d_generator : public t_oop_generator { // Print header f_types_ << autogen_comment() << "module " << render_package(*program_) << program_name_ - << "_types;" << endl << endl; + << "_types;" << '\n' << '\n'; print_default_imports(f_types_); @@ -113,10 +111,10 @@ class t_d_generator : public t_oop_generator { const vector& includes = program_->get_includes(); for (auto include : includes) { f_types_ << "public import " << render_package(*include) << include->get_name() - << "_types;" << endl; + << "_types;" << '\n'; } if (!includes.empty()) - f_types_ << endl; + f_types_ << '\n'; } void close_generator() override { @@ -131,22 +129,22 @@ class t_d_generator : public t_oop_generator { f_consts.open(f_consts_name.c_str()); f_consts << autogen_comment() << "module " << render_package(*program_) << program_name_ - << "_constants;" << endl << endl; + << "_constants;" << '\n' << '\n'; print_default_imports(f_consts); - f_consts << "import " << render_package(*get_program()) << program_name_ << "_types;" << endl - << endl; + f_consts << "import " << render_package(*get_program()) << program_name_ << "_types;" << '\n' + << '\n'; vector::iterator c_iter; for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { this->emit_doc(*c_iter, f_consts); string name = suffix_if_reserved((*c_iter)->get_name()); t_type* type = (*c_iter)->get_type(); - indent(f_consts) << "immutable(" << render_type_name(type) << ") " << name << ";" << endl; + indent(f_consts) << "immutable(" << render_type_name(type) << ") " << name << ";" << '\n'; } - f_consts << endl << "shared static this() {" << endl; + f_consts << '\n' << "shared static this() {" << '\n'; indent_up(); bool first = true; @@ -154,24 +152,24 @@ class t_d_generator : public t_oop_generator { if (first) { first = false; } else { - f_consts << endl; + f_consts << '\n'; } t_type* type = (*c_iter)->get_type(); indent(f_consts) << suffix_if_reserved((*c_iter)->get_name()) << " = "; if (!is_immutable_type(type)) { f_consts << "cast(immutable(" << render_type_name(type) << ")) "; } - f_consts << render_const_value(type, (*c_iter)->get_value()) << ";" << endl; + f_consts << render_const_value(type, (*c_iter)->get_value()) << ";" << '\n'; } indent_down(); - indent(f_consts) << "}" << endl; + indent(f_consts) << "}" << '\n'; } } void generate_typedef(t_typedef* ttypedef) override { this->emit_doc(ttypedef, f_types_); f_types_ << indent() << "alias " << render_type_name(ttypedef->get_type()) << " " - << ttypedef->get_symbolic() << ";" << endl << endl; + << ttypedef->get_symbolic() << ";" << '\n' << '\n'; } void generate_enum(t_enum* tenum) override { @@ -179,7 +177,7 @@ class t_d_generator : public t_oop_generator { this->emit_doc(tenum, f_types_); string enum_name = suffix_if_reserved(tenum->get_name()); - f_types_ << indent() << "enum " << enum_name << " {" << endl; + f_types_ << indent() << "enum " << enum_name << " {" << '\n'; indent_up(); @@ -190,11 +188,11 @@ class t_d_generator : public t_oop_generator { f_types_ << " = " << (*c_iter)->get_value() << ","; } - f_types_ << endl; + f_types_ << '\n'; indent_down(); - indent(f_types_) << "}" << endl; + indent(f_types_) << "}" << '\n'; - f_types_ << endl; + f_types_ << '\n'; } void generate_struct(t_struct* tstruct) override { @@ -213,19 +211,19 @@ class t_d_generator : public t_oop_generator { ofstream_with_content_based_conditional_update f_service; f_service.open(f_servicename.c_str()); f_service << autogen_comment() << "module " << suffix_if_reserved(render_package(*program_)) << svc_name << ";" - << endl << endl; + << '\n' << '\n'; print_default_imports(f_service); - f_service << "import " << suffix_if_reserved(render_package(*get_program())) << program_name_ << "_types;" << endl; + f_service << "import " << suffix_if_reserved(render_package(*get_program())) << program_name_ << "_types;" << '\n'; t_service* extends_service = tservice->get_extends(); if (extends_service != nullptr) { f_service << "import " << suffix_if_reserved(render_package(*(extends_service->get_program()))) - << suffix_if_reserved(extends_service->get_name()) << ";" << endl; + << suffix_if_reserved(extends_service->get_name()) << ";" << '\n'; } - f_service << endl; + f_service << '\n'; string extends = ""; if (tservice->get_extends() != nullptr) { @@ -233,7 +231,7 @@ class t_d_generator : public t_oop_generator { } this->emit_doc(tservice, f_service); - f_service << indent() << "interface " << svc_name << extends << " {" << endl; + f_service << indent() << "interface " << svc_name << extends << " {" << '\n'; indent_up(); // Collect all the exception types service methods can throw so we can @@ -247,7 +245,7 @@ class t_d_generator : public t_oop_generator { this->emit_doc(*fn_iter, f_service); f_service << indent(); print_function_signature(f_service, *fn_iter); - f_service << ";" << endl; + f_service << ";" << '\n'; const vector& exceptions = (*fn_iter)->get_xceptions()->get_members(); vector::const_iterator ex_iter; @@ -258,13 +256,13 @@ class t_d_generator : public t_oop_generator { // Alias the exception types into the current scope. if (!exception_types.empty()) - f_service << endl; + f_service << '\n'; set::const_iterator et_iter; for (et_iter = exception_types.begin(); et_iter != exception_types.end(); ++et_iter) { indent(f_service) << "alias " << render_package(*(*et_iter)->get_program()) << (*et_iter)->get_program()->get_name() << "_types" << "." << (*et_iter)->get_name() << " " << (*et_iter)->get_name() << ";" - << endl; + << '\n'; } // Write the method metadata. @@ -283,7 +281,7 @@ class t_d_generator : public t_oop_generator { meta << ","; } - meta << endl << indent() << "TMethodMeta(`" << suffix_if_reserved((*fn_iter)->get_name()) << "`, " << endl; + meta << '\n' << indent() << "TMethodMeta(`" << suffix_if_reserved((*fn_iter)->get_name()) << "`, " << '\n'; indent_up(); indent(meta) << "["; @@ -309,7 +307,7 @@ class t_d_generator : public t_oop_generator { meta << "]"; if (!(*fn_iter)->get_xceptions()->get_members().empty() || (*fn_iter)->is_oneway()) { - meta << "," << endl << indent() << "["; + meta << "," << '\n' << indent() << "["; bool first = true; const vector& exceptions = (*fn_iter)->get_xceptions()->get_members(); @@ -329,22 +327,22 @@ class t_d_generator : public t_oop_generator { } if ((*fn_iter)->is_oneway()) { - meta << "," << endl << indent() << "TMethodType.ONEWAY"; + meta << "," << '\n' << indent() << "TMethodType.ONEWAY"; } indent_down(); - meta << endl << indent() << ")"; + meta << '\n' << indent() << ")"; } indent_down(); string meta_str(meta.str()); if (!meta_str.empty()) { - f_service << endl << indent() << "enum methodMeta = [" << meta_str << endl << indent() << "];" - << endl; + f_service << '\n' << indent() << "enum methodMeta = [" << meta_str << '\n' << indent() << "];" + << '\n'; } indent_down(); - indent(f_service) << "}" << endl; + indent(f_service) << "}" << '\n'; // Server skeleton generation. string f_skeletonname = package_dir_ + svc_name + "_server.skeleton.d"; @@ -358,14 +356,14 @@ class t_d_generator : public t_oop_generator { if (!doc->has_doc()) { return; } - indent(out) << "/**" << std::endl; + indent(out) << "/**" << '\n'; indent_up(); - // No endl -- comments reliably have a newline at the end. + // No line break -- comments reliably have a newline at the end. // This is true even for stuff like: // /** method infos */ void foo(/** huh?*/ 1: i64 stuff) indent(out) << doc->get_doc(); indent_down(); - indent(out) << "*/" << std::endl; + indent(out) << "*/" << '\n'; } private: @@ -376,59 +374,59 @@ class t_d_generator : public t_oop_generator { void print_server_skeleton(ostream& out, t_service* tservice) { string svc_name = suffix_if_reserved(tservice->get_name()); - out << "/*" << endl - << " * This auto-generated skeleton file illustrates how to build a server. If you" << endl - << " * intend to customize it, you should edit a copy with another file name to " << endl - << " * avoid overwriting it when running the generator again." << endl << " */" << endl - << "module " << render_package(*tservice->get_program()) << svc_name << "_server;" << endl - << endl << "import std.stdio;" << endl << "import thrift.codegen.processor;" << endl - << "import thrift.protocol.binary;" << endl << "import thrift.server.simple;" << endl - << "import thrift.server.transport.socket;" << endl << "import thrift.transport.buffered;" - << endl << "import thrift.util.hashset;" << endl << endl << "import " - << render_package(*tservice->get_program()) << svc_name << ";" << endl << "import " - << render_package(*get_program()) << program_name_ << "_types;" << endl << endl << endl - << "class " << svc_name << "Handler : " << svc_name << " {" << endl; + out << "/*" << '\n' + << " * This auto-generated skeleton file illustrates how to build a server. If you" << '\n' + << " * intend to customize it, you should edit a copy with another file name to " << '\n' + << " * avoid overwriting it when running the generator again." << '\n' << " */" << '\n' + << "module " << render_package(*tservice->get_program()) << svc_name << "_server;" << '\n' + << '\n' << "import std.stdio;" << '\n' << "import thrift.codegen.processor;" << '\n' + << "import thrift.protocol.binary;" << '\n' << "import thrift.server.simple;" << '\n' + << "import thrift.server.transport.socket;" << '\n' << "import thrift.transport.buffered;" + << '\n' << "import thrift.util.hashset;" << '\n' << '\n' << "import " + << render_package(*tservice->get_program()) << svc_name << ";" << '\n' << "import " + << render_package(*get_program()) << program_name_ << "_types;" << '\n' << '\n' << '\n' + << "class " << svc_name << "Handler : " << svc_name << " {" << '\n'; indent_up(); - out << indent() << "this() {" << endl << indent() << " // Your initialization goes here." - << endl << indent() << "}" << endl << endl; + out << indent() << "this() {" << '\n' << indent() << " // Your initialization goes here." + << '\n' << indent() << "}" << '\n' << '\n'; vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { out << indent(); print_function_signature(out, *f_iter); - out << " {" << endl; + out << " {" << '\n'; indent_up(); - out << indent() << "// Your implementation goes here." << endl << indent() << "writeln(\"" - << suffix_if_reserved((*f_iter)->get_name()) << " called\");" << endl; + out << indent() << "// Your implementation goes here." << '\n' << indent() << "writeln(\"" + << suffix_if_reserved((*f_iter)->get_name()) << " called\");" << '\n'; t_type* rt = (*f_iter)->get_returntype(); if (!rt->is_void()) { - indent(out) << "return typeof(return).init;" << endl; + indent(out) << "return typeof(return).init;" << '\n'; } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } indent_down(); - out << "}" << endl << endl; + out << "}" << '\n' << '\n'; - out << indent() << "void main() {" << endl; + out << indent() << "void main() {" << '\n'; indent_up(); - out << indent() << "auto protocolFactory = new TBinaryProtocolFactory!();" << endl << indent() + out << indent() << "auto protocolFactory = new TBinaryProtocolFactory!();" << '\n' << indent() << "auto processor = new TServiceProcessor!" << svc_name << "(new " << svc_name - << "Handler);" << endl << indent() << "auto serverTransport = new TServerSocket(9090);" - << endl << indent() << "auto transportFactory = new TBufferedTransportFactory;" << endl - << indent() << "auto server = new TSimpleServer(" << endl << indent() - << " processor, serverTransport, transportFactory, protocolFactory);" << endl << indent() - << "server.serve();" << endl; + << "Handler);" << '\n' << indent() << "auto serverTransport = new TServerSocket(9090);" + << '\n' << indent() << "auto transportFactory = new TBufferedTransportFactory;" << '\n' + << indent() << "auto server = new TSimpleServer(" << '\n' << indent() + << " processor, serverTransport, transportFactory, protocolFactory);" << '\n' << indent() + << "server.serve();" << '\n'; indent_down(); - out << "}" << endl; + out << "}" << '\n'; } /** @@ -439,9 +437,9 @@ class t_d_generator : public t_oop_generator { const vector& members = tstruct->get_members(); if (is_exception) { - indent(out) << "class " << suffix_if_reserved(tstruct->get_name()) << " : TException {" << endl; + indent(out) << "class " << suffix_if_reserved(tstruct->get_name()) << " : TException {" << '\n'; } else { - indent(out) << "struct " << suffix_if_reserved(tstruct->get_name()) << " {" << endl; + indent(out) << "struct " << suffix_if_reserved(tstruct->get_name()) << " {" << '\n'; } indent_up(); @@ -449,11 +447,11 @@ class t_d_generator : public t_oop_generator { vector::const_iterator m_iter; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { indent(out) << render_type_name((*m_iter)->get_type()) << " " << suffix_if_reserved((*m_iter)->get_name()) << ";" - << endl; + << '\n'; } if (!members.empty()) - indent(out) << endl; + indent(out) << '\n'; indent(out) << "mixin TStructHelpers!("; if (!members.empty()) { @@ -471,7 +469,7 @@ class t_d_generator : public t_oop_generator { } else { out << ","; } - out << endl; + out << '\n'; indent(out) << "TFieldMeta(`" << suffix_if_reserved((*m_iter)->get_name()) << "`, " << (*m_iter)->get_key(); @@ -485,13 +483,13 @@ class t_d_generator : public t_oop_generator { } indent_down(); - out << endl << indent() << "]"; + out << '\n' << indent() << "]"; } - out << ");" << endl; + out << ");" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -559,13 +557,13 @@ class t_d_generator : public t_oop_generator { } else if (type->is_enum()) { out << "cast(" << render_type_name(type) << ")" << value->get_integer(); } else { - out << "{" << endl; + out << "{" << '\n'; indent_up(); - indent(out) << render_type_name(type) << " v;" << endl; + indent(out) << render_type_name(type) << " v;" << '\n'; if (type->is_struct() || type->is_xception()) { indent(out) << "v = " << (type->is_xception() ? "new " : "") << render_type_name(type) - << "();" << endl; + << "();" << '\n'; const vector& fields = ((t_struct*)type)->get_members(); vector::const_iterator f_iter; @@ -583,7 +581,7 @@ class t_d_generator : public t_oop_generator { + v_iter->first->get_string(); } string val = render_const_value(field_type, v_iter->second); - indent(out) << "v.set!`" << v_iter->first->get_string() << "`(" << val << ");" << endl; + indent(out) << "v.set!`" << v_iter->first->get_string() << "`(" << val << ");" << '\n'; } } else if (type->is_map()) { t_type* ktype = ((t_map*)type)->get_key_type(); @@ -597,7 +595,7 @@ class t_d_generator : public t_oop_generator { if (!is_immutable_type(ktype)) { out << "cast(immutable(" << render_type_name(ktype) << "))"; } - out << key << "] = " << val << ";" << endl; + out << key << "] = " << val << ";" << '\n'; } } else if (type->is_list()) { t_type* etype = ((t_list*)type)->get_elem_type(); @@ -605,7 +603,7 @@ class t_d_generator : public t_oop_generator { vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string val = render_const_value(etype, *v_iter); - indent(out) << "v ~= " << val << ";" << endl; + indent(out) << "v ~= " << val << ";" << '\n'; } } else if (type->is_set()) { t_type* etype = ((t_set*)type)->get_elem_type(); @@ -613,12 +611,12 @@ class t_d_generator : public t_oop_generator { vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string val = render_const_value(etype, *v_iter); - indent(out) << "v ~= " << val << ";" << endl; + indent(out) << "v ~= " << val << ";" << '\n'; } } else { throw "Compiler error: Invalid type in render_const_value: " + type->get_name(); } - indent(out) << "return v;" << endl; + indent(out) << "return v;" << '\n'; indent_down(); indent(out) << "}()"; @@ -728,8 +726,8 @@ class t_d_generator : public t_oop_generator { */ void print_default_imports(ostream& out) { - indent(out) << "import thrift.base;" << endl << "import thrift.codegen.base;" << endl - << "import thrift.util.hashset;" << endl << endl; + indent(out) << "import thrift.base;" << '\n' << "import thrift.codegen.base;" << '\n' + << "import thrift.util.hashset;" << '\n' << '\n'; } /** diff --git a/compiler/cpp/src/thrift/generate/t_dart_generator.cc b/compiler/cpp/src/thrift/generate/t_dart_generator.cc index fda989b24c6..00550438ed2 100644 --- a/compiler/cpp/src/thrift/generate/t_dart_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_dart_generator.cc @@ -37,9 +37,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes -static const string endl2 = "\n\n"; - /** * Use the current Thrift version for static libraries. When releasing, update * the version in these files. @@ -89,11 +86,11 @@ class t_dart_generator : public t_oop_generator { } void scope_up(std::ostream& out, std::string prefix=" ") { - out << prefix << "{" << endl; + out << prefix << "{" << '\n'; indent_up(); } - void scope_down(std::ostream& out, std::string postfix=endl) { + void scope_down(std::ostream& out, std::string postfix="\n") { indent_down(); indent(out) << "}" << postfix; } @@ -339,7 +336,7 @@ string t_dart_generator::dart_library(string file_name) { * @return List of imports for services */ string t_dart_generator::service_imports() { - return "import 'dart:async';" + endl; + return string("import 'dart:async';") + "\n"; } /** @@ -348,14 +345,14 @@ string t_dart_generator::service_imports() { * @return List of imports necessary for thrift */ string t_dart_generator::dart_thrift_imports() { - string imports = "import 'dart:typed_data' show Uint8List;" + endl + - "import 'package:thrift/thrift.dart';" + endl; + string imports = string("import 'dart:typed_data' show Uint8List;") + "\n" + + string("import 'package:thrift/thrift.dart';") + "\n"; // add import for this library if (package_prefix_.empty()) { - imports += "import 'package:" + library_name_ + "/" + library_name_ + ".dart';" + endl; + imports += "import 'package:" + library_name_ + "/" + library_name_ + ".dart';" + "\n"; } else { - imports += "import 'package:" + package_prefix_ + library_name_ + ".dart';" + endl; + imports += "import 'package:" + package_prefix_ + library_name_ + ".dart';" + "\n"; } // add imports for included thrift files @@ -364,9 +361,9 @@ string t_dart_generator::dart_thrift_imports() { string include_name = find_library_name(include); string named_import = "t_" + include_name; if (package_prefix_.empty()) { - imports += "import 'package:" + include_name + "/" + include_name + ".dart' as " + named_import + ";" + endl; + imports += "import 'package:" + include_name + "/" + include_name + ".dart' as " + named_import + ";" + "\n"; } else { - imports += "import 'package:" + package_prefix_ + include_name + ".dart' as " + named_import + ";" + endl; + imports += "import 'package:" + package_prefix_ + include_name + ".dart' as " + named_import + ";" + "\n"; } } @@ -395,8 +392,8 @@ void t_dart_generator::generate_dart_library() { ofstream_with_content_based_conditional_update f_library; f_library.open(f_library_name.c_str()); - f_library << autogen_comment() << endl; - f_library << "library " << library_prefix_ << library_name_ << ";" << endl2; + f_library << autogen_comment() << '\n'; + f_library << "library " << library_prefix_ << library_name_ << ";" << '\n' << '\n'; f_library << library_exports_; f_library.close(); @@ -409,7 +406,7 @@ void t_dart_generator::export_class_to_library(string file_name, string class_na } else { subdir = library_name_; } - library_exports_ += "export '" + subdir + "/" + file_name + ".dart' show " + class_name + ";" + endl; + library_exports_ += "export '" + subdir + "/" + file_name + ".dart' show " + class_name + ";" + "\n"; } void t_dart_generator::generate_dart_pubspec() { @@ -417,30 +414,30 @@ void t_dart_generator::generate_dart_pubspec() { ofstream_with_content_based_conditional_update f_pubspec; f_pubspec.open(f_pubspec_name.c_str()); - indent(f_pubspec) << "name: " << library_name_ << endl; - indent(f_pubspec) << "version: 0.0.1" << endl; - indent(f_pubspec) << "description: Autogenerated by Thrift Compiler" << endl; - f_pubspec << endl; + indent(f_pubspec) << "name: " << library_name_ << '\n'; + indent(f_pubspec) << "version: 0.0.1" << '\n'; + indent(f_pubspec) << "description: Autogenerated by Thrift Compiler" << '\n'; + f_pubspec << '\n'; - indent(f_pubspec) << "environment:" << endl; + indent(f_pubspec) << "environment:" << '\n'; indent_up(); - indent(f_pubspec) << "sdk: '>=1.24.3 <3.0.0'" << endl; + indent(f_pubspec) << "sdk: '>=1.24.3 <3.0.0'" << '\n'; indent_down(); - f_pubspec << endl; + f_pubspec << '\n'; - indent(f_pubspec) << "dependencies:" << endl; + indent(f_pubspec) << "dependencies:" << '\n'; indent_up(); if (pubspec_lib_.empty()) { // default to relative path within working directory, which works for tests - indent(f_pubspec) << "thrift: # ^" << dart_thrift_version << endl; + indent(f_pubspec) << "thrift: # ^" << dart_thrift_version << '\n'; indent_up(); - indent(f_pubspec) << "path: ../../../../lib/dart" << endl; + indent(f_pubspec) << "path: ../../../../lib/dart" << '\n'; indent_down(); } else { const vector lines = split(pubspec_lib_, '|'); for (const auto & line : lines) { - indent(f_pubspec) << line << endl; + indent(f_pubspec) << line << '\n'; } } @@ -448,14 +445,14 @@ void t_dart_generator::generate_dart_pubspec() { const vector& includes = program_->get_includes(); for (auto include : includes) { string include_name = find_library_name(include); - indent(f_pubspec) << include_name << ":" << endl; + indent(f_pubspec) << include_name << ":" << '\n'; indent_up(); - indent(f_pubspec) << "path: ../" << include_name << endl; + indent(f_pubspec) << "path: ../" << include_name << '\n'; indent_down(); } indent_down(); - f_pubspec << endl; + f_pubspec << '\n'; f_pubspec.close(); } @@ -483,7 +480,7 @@ void t_dart_generator::generate_enum(t_enum* tenum) { f_enum.open(f_enum_name.c_str()); // Comment and add library - f_enum << autogen_comment() << dart_library(file_name) << endl; + f_enum << autogen_comment() << dart_library(file_name) << '\n'; string class_name = tenum->get_name(); export_class_to_library(file_name, class_name); @@ -495,34 +492,34 @@ void t_dart_generator::generate_enum(t_enum* tenum) { for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { int value = (*c_iter)->get_value(); indent(f_enum) << "static const int " << (*c_iter)->get_name() << " = " << value << ";" - << endl; + << '\n'; } // Create a static Set with all valid values for this enum - f_enum << endl; + f_enum << '\n'; - indent(f_enum) << "static final Set VALID_VALUES = new Set.from([" << endl; + indent(f_enum) << "static final Set VALID_VALUES = new Set.from([" << '\n'; indent_up(); bool firstValue = true; for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { // populate set indent(f_enum) << (firstValue ? "" : ", "); - f_enum << (*c_iter)->get_name() << endl; + f_enum << (*c_iter)->get_name() << '\n'; firstValue = false; } indent_down(); - indent(f_enum) << "]);" << endl; + indent(f_enum) << "]);" << '\n'; - indent(f_enum) << "static final Map VALUES_TO_NAMES = {" << endl; + indent(f_enum) << "static final Map VALUES_TO_NAMES = {" << '\n'; indent_up(); firstValue = true; for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { indent(f_enum) << (firstValue ? "" : ", "); - f_enum << (*c_iter)->get_name() << ": '" << (*c_iter)->get_name() << "'" << endl; + f_enum << (*c_iter)->get_name() << ": '" << (*c_iter)->get_name() << "'" << '\n'; firstValue = false; } indent_down(); - indent(f_enum) << "};" << endl; + indent(f_enum) << "};" << '\n'; scope_down(f_enum); // end class @@ -545,8 +542,8 @@ void t_dart_generator::generate_consts(std::vector consts) { f_consts.open(f_consts_name.c_str()); // Print header - f_consts << autogen_comment() << dart_library(file_name) << endl; - f_consts << dart_thrift_imports() << endl; + f_consts << autogen_comment() << dart_library(file_name) << '\n'; + f_consts << dart_thrift_imports() << '\n'; export_class_to_library(file_name, class_name); indent(f_consts) << "class " << class_name; @@ -559,7 +556,7 @@ void t_dart_generator::generate_consts(std::vector consts) { (*c_iter)->get_type(), (*c_iter)->get_value(), false); - f_consts << endl; + f_consts << '\n'; } scope_down(f_consts); @@ -585,13 +582,13 @@ void t_dart_generator::print_const_value(std::ostream& out, } string v2 = render_const_value(out, name, type, value); out << name; - out << " = " << v2 << ";" << endl << endl; + out << " = " << v2 << ";" << '\n' << '\n'; } else if (type->is_enum()) { if (!defval) { out << type_name(type) << " "; } out << name; - out << " = " << value->get_integer() << ";" << endl << endl; + out << " = " << value->get_integer() << ";" << '\n' << '\n'; } else if (type->is_struct() || type->is_xception()) { const vector& fields = ((t_struct*)type)->get_members(); vector::const_iterator f_iter; @@ -610,11 +607,11 @@ void t_dart_generator::print_const_value(std::ostream& out, throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string(); } string val = render_const_value(out, name, field_type, v_iter->second); - out << endl; + out << '\n'; indent(out) << ".." << v_iter->first->get_string() << " = " << val; } indent_down(); - out << ";" << endl; + out << ";" << '\n'; } else if (type->is_map()) { if (!defval) { out << type_name(type) << " "; @@ -630,11 +627,11 @@ void t_dart_generator::print_const_value(std::ostream& out, for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string key = render_const_value(out, name, ktype, v_iter->first); string val = render_const_value(out, name, vtype, v_iter->second); - indent(out) << key << ": " << val << "," << endl; + indent(out) << key << ": " << val << "," << '\n'; } - scope_down(out, ";" + endl); + scope_down(out, string(";") + "\n"); - out << endl; + out << '\n'; } else if (type->is_list() || type->is_set()) { if (!defval) { out << type_name(type) << " "; @@ -642,10 +639,10 @@ void t_dart_generator::print_const_value(std::ostream& out, out << name << " = "; t_type* etype; if (type->is_list()) { - out << "[" << endl; + out << "[" << '\n'; etype = ((t_list*)type)->get_elem_type(); } else { - out << "new " << type_name(type) << ".from([" << endl; + out << "new " << type_name(type) << ".from([" << '\n'; etype = ((t_set*)type)->get_elem_type(); } const vector& val = value->get_list(); @@ -654,14 +651,14 @@ void t_dart_generator::print_const_value(std::ostream& out, indent_up(); for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string val = render_const_value(out, name, etype, *v_iter); - indent(out) << val << "," << endl; + indent(out) << val << "," << '\n'; } indent_down(); if (type->is_list()) { - indent(out) << "];" << endl; + indent(out) << "];" << '\n'; } else { - indent(out) << "]);" << endl; + indent(out) << "]);" << '\n'; } } else { @@ -707,7 +704,7 @@ string t_dart_generator::render_const_value(ostream& out, } else { string t = tmp("tmp"); print_const_value(out, t, type, value, true); - out << endl; + out << '\n'; render << t; } @@ -744,11 +741,11 @@ void t_dart_generator::generate_dart_struct(t_struct* tstruct, bool is_exception ofstream_with_content_based_conditional_update f_struct; f_struct.open(f_struct_name.c_str()); - f_struct << autogen_comment() << dart_library(file_name) << endl; + f_struct << autogen_comment() << dart_library(file_name) << '\n'; string imports; - f_struct << dart_thrift_imports() << endl; + f_struct << dart_thrift_imports() << '\n'; generate_dart_struct_definition(f_struct, tstruct, is_exception, false, file_name); @@ -785,7 +782,7 @@ void t_dart_generator::generate_dart_struct_definition(ostream& out, scope_up(out); indent(out) << "static final TStruct _STRUCT_DESC = new TStruct(\"" << class_name - << "\");" << endl; + << "\");" << '\n'; // Members are public for -dart, private for -dartbean const vector& members = tstruct->get_members(); @@ -795,33 +792,33 @@ void t_dart_generator::generate_dart_struct_definition(ostream& out, indent(out) << "static final TField _" << constant_name((*m_iter)->get_name()) << "_FIELD_DESC = new TField(\"" << (*m_iter)->get_name() << "\", " << type_to_enum((*m_iter)->get_type()) << ", " << (*m_iter)->get_key() << ");" - << endl; + << '\n'; } - out << endl; + out << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { generate_dart_doc(out, *m_iter); indent(out) << type_name((*m_iter)->get_type()) + " _" - << get_member_name((*m_iter)->get_name()) << init_value(*m_iter) << ";" << endl; + << get_member_name((*m_iter)->get_name()) << init_value(*m_iter) << ";" << '\n'; indent(out) << "static const int " << upcase_string((*m_iter)->get_name()) - << " = " << (*m_iter)->get_key() << ";" << endl; + << " = " << (*m_iter)->get_key() << ";" << '\n'; } - out << endl; + out << '\n'; // Inner Isset class if (members.size() > 0) { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if (!type_can_be_null((*m_iter)->get_type())) { string field_name = get_member_name((*m_iter)->get_name()); - indent(out) << "bool __isset_" << field_name << " = false;" << endl; + indent(out) << "bool __isset_" << field_name << " = false;" << '\n'; } } } - out << endl; + out << '\n'; // Default constructor indent(out) << tstruct->get_name() << "()"; @@ -838,7 +835,7 @@ void t_dart_generator::generate_dart_struct_definition(ostream& out, } } scope_down(out); - out << endl; + out << '\n'; generate_dart_bean_boilerplate(out, tstruct); generate_generic_field_getters(out, tstruct); @@ -854,7 +851,7 @@ void t_dart_generator::generate_dart_struct_definition(ostream& out, generate_dart_struct_tostring(out, tstruct); generate_dart_validator(out, tstruct); scope_down(out); - out << endl; + out << '\n'; } /** @@ -870,20 +867,20 @@ void t_dart_generator::generate_dart_struct_reader(ostream& out, t_struct* tstru vector::const_iterator f_iter; // Declare stack tmp variables and read struct header - indent(out) << "TField field;" << endl; - indent(out) << "iprot.readStructBegin();" << endl; + indent(out) << "TField field;" << '\n'; + indent(out) << "iprot.readStructBegin();" << '\n'; // Loop over reading in fields indent(out) << "while (true)"; scope_up(out); // Read beginning field marker - indent(out) << "field = iprot.readFieldBegin();" << endl; + indent(out) << "field = iprot.readFieldBegin();" << '\n'; // Check for field STOP marker and break indent(out) << "if (field.type == TType.STOP)"; scope_up(out); - indent(out) << "break;" << endl; + indent(out) << "break;" << '\n'; scope_down(out); // Switch statement on the field we are reading @@ -892,7 +889,7 @@ void t_dart_generator::generate_dart_struct_reader(ostream& out, t_struct* tstru // Generate deserialization code for known cases for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - indent(out) << "case " << upcase_string((*f_iter)->get_name()) << ":" << endl; + indent(out) << "case " << upcase_string((*f_iter)->get_name()) << ":" << '\n'; indent_up(); indent(out) << "if (field.type == " << type_to_enum((*f_iter)->get_type()) << ")"; @@ -903,33 +900,33 @@ void t_dart_generator::generate_dart_struct_reader(ostream& out, t_struct* tstru scope_down(out, " else"); scope_up(out); - indent(out) << "TProtocolUtil.skip(iprot, field.type);" << endl; + indent(out) << "TProtocolUtil.skip(iprot, field.type);" << '\n'; scope_down(out); - indent(out) << "break;" << endl; + indent(out) << "break;" << '\n'; indent_down(); } // In the default case we skip the field - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent_up(); - indent(out) << "TProtocolUtil.skip(iprot, field.type);" << endl; - indent(out) << "break;" << endl; + indent(out) << "TProtocolUtil.skip(iprot, field.type);" << '\n'; + indent(out) << "break;" << '\n'; indent_down(); scope_down(out); // Read field end marker - indent(out) << "iprot.readFieldEnd();" << endl; + indent(out) << "iprot.readFieldEnd();" << '\n'; scope_down(out); - indent(out) << "iprot.readStructEnd();" << endl2; + indent(out) << "iprot.readStructEnd();" << '\n' << '\n'; // in non-beans style, check for required fields of primitive type // (which can be checked here but not in the general validate method) indent(out) << "// check for required fields of primitive type, which can't be " - "checked in the validate method" << endl; + "checked in the validate method" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED && !type_can_be_null((*f_iter)->get_type())) { string field_name = get_member_name((*f_iter)->get_name()); @@ -937,15 +934,15 @@ void t_dart_generator::generate_dart_struct_reader(ostream& out, t_struct* tstru scope_up(out); indent(out) << " throw new TProtocolError(TProtocolErrorType.UNKNOWN, \"Required field '" << field_name - << "' was not found in serialized data! Struct: \" + toString());" << endl; - scope_down(out, endl2); + << "' was not found in serialized data! Struct: \" + toString());" << '\n'; + scope_down(out, "\n\n"); } } // performs various checks (e.g. check that all required fields are set) - indent(out) << "validate();" << endl; + indent(out) << "validate();" << '\n'; - scope_down(out, endl2); + scope_down(out, "\n\n"); } // generates dart method to perform various checks @@ -957,7 +954,7 @@ void t_dart_generator::generate_dart_validator(ostream& out, t_struct* tstruct) const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; - indent(out) << "// check for required fields" << endl; + indent(out) << "// check for required fields" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) { string field_name = get_member_name((*f_iter)->get_name()); @@ -966,17 +963,17 @@ void t_dart_generator::generate_dart_validator(ostream& out, t_struct* tstruct) scope_up(out); indent(out) << "throw new TProtocolError(TProtocolErrorType.UNKNOWN, \"Required field '" << field_name << "' was not present! Struct: \" + toString());" - << endl; + << '\n'; scope_down(out); } else { indent(out) << "// alas, we cannot check '" << field_name - << "' because it's a primitive and you chose the non-beans generator." << endl; + << "' because it's a primitive and you chose the non-beans generator." << '\n'; } } } // check that fields of type enum have valid values - indent(out) << "// check that fields of type enum have valid values" << endl; + indent(out) << "// check that fields of type enum have valid values" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { t_field* field = (*f_iter); t_type* type = field->get_type(); @@ -988,12 +985,12 @@ void t_dart_generator::generate_dart_validator(ostream& out, t_struct* tstruct) scope_up(out); indent(out) << "throw new TProtocolError(TProtocolErrorType.UNKNOWN, \"The field '" << field_name << "' has been assigned the invalid value " - << "$" << field_name << "\");" << endl; + << "$" << field_name << "\");" << '\n'; scope_down(out); } } - scope_down(out, endl2); + scope_down(out, "\n\n"); } /** @@ -1009,9 +1006,9 @@ void t_dart_generator::generate_dart_struct_writer(ostream& out, t_struct* tstru vector::const_iterator f_iter; // performs various checks (e.g. check that all required fields are set) - indent(out) << "validate();" << endl2; + indent(out) << "validate();" << '\n' << '\n'; - indent(out) << "oprot.writeStructBegin(_STRUCT_DESC);" << endl; + indent(out) << "oprot.writeStructBegin(_STRUCT_DESC);" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { string field_name = get_member_name((*f_iter)->get_name()); @@ -1027,13 +1024,13 @@ void t_dart_generator::generate_dart_struct_writer(ostream& out, t_struct* tstru } indent(out) << "oprot.writeFieldBegin(_" << constant_name((*f_iter)->get_name()) - << "_FIELD_DESC);" << endl; + << "_FIELD_DESC);" << '\n'; // Write field contents generate_serialize_field(out, *f_iter, "this."); // Write field closer - indent(out) << "oprot.writeFieldEnd();" << endl; + indent(out) << "oprot.writeFieldEnd();" << '\n'; if (null_allowed) { scope_down(out); @@ -1043,10 +1040,10 @@ void t_dart_generator::generate_dart_struct_writer(ostream& out, t_struct* tstru } } // Write the struct map - indent(out) << "oprot.writeFieldStop();" << endl << indent() << "oprot.writeStructEnd();" - << endl; + indent(out) << "oprot.writeFieldStop();" << '\n' << indent() << "oprot.writeStructEnd();" + << '\n'; - scope_down(out, endl2); + scope_down(out, "\n\n"); } /** @@ -1064,7 +1061,7 @@ void t_dart_generator::generate_dart_struct_result_writer(ostream& out, t_struct const vector& fields = tstruct->get_sorted_members(); vector::const_iterator f_iter; - indent(out) << "oprot.writeStructBegin(_STRUCT_DESC);" << endl2; + indent(out) << "oprot.writeStructBegin(_STRUCT_DESC);" << '\n' << '\n'; bool first = true; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { @@ -1079,23 +1076,23 @@ void t_dart_generator::generate_dart_struct_result_writer(ostream& out, t_struct scope_up(out); indent(out) << "oprot.writeFieldBegin(_" << constant_name((*f_iter)->get_name()) - << "_FIELD_DESC);" << endl; + << "_FIELD_DESC);" << '\n'; // Write field contents generate_serialize_field(out, *f_iter, "this."); // Write field closer - indent(out) << "oprot.writeFieldEnd();" << endl; + indent(out) << "oprot.writeFieldEnd();" << '\n'; scope_down(out, ""); } - out << endl; + out << '\n'; // Write the struct map - indent(out) << "oprot.writeFieldStop();" << endl << indent() - << "oprot.writeStructEnd();" << endl; + indent(out) << "oprot.writeFieldStop();" << '\n' << indent() + << "oprot.writeStructEnd();" << '\n'; - scope_down(out, endl2); + scope_down(out, "\n\n"); } void t_dart_generator::generate_generic_field_getters(std::ostream& out, @@ -1113,19 +1110,19 @@ void t_dart_generator::generate_generic_field_getters(std::ostream& out, t_field* field = *f_iter; std::string field_name = get_member_name(field->get_name()); - indent(out) << "case " << upcase_string(field_name) << ":" << endl; + indent(out) << "case " << upcase_string(field_name) << ":" << '\n'; indent_up(); - indent(out) << "return this." << field_name << ";" << endl; + indent(out) << "return this." << field_name << ";" << '\n'; indent_down(); } - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent_up(); - indent(out) << "throw new ArgumentError(\"Field $fieldID doesn't exist!\");" << endl; + indent(out) << "throw new ArgumentError(\"Field $fieldID doesn't exist!\");" << '\n'; indent_down(); scope_down(out); // switch - scope_down(out, endl2); // method + scope_down(out, "\n\n"); // method } void t_dart_generator::generate_generic_field_setters(std::ostream& out, @@ -1145,31 +1142,31 @@ void t_dart_generator::generate_generic_field_setters(std::ostream& out, t_field* field = *f_iter; std::string field_name = get_member_name(field->get_name()); - indent(out) << "case " << upcase_string(field_name) << ":" << endl; + indent(out) << "case " << upcase_string(field_name) << ":" << '\n'; indent_up(); indent(out) << "if (value == null)"; scope_up(out); - indent(out) << "unset" << get_cap_name(field_name) << "();" << endl; + indent(out) << "unset" << get_cap_name(field_name) << "();" << '\n'; scope_down(out, " else"); scope_up(out); - indent(out) << "this." << field_name << " = value;" << endl; + indent(out) << "this." << field_name << " = value;" << '\n'; scope_down(out); - indent(out) << "break;" << endl; + indent(out) << "break;" << '\n'; indent_down(); - out << endl; + out << '\n'; } - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent_up(); - indent(out) << "throw new ArgumentError(\"Field $fieldID doesn't exist!\");" << endl; + indent(out) << "throw new ArgumentError(\"Field $fieldID doesn't exist!\");" << '\n'; indent_down(); scope_down(out); // switch - scope_down(out, endl2); // method + scope_down(out, "\n\n"); // method } // Creates a generic isSet method that takes the field number as argument @@ -1179,7 +1176,7 @@ void t_dart_generator::generate_generic_isset_method(std::ostream& out, t_struct // create the isSet method indent(out) << "// Returns true if field corresponding to fieldID is set (has been assigned a " - "value) and false otherwise" << endl; + "value) and false otherwise" << '\n'; indent(out) << "bool isSet(int fieldID)"; scope_up(out); @@ -1188,19 +1185,19 @@ void t_dart_generator::generate_generic_isset_method(std::ostream& out, t_struct for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { t_field* field = *f_iter; - indent(out) << "case " << upcase_string(field->get_name()) << ":" << endl; + indent(out) << "case " << upcase_string(field->get_name()) << ":" << '\n'; indent_up(); - indent(out) << "return " << generate_isset_check(field) << ";" << endl; + indent(out) << "return " << generate_isset_check(field) << ";" << '\n'; indent_down(); } - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent_up(); - indent(out) << "throw new ArgumentError(\"Field $fieldID doesn't exist!\");" << endl; + indent(out) << "throw new ArgumentError(\"Field $fieldID doesn't exist!\");" << '\n'; indent_down(); scope_down(out); // switch - scope_down(out, endl2); // method + scope_down(out, "\n\n"); // method } /** @@ -1219,37 +1216,37 @@ void t_dart_generator::generate_dart_bean_boilerplate(ostream& out, std::string field_name = get_member_name(field->get_name()); std::string cap_name = get_cap_name(field_name); - indent(out) << "// " << field_name << endl; + indent(out) << "// " << field_name << '\n'; // Simple getter generate_dart_doc(out, field); - indent(out) << type_name(type) << " get " << field_name << " => this._" << field_name << ";" << endl2; + indent(out) << type_name(type) << " get " << field_name << " => this._" << field_name << ";" << '\n' << '\n'; // Simple setter generate_dart_doc(out, field); indent(out) << "set " << field_name << "(" << type_name(type) << " " << field_name << ")"; scope_up(out); - indent(out) << "this._" << field_name << " = " << field_name << ";" << endl; + indent(out) << "this._" << field_name << " = " << field_name << ";" << '\n'; generate_isset_set(out, field); - scope_down(out, endl2); + scope_down(out, "\n\n"); // isSet method indent(out) << "bool is" << get_cap_name("set") << cap_name << "()"; if (type_can_be_null(type)) { - out << " => this." << field_name << " != null;" << endl2; + out << " => this." << field_name << " != null;" << '\n' << '\n'; } else { - out << " => this.__isset_" << field_name << ";" << endl2; + out << " => this.__isset_" << field_name << ";" << '\n' << '\n'; } // Unsetter indent(out) << "unset" << cap_name << "()"; scope_up(out); if (type_can_be_null(type)) { - indent(out) << "this." << field_name << " = null;" << endl; + indent(out) << "this." << field_name << " = null;" << '\n'; } else { - indent(out) << "this.__isset_" << field_name << " = false;" << endl; + indent(out) << "this.__isset_" << field_name << " = false;" << '\n'; } - scope_down(out, endl2); + scope_down(out, "\n\n"); } } @@ -1264,7 +1261,7 @@ void t_dart_generator::generate_dart_struct_tostring(ostream& out, scope_up(out); indent(out) << "StringBuffer ret = new StringBuffer(\"" - << tstruct->get_name() << "(\");" << endl2; + << tstruct->get_name() << "(\");" << '\n' << '\n'; const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; @@ -1281,36 +1278,36 @@ void t_dart_generator::generate_dart_struct_tostring(ostream& out, std::string field_name = get_member_name(field->get_name()); if (!first) { - indent(out) << "ret.write(\", \");" << endl; + indent(out) << "ret.write(\", \");" << '\n'; } - indent(out) << "ret.write(\"" << field_name << ":\");" << endl; + indent(out) << "ret.write(\"" << field_name << ":\");" << '\n'; bool can_be_null = type_can_be_null(field->get_type()); if (can_be_null) { indent(out) << "if (this." << field_name << " == null)"; scope_up(out); - indent(out) << "ret.write(\"null\");" << endl; + indent(out) << "ret.write(\"null\");" << '\n'; scope_down(out, " else"); scope_up(out); } if (field->get_type()->is_binary()) { - indent(out) << "ret.write(\"BINARY\");" << endl; + indent(out) << "ret.write(\"BINARY\");" << '\n'; } else if (field->get_type()->is_enum()) { indent(out) << "String " << field_name << "_name = " << get_ttype_class_name(field->get_type()) - << ".VALUES_TO_NAMES[this." << field_name << "];" << endl; + << ".VALUES_TO_NAMES[this." << field_name << "];" << '\n'; indent(out) << "if (" << field_name << "_name != null)"; scope_up(out); - indent(out) << "ret.write(" << field_name << "_name);" << endl; - indent(out) << "ret.write(\" (\");" << endl; + indent(out) << "ret.write(" << field_name << "_name);" << '\n'; + indent(out) << "ret.write(\" (\");" << '\n'; scope_down(out); - indent(out) << "ret.write(this." << field_name << ");" << endl; + indent(out) << "ret.write(this." << field_name << ");" << '\n'; indent(out) << "if (" << field_name << "_name != null)"; scope_up(out); - indent(out) << "ret.write(\")\");" << endl; + indent(out) << "ret.write(\")\");" << '\n'; scope_down(out); } else { - indent(out) << "ret.write(this." << field_name << ");" << endl; + indent(out) << "ret.write(this." << field_name << ");" << '\n'; } if (can_be_null) { @@ -1320,15 +1317,15 @@ void t_dart_generator::generate_dart_struct_tostring(ostream& out, scope_down(out); } - out << endl; + out << '\n'; first = false; } - indent(out) << "ret.write(\")\");" << endl2; + indent(out) << "ret.write(\")\");" << '\n' << '\n'; - indent(out) << "return ret.toString();" << endl; + indent(out) << "return ret.toString();" << '\n'; - scope_down(out, endl2); + scope_down(out, "\n\n"); } /** @@ -1391,9 +1388,9 @@ void t_dart_generator::generate_service(t_service* tservice) { string f_service_name = src_dir_ + "/" + file_name + ".dart"; f_service_.open(f_service_name.c_str()); - f_service_ << autogen_comment() << dart_library(file_name) << endl; - f_service_ << service_imports() << dart_thrift_imports() << endl; - f_service_ << endl; + f_service_ << autogen_comment() << dart_library(file_name) << '\n'; + f_service_ << service_imports() << dart_thrift_imports() << '\n'; + f_service_ << '\n'; generate_service_interface(tservice); generate_service_client(tservice); @@ -1424,12 +1421,12 @@ void t_dart_generator::generate_service_interface(t_service* tservice) { vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { - f_service_ << endl; + f_service_ << '\n'; generate_dart_doc(f_service_, *f_iter); - indent(f_service_) << function_signature(*f_iter) << ";" << endl; + indent(f_service_) << function_signature(*f_iter) << ";" << '\n'; } - scope_down(f_service_, endl2); + scope_down(f_service_, "\n\n"); } /** @@ -1465,31 +1462,31 @@ void t_dart_generator::generate_service_client(t_service* tservice) { indent(f_service_) << "class " << class_name << extends_client << " implements " << service_name_; scope_up(f_service_); - f_service_ << endl; + f_service_ << '\n'; indent(f_service_) << class_name << "(TProtocol iprot, [TProtocol oprot = null])"; if (!extends.empty()) { indent_up(); - f_service_ << endl; - indent(f_service_) << ": super(iprot, oprot);" << endl; + f_service_ << '\n'; + indent(f_service_) << ": super(iprot, oprot);" << '\n'; indent_down(); } else { scope_up(f_service_); - indent(f_service_) << "_iprot = iprot;" << endl; - indent(f_service_) << "_oprot = (oprot == null) ? iprot : oprot;" << endl; + indent(f_service_) << "_iprot = iprot;" << '\n'; + indent(f_service_) << "_oprot = (oprot == null) ? iprot : oprot;" << '\n'; scope_down(f_service_); } - f_service_ << endl; + f_service_ << '\n'; if (extends.empty()) { - indent(f_service_) << "TProtocol _iprot;" << endl2; - indent(f_service_) << "TProtocol get iprot => _iprot;" << endl2; - indent(f_service_) << "TProtocol _oprot;" << endl2; - indent(f_service_) << "TProtocol get oprot => _oprot;" << endl2; - indent(f_service_) << "int _seqid = 0;" << endl2; - indent(f_service_) << "int get seqid => _seqid;" << endl2; - indent(f_service_) << "int nextSeqid() => ++_seqid;" << endl2; + indent(f_service_) << "TProtocol _iprot;" << '\n' << '\n'; + indent(f_service_) << "TProtocol get iprot => _iprot;" << '\n' << '\n'; + indent(f_service_) << "TProtocol _oprot;" << '\n' << '\n'; + indent(f_service_) << "TProtocol get oprot => _oprot;" << '\n' << '\n'; + indent(f_service_) << "int _seqid = 0;" << '\n' << '\n'; + indent(f_service_) << "int get seqid => _seqid;" << '\n' << '\n'; + indent(f_service_) << "int nextSeqid() => ++_seqid;" << '\n' << '\n'; } // Generate client method implementations @@ -1510,40 +1507,40 @@ void t_dart_generator::generate_service_client(t_service* tservice) { // Serialize the request indent(f_service_) << "oprot.writeMessageBegin(new TMessage(\"" << (*f_iter)->get_name() << "\", " << ((*f_iter)->is_oneway() ? "TMessageType.ONEWAY" : "TMessageType.CALL") - << ", nextSeqid()));" << endl; - indent(f_service_) << argsname << " args = new " << argsname << "();" << endl; + << ", nextSeqid()));" << '\n'; + indent(f_service_) << argsname << " args = new " << argsname << "();" << '\n'; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { string arg_field_name = get_member_name((*fld_iter)->get_name()); indent(f_service_) << "args." << arg_field_name << " = " - << arg_field_name << ";" << endl; + << arg_field_name << ";" << '\n'; } - indent(f_service_) << "args.write(oprot);" << endl; - indent(f_service_) << "oprot.writeMessageEnd();" << endl2; + indent(f_service_) << "args.write(oprot);" << '\n'; + indent(f_service_) << "oprot.writeMessageEnd();" << '\n' << '\n'; - indent(f_service_) << "await oprot.transport.flush();" << endl2; + indent(f_service_) << "await oprot.transport.flush();" << '\n' << '\n'; if (!(*f_iter)->is_oneway()) { - indent(f_service_) << "TMessage msg = iprot.readMessageBegin();" << endl; + indent(f_service_) << "TMessage msg = iprot.readMessageBegin();" << '\n'; indent(f_service_) << "if (msg.type == TMessageType.EXCEPTION)"; scope_up(f_service_); - indent(f_service_) << "TApplicationError error = TApplicationError.read(iprot);" << endl; - indent(f_service_) << "iprot.readMessageEnd();" << endl; - indent(f_service_) << "throw error;" << endl; - scope_down(f_service_, endl2); + indent(f_service_) << "TApplicationError error = TApplicationError.read(iprot);" << '\n'; + indent(f_service_) << "iprot.readMessageEnd();" << '\n'; + indent(f_service_) << "throw error;" << '\n'; + scope_down(f_service_, "\n\n"); string result_class = get_result_class_name((*f_iter)->get_name()); - indent(f_service_) << result_class << " result = new " << result_class << "();" << endl; - indent(f_service_) << "result.read(iprot);" << endl; - indent(f_service_) << "iprot.readMessageEnd();" << endl; + indent(f_service_) << result_class << " result = new " << result_class << "();" << '\n'; + indent(f_service_) << "result.read(iprot);" << '\n'; + indent(f_service_) << "iprot.readMessageEnd();" << '\n'; // Careful, only return _result if not a void function if (!(*f_iter)->get_returntype()->is_void()) { indent(f_service_) << "if (result." << generate_isset_check("success") << ")"; scope_up(f_service_); - indent(f_service_) << "return result.success;" << endl; - scope_down(f_service_, endl2); + indent(f_service_) << "return result.success;" << '\n'; + scope_down(f_service_, "\n\n"); } t_struct* xs = (*f_iter)->get_xceptions(); @@ -1553,23 +1550,23 @@ void t_dart_generator::generate_service_client(t_service* tservice) { string result_field_name = get_member_name((*x_iter)->get_name()); indent(f_service_) << "if (result." << result_field_name << " != null)"; scope_up(f_service_); - indent(f_service_) << "throw result." << result_field_name << ";" << endl; + indent(f_service_) << "throw result." << result_field_name << ";" << '\n'; scope_down(f_service_); } // If you get here it's an exception, unless a void function if ((*f_iter)->get_returntype()->is_void()) { - indent(f_service_) << "return;" << endl; + indent(f_service_) << "return;" << '\n'; } else { indent(f_service_) << "throw new TApplicationError(TApplicationErrorType.MISSING_RESULT, \"" - << (*f_iter)->get_name() << " failed: unknown result\");" << endl; + << (*f_iter)->get_name() << " failed: unknown result\");" << '\n'; } } - scope_down(f_service_, endl2); + scope_down(f_service_, "\n\n"); } - scope_down(f_service_, endl2); + scope_down(f_service_, "\n\n"); } /** @@ -1583,7 +1580,7 @@ void t_dart_generator::generate_service_server(t_service* tservice) { vector::iterator f_iter; // typedef - indent(f_service_) << "typedef void ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot);" << endl2; + indent(f_service_) << "typedef void ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot);" << '\n' << '\n'; // Extends stuff string extends = ""; @@ -1602,57 +1599,57 @@ void t_dart_generator::generate_service_server(t_service* tservice) { indent(f_service_) << class_name << "(" << service_name_ << " iface)"; if (!extends.empty()) { indent_up(); - f_service_ << endl; + f_service_ << '\n'; indent(f_service_) << ": super(iface)"; indent_down(); } scope_up(f_service_); if (extends.empty()) { - indent(f_service_) << "iface_ = iface;" << endl; + indent(f_service_) << "iface_ = iface;" << '\n'; } for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { indent(f_service_) << "PROCESS_MAP[\"" << (*f_iter)->get_name() - << "\"] = " << get_member_name((*f_iter)->get_name()) << ";" << endl; + << "\"] = " << get_member_name((*f_iter)->get_name()) << ";" << '\n'; } - scope_down(f_service_, endl2); + scope_down(f_service_, "\n\n"); - indent(f_service_) << service_name_ << " iface_;" << endl; + indent(f_service_) << service_name_ << " iface_;" << '\n'; if (extends.empty()) { - indent(f_service_) << "final Map PROCESS_MAP = {};" << endl; + indent(f_service_) << "final Map PROCESS_MAP = {};" << '\n'; } - f_service_ << endl; + f_service_ << '\n'; // Generate the server implementation indent(f_service_) << "bool process(TProtocol iprot, TProtocol oprot)"; scope_up(f_service_); - indent(f_service_) << "TMessage msg = iprot.readMessageBegin();" << endl; - indent(f_service_) << "ProcessFunction fn = PROCESS_MAP[msg.name];" << endl; + indent(f_service_) << "TMessage msg = iprot.readMessageBegin();" << '\n'; + indent(f_service_) << "ProcessFunction fn = PROCESS_MAP[msg.name];" << '\n'; indent(f_service_) << "if (fn == null)"; scope_up(f_service_); - indent(f_service_) << "TProtocolUtil.skip(iprot, TType.STRUCT);" << endl; - indent(f_service_) << "iprot.readMessageEnd();" << endl; + indent(f_service_) << "TProtocolUtil.skip(iprot, TType.STRUCT);" << '\n'; + indent(f_service_) << "iprot.readMessageEnd();" << '\n'; indent(f_service_) << "TApplicationError x = new TApplicationError(TApplicationErrorType.UNKNOWN_METHOD, " - "\"Invalid method name: '\"+msg.name+\"'\");" << endl; - indent(f_service_) << "oprot.writeMessageBegin(new TMessage(msg.name, TMessageType.EXCEPTION, msg.seqid));" << endl; - indent(f_service_) << "x.write(oprot);" << endl; - indent(f_service_) << "oprot.writeMessageEnd();" << endl; - indent(f_service_) << "oprot.transport.flush();" << endl; - indent(f_service_) << "return true;" << endl; + "\"Invalid method name: '\"+msg.name+\"'\");" << '\n'; + indent(f_service_) << "oprot.writeMessageBegin(new TMessage(msg.name, TMessageType.EXCEPTION, msg.seqid));" << '\n'; + indent(f_service_) << "x.write(oprot);" << '\n'; + indent(f_service_) << "oprot.writeMessageEnd();" << '\n'; + indent(f_service_) << "oprot.transport.flush();" << '\n'; + indent(f_service_) << "return true;" << '\n'; scope_down(f_service_); - indent(f_service_) << "fn(msg.seqid, iprot, oprot);" << endl; - indent(f_service_) << "return true;" << endl; - scope_down(f_service_, endl2); // process function + indent(f_service_) << "fn(msg.seqid, iprot, oprot);" << '\n'; + indent(f_service_) << "return true;" << '\n'; + scope_down(f_service_, "\n\n"); // process function // Generate the process subfunctions for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_process_function(tservice, *f_iter); } - scope_down(f_service_, endl2); // class + scope_down(f_service_, "\n\n"); // class } /** @@ -1700,16 +1697,16 @@ void t_dart_generator::generate_process_function(t_service* tservice, t_function string argsname = get_args_class_name(tfunction->get_name()); string resultname = get_result_class_name(tfunction->get_name()); - indent(f_service_) << argsname << " args = new " << argsname << "();" << endl; - indent(f_service_) << "args.read(iprot);" << endl; - indent(f_service_) << "iprot.readMessageEnd();" << endl; + indent(f_service_) << argsname << " args = new " << argsname << "();" << '\n'; + indent(f_service_) << "args.read(iprot);" << '\n'; + indent(f_service_) << "iprot.readMessageEnd();" << '\n'; t_struct* xs = tfunction->get_xceptions(); const std::vector& xceptions = xs->get_members(); vector::const_iterator x_iter; if (!tfunction->is_oneway()) { - indent(f_service_) << resultname << " result = new " << resultname << "();" << endl; + indent(f_service_) << resultname << " result = new " << resultname << "();" << '\n'; } if (!tfunction->is_oneway() && xceptions.size() > 0) { @@ -1736,7 +1733,7 @@ void t_dart_generator::generate_process_function(t_service* tservice, t_function } f_service_ << "args." << get_member_name((*f_iter)->get_name()); } - f_service_ << ");" << endl; + f_service_ << ");" << '\n'; if (!tfunction->is_oneway() && xceptions.size() > 0) { for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { @@ -1747,36 +1744,36 @@ void t_dart_generator::generate_process_function(t_service* tservice, t_function scope_up(f_service_); if (!tfunction->is_oneway()) { indent(f_service_) << "result." << result_field_name << " = " - << result_field_name << ";" << endl; + << result_field_name << ";" << '\n'; } } scope_down(f_service_, " "); f_service_ << "catch (th)"; scope_up(f_service_); - indent(f_service_) << "// Internal error" << endl; + indent(f_service_) << "// Internal error" << '\n'; indent(f_service_) << "TApplicationError x = new " "TApplicationError(TApplicationErrorType.INTERNAL_ERROR, \"Internal error processing " - << tfunction->get_name() << "\");" << endl; + << tfunction->get_name() << "\");" << '\n'; indent(f_service_) << "oprot.writeMessageBegin(new TMessage(\"" << tfunction->get_name() - << "\", TMessageType.EXCEPTION, seqid));" << endl; - indent(f_service_) << "x.write(oprot);" << endl; - indent(f_service_) << "oprot.writeMessageEnd();" << endl; - indent(f_service_) << "oprot.transport.flush();" << endl; - indent(f_service_) << "return;" << endl; + << "\", TMessageType.EXCEPTION, seqid));" << '\n'; + indent(f_service_) << "x.write(oprot);" << '\n'; + indent(f_service_) << "oprot.writeMessageEnd();" << '\n'; + indent(f_service_) << "oprot.transport.flush();" << '\n'; + indent(f_service_) << "return;" << '\n'; scope_down(f_service_); } if (tfunction->is_oneway()) { - indent(f_service_) << "return;" << endl; + indent(f_service_) << "return;" << '\n'; } else { indent(f_service_) << "oprot.writeMessageBegin(new TMessage(\"" << tfunction->get_name() - << "\", TMessageType.REPLY, seqid));" << endl; - indent(f_service_) << "result.write(oprot);" << endl; - indent(f_service_) << "oprot.writeMessageEnd();" << endl; - indent(f_service_) << "oprot.transport.flush();" << endl; + << "\", TMessageType.REPLY, seqid));" << '\n'; + indent(f_service_) << "result.write(oprot);" << '\n'; + indent(f_service_) << "oprot.writeMessageEnd();" << '\n'; + indent(f_service_) << "oprot.transport.flush();" << '\n'; } - scope_down(f_service_, endl2); + scope_down(f_service_, "\n\n"); } /** @@ -1840,7 +1837,7 @@ void t_dart_generator::generate_deserialize_field(ostream& out, t_field* tfield, } else if (type->is_enum()) { out << "readI32();"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", field_name.c_str(), @@ -1852,8 +1849,8 @@ void t_dart_generator::generate_deserialize_field(ostream& out, t_field* tfield, * Generates an unserializer for a struct, invokes read() */ void t_dart_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) { - indent(out) << prefix << " = new " << type_name(tstruct) << "();" << endl; - indent(out) << prefix << ".read(iprot);" << endl; + indent(out) << prefix << " = new " << type_name(tstruct) << "();" << '\n'; + indent(out) << prefix << ".read(iprot);" << '\n'; } /** @@ -1875,14 +1872,14 @@ void t_dart_generator::generate_deserialize_container(ostream& out, t_type* ttyp // Declare variables, read header if (ttype->is_map()) { - indent(out) << "TMap " << obj << " = iprot.readMapBegin();" << endl; + indent(out) << "TMap " << obj << " = iprot.readMapBegin();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "TSet " << obj << " = iprot.readSetBegin();" << endl; + indent(out) << "TSet " << obj << " = iprot.readSetBegin();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "TList " << obj << " = iprot.readListBegin();" << endl; + indent(out) << "TList " << obj << " = iprot.readListBegin();" << '\n'; } - indent(out) << prefix << " = new " << type_name(ttype) << "();" << endl; + indent(out) << prefix << " = new " << type_name(ttype) << "();" << '\n'; // For loop iterates over elements string i = tmp("_i"); @@ -1903,11 +1900,11 @@ void t_dart_generator::generate_deserialize_container(ostream& out, t_type* ttyp // Read container end if (ttype->is_map()) { - indent(out) << "iprot.readMapEnd();" << endl; + indent(out) << "iprot.readMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "iprot.readSetEnd();" << endl; + indent(out) << "iprot.readSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "iprot.readListEnd();" << endl; + indent(out) << "iprot.readListEnd();" << '\n'; } scope_down(out); @@ -1922,13 +1919,13 @@ void t_dart_generator::generate_deserialize_map_element(ostream& out, t_map* tma t_field fkey(tmap->get_key_type(), key); t_field fval(tmap->get_val_type(), val); - indent(out) << declare_field(&fkey) << endl; - indent(out) << declare_field(&fval) << endl; + indent(out) << declare_field(&fkey) << '\n'; + indent(out) << declare_field(&fval) << '\n'; generate_deserialize_field(out, &fkey); generate_deserialize_field(out, &fval); - indent(out) << prefix << "[" << key << "] = " << val << ";" << endl; + indent(out) << prefix << "[" << key << "] = " << val << ";" << '\n'; } /** @@ -1938,11 +1935,11 @@ void t_dart_generator::generate_deserialize_set_element(ostream& out, t_set* tse string elem = tmp("_elem"); t_field felem(tset->get_elem_type(), elem); - indent(out) << declare_field(&felem) << endl; + indent(out) << declare_field(&felem) << '\n'; generate_deserialize_field(out, &felem); - indent(out) << prefix << ".add(" << elem << ");" << endl; + indent(out) << prefix << ".add(" << elem << ");" << '\n'; } /** @@ -1954,11 +1951,11 @@ void t_dart_generator::generate_deserialize_list_element(ostream& out, string elem = tmp("_elem"); t_field felem(tlist->get_elem_type(), elem); - indent(out) << declare_field(&felem) << endl; + indent(out) << declare_field(&felem) << '\n'; generate_deserialize_field(out, &felem); - indent(out) << prefix << ".add(" << elem << ");" << endl; + indent(out) << prefix << ".add(" << elem << ");" << '\n'; } /** @@ -2022,7 +2019,7 @@ void t_dart_generator::generate_serialize_field(ostream& out, t_field* tfield, s } else if (type->is_enum()) { out << "writeI32(" << name << ");"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n", prefix.c_str(), @@ -2039,7 +2036,7 @@ void t_dart_generator::generate_serialize_field(ostream& out, t_field* tfield, s */ void t_dart_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) { (void)tstruct; - indent(out) << prefix << ".write(oprot);" << endl; + indent(out) << prefix << ".write(oprot);" << '\n'; } /** @@ -2056,14 +2053,14 @@ void t_dart_generator::generate_serialize_container(ostream& out, t_type* ttype, string iter = tmp("_key"); indent(out) << "oprot.writeMapBegin(new TMap(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << prefix << ".length));" - << endl; + << '\n'; } else if (ttype->is_set()) { indent(out) << "oprot.writeSetBegin(new TSet(" << type_to_enum(((t_set*)ttype)->get_elem_type()) - << ", " << prefix << ".length));" << endl; + << ", " << prefix << ".length));" << '\n'; } else if (ttype->is_list()) { indent(out) << "oprot.writeListBegin(new TList(" << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << prefix << ".length));" - << endl; + << '\n'; } string iter = tmp("elem"); @@ -2086,11 +2083,11 @@ void t_dart_generator::generate_serialize_container(ostream& out, t_type* ttype, scope_down(out); if (ttype->is_map()) { - indent(out) << "oprot.writeMapEnd();" << endl; + indent(out) << "oprot.writeMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "oprot.writeSetEnd();" << endl; + indent(out) << "oprot.writeSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "oprot.writeListEnd();" << endl; + indent(out) << "oprot.writeListEnd();" << '\n'; } scope_down(out); @@ -2496,7 +2493,7 @@ std::string t_dart_generator::generate_isset_check(std::string field_name) { void t_dart_generator::generate_isset_set(ostream& out, t_field* field) { if (!type_can_be_null(field->get_type())) { string field_name = get_member_name(field->get_name()); - indent(out) << "this.__isset_" << field_name << " = true;" << endl; + indent(out) << "this.__isset_" << field_name << " = true;" << '\n'; } } diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc index c5998365664..d5e8d5d2229 100644 --- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc @@ -53,8 +53,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - class t_delphi_generator : public t_oop_generator { public: t_delphi_generator(t_program* program, @@ -409,12 +407,12 @@ class t_delphi_generator : public t_oop_generator { const std::string DELPHI_KEYWORDS[81] = { // keywords - "and", "array", "as", "asm", "at", "automated", "begin", "case", "class", "const", "constructor", - "destructor", "dispinterface", "div", "do", "downto", "else", "end", "except", "exports", "file", - "finalization", "finally", "for", "function", "goto", "if", "implementation", "in", "inherited", - "initialization", "inline", "interface", "is", "label", "library", "mod", "nil", "not", "object", - "of", "on", "or", "out", "packed", "private", "procedure", "program", "property", "protected", - "public", "published", "raise", "record", "repeat", "resourcestring", "set", "shl", "shr", "string", + "and", "array", "as", "asm", "at", "automated", "begin", "case", "class", "const", "constructor", + "destructor", "dispinterface", "div", "do", "downto", "else", "end", "except", "exports", "file", + "finalization", "finally", "for", "function", "goto", "if", "implementation", "in", "inherited", + "initialization", "inline", "interface", "is", "label", "library", "mod", "nil", "not", "object", + "of", "on", "or", "out", "packed", "private", "procedure", "program", "property", "protected", + "public", "published", "raise", "record", "repeat", "resourcestring", "set", "shl", "shr", "string", "then", "threadvar", "to", "try", "type", "unit", "until", "uses", "var", "while", "with", "xor", // predefined types (lowercase!) "ansistring", "boolean", "double", "int64", "integer", "shortint", "smallint", "string", "unicodestring" @@ -427,19 +425,19 @@ class t_delphi_generator : public t_oop_generator { // reserved method names (lowercase!) const std::string DELPHI_RESERVED_METHOD[31] = { - "afterconstruction", "beforedestruction", "classinfo", "classname", "classnameis", "classparent", - "classtype", "cleanupinstance", "create", "defaulthandler", "destroy", "dispatch", "equals", - "fieldaddress", "free", "freeinstance", "gethashcode", "getinterface", "getinterfaceentry", - "getinterfacetable", "inheritsfrom", "initinstance", "instancesize", "methodaddress", "methodname", + "afterconstruction", "beforedestruction", "classinfo", "classname", "classnameis", "classparent", + "classtype", "cleanupinstance", "create", "defaulthandler", "destroy", "dispatch", "equals", + "fieldaddress", "free", "freeinstance", "gethashcode", "getinterface", "getinterfaceentry", + "getinterfacetable", "inheritsfrom", "initinstance", "instancesize", "methodaddress", "methodname", "newinstance", "read", "safecallexception", "tostring", "unitname", "write" }; // reserved exception class method names (lowercase!) const std::string DELPHI_RESERVED_METHOD_EXCEPTION[23] = { - "setinnerexception", "setstackinfo", "getstacktrace", "raisingexception", "createfmt", "createres", - "createresfmt", "createhelp", "createfmthelp", "createreshelp", "createresfmthelp", "getbaseexception", - "baseexception", "helpcontext", "innerexception", "message", "stacktrace", "stackinfo", - "getexceptionstackinfoproc", "getstackinfostringproc", "cleanupstackinfoproc", "raiseouterexception", + "setinnerexception", "setstackinfo", "getstacktrace", "raisingexception", "createfmt", "createres", + "createresfmt", "createhelp", "createfmthelp", "createreshelp", "createresfmthelp", "getbaseexception", + "baseexception", "helpcontext", "innerexception", "message", "stacktrace", "stackinfo", + "getexceptionstackinfoproc", "getstackinfostringproc", "cleanupstackinfoproc", "raiseouterexception", "throwouterexception" }; @@ -628,10 +626,10 @@ std::string t_delphi_generator::normalize_name(std::string name, } // neither reserved nor keyword? - if (!(b_reserved || b_keyword)) { + if (!(b_reserved || b_keyword)) { return name; } - + // apply the rule: old style '_' postfix or more modern '&' prefix? // underscore always on non-keywords or when explicitly asked via arg if( (!b_keyword) || old_names_ || b_force_underscore) { @@ -707,25 +705,25 @@ void t_delphi_generator::close_generator() { } unitname = normalize_name(unitname,false,false,true/*force underscore*/); - + std::string f_name = get_out_dir() + "/" + unitname + ".pas"; ofstream_with_content_based_conditional_update f_all; f_all.open(f_name); - f_all << autogen_comment() << endl; + f_all << autogen_comment() << '\n'; generate_delphi_doc(f_all, program_); - f_all << "unit " << unitname << ";" << endl << endl; - f_all << "{$WARN SYMBOL_DEPRECATED OFF}" << endl; + f_all << "unit " << unitname << ";" << '\n' << '\n'; + f_all << "{$WARN SYMBOL_DEPRECATED OFF}" << '\n'; if(com_types_) { - f_all << "{$MINENUMSIZE 4}" << endl; + f_all << "{$MINENUMSIZE 4}" << '\n'; } if(rtti_) { - f_all << "{$IFOPT M+} {$DEFINE TYPEINFO_WAS_ON} {$ELSE} {$UNDEF TYPEINFO_WAS_ON} {$ENDIF}" << endl; + f_all << "{$IFOPT M+} {$DEFINE TYPEINFO_WAS_ON} {$ELSE} {$UNDEF TYPEINFO_WAS_ON} {$ENDIF}" << '\n'; } - f_all << endl; - f_all << "interface" << endl << endl; - f_all << "uses" << endl; + f_all << '\n'; + f_all << "interface" << '\n' << '\n'; + f_all << "uses" << '\n'; indent_up(); @@ -733,12 +731,12 @@ void t_delphi_generator::close_generator() { for (s_iter = uses_list.begin(); s_iter != uses_list.end(); ++s_iter) { if (s_iter != uses_list.begin()) { f_all << ","; - f_all << endl; + f_all << '\n'; } indent(f_all) << *s_iter; } - f_all << ";" << endl << endl; + f_all << ";" << '\n' << '\n'; indent_down(); @@ -749,70 +747,70 @@ void t_delphi_generator::close_generator() { } } - f_all << "const" << endl; + f_all << "const" << '\n'; indent_up(); - indent(f_all) << "c" << tmp_unit << "_Option_Register_Types = " << (register_types_ ? "True" : "False") << ";" << endl; - indent(f_all) << "c" << tmp_unit << "_Option_ConstPrefix = " << (constprefix_ ? "True" : "False") << ";" << endl; - indent(f_all) << "c" << tmp_unit << "_Option_Events = " << (events_ ? "True" : "False") << ";" << endl; - indent(f_all) << "c" << tmp_unit << "_Option_XmlDoc = " << (xmldoc_ ? "True" : "False") << ";" << endl; - indent(f_all) << "c" << tmp_unit << "_Option_Async = " << (async_ ? "True" : "False") << ";" << endl; - indent(f_all) << "c" << tmp_unit << "_Option_COM_types = " << (com_types_ ? "True" : "False") << ";" << endl; - indent(f_all) << "c" << tmp_unit << "_Option_Old_Names = " << (old_names_ ? "True" : "False") << ";" << endl; - indent(f_all) << "c" << tmp_unit << "_Option_RTTI = " << (rtti_ ? "True" : "False") << ";" << endl; + indent(f_all) << "c" << tmp_unit << "_Option_Register_Types = " << (register_types_ ? "True" : "False") << ";" << '\n'; + indent(f_all) << "c" << tmp_unit << "_Option_ConstPrefix = " << (constprefix_ ? "True" : "False") << ";" << '\n'; + indent(f_all) << "c" << tmp_unit << "_Option_Events = " << (events_ ? "True" : "False") << ";" << '\n'; + indent(f_all) << "c" << tmp_unit << "_Option_XmlDoc = " << (xmldoc_ ? "True" : "False") << ";" << '\n'; + indent(f_all) << "c" << tmp_unit << "_Option_Async = " << (async_ ? "True" : "False") << ";" << '\n'; + indent(f_all) << "c" << tmp_unit << "_Option_COM_types = " << (com_types_ ? "True" : "False") << ";" << '\n'; + indent(f_all) << "c" << tmp_unit << "_Option_Old_Names = " << (old_names_ ? "True" : "False") << ";" << '\n'; + indent(f_all) << "c" << tmp_unit << "_Option_RTTI = " << (rtti_ ? "True" : "False") << ";" << '\n'; indent_down(); - f_all << endl; - f_all << "type" << endl; + f_all << '\n'; + f_all << "type" << '\n'; if (has_forward) { - f_all << s_forward_decr.str() << endl; + f_all << s_forward_decr.str() << '\n'; } if (has_enum) { - indent(f_all) << endl; - indent(f_all) << "{$SCOPEDENUMS ON}" << endl << endl; + indent(f_all) << '\n'; + indent(f_all) << "{$SCOPEDENUMS ON}" << '\n' << '\n'; f_all << s_enum.str(); - indent(f_all) << "{$SCOPEDENUMS OFF}" << endl << endl; + indent(f_all) << "{$SCOPEDENUMS OFF}" << '\n' << '\n'; } f_all << s_struct.str(); f_all << s_service.str(); f_all << s_const.str(); - f_all << "implementation" << endl << endl; + f_all << "implementation" << '\n' << '\n'; f_all << s_struct_impl.str(); f_all << s_service_impl.str(); f_all << s_const_impl.str(); if (register_types_) { - f_all << endl; - f_all << "// Type factory methods and registration" << endl; + f_all << '\n'; + f_all << "// Type factory methods and registration" << '\n'; f_all << s_type_factory_funcs.str(); - f_all << "procedure RegisterTypeFactories;" << endl; - f_all << "begin" << endl; + f_all << "procedure RegisterTypeFactories;" << '\n'; + f_all << "begin" << '\n'; f_all << s_type_factory_registration.str(); - f_all << "end;" << endl; + f_all << "end;" << '\n'; } - f_all << endl; + f_all << '\n'; string constants_class = make_constants_classname(); - f_all << "initialization" << endl; + f_all << "initialization" << '\n'; if (has_const) { - f_all << "{$IF CompilerVersion < 21.0} // D2010" << endl; - f_all << " " << constants_class.c_str() << "_Initialize;" << endl; - f_all << "{$IFEND}" << endl; + f_all << "{$IF CompilerVersion < 21.0} // D2010" << '\n'; + f_all << " " << constants_class.c_str() << "_Initialize;" << '\n'; + f_all << "{$IFEND}" << '\n'; } if (register_types_) { - f_all << " RegisterTypeFactories;" << endl; + f_all << " RegisterTypeFactories;" << '\n'; } - f_all << endl; + f_all << '\n'; - f_all << "finalization" << endl; + f_all << "finalization" << '\n'; if (has_const) { - f_all << "{$IF CompilerVersion < 21.0} // D2010" << endl; - f_all << " " << constants_class.c_str() << "_Finalize;" << endl; - f_all << "{$IFEND}" << endl; + f_all << "{$IF CompilerVersion < 21.0} // D2010" << '\n'; + f_all << " " << constants_class.c_str() << "_Finalize;" << '\n'; + f_all << "{$IFEND}" << '\n'; } - f_all << endl << endl; + f_all << '\n' << '\n'; - f_all << "end." << endl; + f_all << "end." << '\n'; f_all.close(); if (!typedefs_pending.empty()) { @@ -828,8 +826,8 @@ void t_delphi_generator::close_generator() { void t_delphi_generator::delphi_type_usings(ostream& out) { indent_up(); indent(out) << "Classes, SysUtils, Generics.Collections, Thrift.Collections, Thrift.Protocol," - << endl; - indent(out) << "Thrift.Transport;" << endl << endl; + << '\n'; + indent(out) << "Thrift.Transport;" << '\n' << '\n'; indent_down(); } @@ -842,7 +840,7 @@ void t_delphi_generator::generate_forward_declaration(t_struct* tstruct) { indent_up(); indent(s_forward_decr) << type_name(tstruct, tstruct->is_xception(), true) << " = " << what << ";" - << endl; + << '\n'; indent_down(); add_defined_type(tstruct); @@ -867,7 +865,7 @@ void t_delphi_generator::generate_typedef(t_typedef* ttypedef) { // if( ! container) // s_struct << "type "; //the "type A = type B" syntax leads to E2574 with generics - s_struct << type_name(ttypedef->get_type()) << ";" << endl << endl; + s_struct << type_name(ttypedef->get_type()) << ";" << '\n' << '\n'; indent_down(); add_defined_type(ttypedef); @@ -948,7 +946,7 @@ void t_delphi_generator::generate_enum(t_enum* tenum) { indent_up(); generate_delphi_doc(s_enum, tenum); indent(s_enum) << type_name(tenum, true, true) << " = " - << "(" << endl; + << "(" << '\n'; indent_up(); vector constants = tenum->get_constants(); if (constants.empty()) { @@ -959,15 +957,15 @@ void t_delphi_generator::generate_enum(t_enum* tenum) { int value = (*c_iter)->get_value(); if (c_iter != constants.begin()) { s_enum << ","; - s_enum << endl; + s_enum << '\n'; } generate_delphi_doc(s_enum, *c_iter); indent(s_enum) << normalize_name((*c_iter)->get_name()) << " = " << value; } } - s_enum << endl; + s_enum << '\n'; indent_down(); - indent(s_enum) << ");" << endl << endl; + indent(s_enum) << ");" << '\n' << '\n'; indent_down(); } @@ -981,7 +979,7 @@ std::string t_delphi_generator::make_pascal_string_literal(std::string value) { result << "'"; for (signed char const c: value) { if( (c >= 0) && (c < 32)) { // convert ctrl chars, but leave UTF-8 alone - result << "#" << (int)c; + result << "#" << (int)c; } else if (c == '\'') { result << "''"; // duplicate any single quotes we find } else { @@ -989,7 +987,7 @@ std::string t_delphi_generator::make_pascal_string_literal(std::string value) { } } result << "'"; - + return result.str(); } @@ -1037,8 +1035,8 @@ void t_delphi_generator::generate_consts(std::vector consts) { string constants_class = make_constants_classname(); indent_up(); - indent(s_const) << constants_class.c_str() << " = class" << endl; - indent(s_const) << "private" << endl; + indent(s_const) << constants_class.c_str() << " = class" << '\n'; + indent(s_const) << "private" << '\n'; indent_up(); vector::iterator c_iter; for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { @@ -1050,7 +1048,7 @@ void t_delphi_generator::generate_consts(std::vector consts) { } } indent_down(); - indent(s_const) << "public" << endl; + indent(s_const) << "public" << '\n'; indent_up(); for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { generate_delphi_doc(s_const, *c_iter); @@ -1059,12 +1057,12 @@ void t_delphi_generator::generate_consts(std::vector consts) { (*c_iter)->get_type(), (*c_iter)->get_value()); } - indent(s_const) << "{$IF CompilerVersion >= 21.0}" << endl; - indent(s_const) << "class constructor Create;" << endl; - indent(s_const) << "class destructor Destroy;" << endl; - indent(s_const) << "{$IFEND}" << endl; + indent(s_const) << "{$IF CompilerVersion >= 21.0}" << '\n'; + indent(s_const) << "class constructor Create;" << '\n'; + indent(s_const) << "class destructor Destroy;" << '\n'; + indent(s_const) << "{$IFEND}" << '\n'; indent_down(); - indent(s_const) << "end;" << endl << endl; + indent(s_const) << "end;" << '\n' << '\n'; indent_down(); std::ostringstream vars, code; @@ -1079,22 +1077,22 @@ void t_delphi_generator::generate_consts(std::vector consts) { } indent_down_impl(); - indent_impl(s_const_impl) << "{$IF CompilerVersion >= 21.0}" << endl; + indent_impl(s_const_impl) << "{$IF CompilerVersion >= 21.0}" << '\n'; indent_impl(s_const_impl) << "class constructor " << constants_class.c_str() << ".Create;" - << endl; + << '\n'; if (!vars.str().empty()) { - indent_impl(s_const_impl) << "var" << endl; + indent_impl(s_const_impl) << "var" << '\n'; s_const_impl << vars.str(); } - indent_impl(s_const_impl) << "begin" << endl; + indent_impl(s_const_impl) << "begin" << '\n'; if (!code.str().empty()) { s_const_impl << code.str(); } - indent_impl(s_const_impl) << "end;" << endl << endl; + indent_impl(s_const_impl) << "end;" << '\n' << '\n'; indent_impl(s_const_impl) << "class destructor " << constants_class.c_str() << ".Destroy;" - << endl; - indent_impl(s_const_impl) << "begin" << endl; + << '\n'; + indent_impl(s_const_impl) << "begin" << '\n'; indent_up_impl(); for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { if (const_needs_var((*c_iter)->get_type())) { @@ -1104,10 +1102,10 @@ void t_delphi_generator::generate_consts(std::vector consts) { (*c_iter)->get_value()); } } - indent_impl(s_const_impl) << "inherited;" << endl; + indent_impl(s_const_impl) << "inherited;" << '\n'; indent_down_impl(); - indent_impl(s_const_impl) << "end;" << endl; - indent_impl(s_const_impl) << "{$ELSE}" << endl; + indent_impl(s_const_impl) << "end;" << '\n'; + indent_impl(s_const_impl) << "{$ELSE}" << '\n'; vars.str(""); code.str(""); @@ -1124,19 +1122,19 @@ void t_delphi_generator::generate_consts(std::vector consts) { } indent_down_impl(); - indent_impl(s_const_impl) << "procedure " << constants_class.c_str() << "_Initialize;" << endl; + indent_impl(s_const_impl) << "procedure " << constants_class.c_str() << "_Initialize;" << '\n'; if (!vars.str().empty()) { - indent_impl(s_const_impl) << "var" << endl; + indent_impl(s_const_impl) << "var" << '\n'; s_const_impl << vars.str(); } - indent_impl(s_const_impl) << "begin" << endl; + indent_impl(s_const_impl) << "begin" << '\n'; if (!code.str().empty()) { s_const_impl << code.str(); } - indent_impl(s_const_impl) << "end;" << endl << endl; + indent_impl(s_const_impl) << "end;" << '\n' << '\n'; - indent_impl(s_const_impl) << "procedure " << constants_class.c_str() << "_Finalize;" << endl; - indent_impl(s_const_impl) << "begin" << endl; + indent_impl(s_const_impl) << "procedure " << constants_class.c_str() << "_Finalize;" << '\n'; + indent_impl(s_const_impl) << "begin" << '\n'; indent_up_impl(); for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { finalize_field(s_const_impl, @@ -1146,8 +1144,8 @@ void t_delphi_generator::generate_consts(std::vector consts) { constants_class); } indent_down_impl(); - indent_impl(s_const_impl) << "end;" << endl; - indent_impl(s_const_impl) << "{$IFEND}" << endl << endl; + indent_impl(s_const_impl) << "end;" << '\n'; + indent_impl(s_const_impl) << "{$IFEND}" << '\n' << '\n'; } void t_delphi_generator::print_const_def_value(std::ostream& vars, @@ -1183,7 +1181,7 @@ void t_delphi_generator::print_const_def_value(std::ostream& vars, string val = render_const_value(vars, out, name, field_type, v_iter->second); indent_impl(out) << cls_prefix << normalize_name(name) << "." << prop_name(v_iter->first->get_string(), type->is_xception()) - << " := " << val << ";" << endl; + << " := " << val << ";" << '\n'; } } else if (type->is_map()) { t_type* ktype = ((t_map*)type)->get_key_type(); @@ -1194,7 +1192,7 @@ void t_delphi_generator::print_const_def_value(std::ostream& vars, string key = render_const_value(vars, out, name, ktype, v_iter->first); string val = render_const_value(vars, out, name, vtype, v_iter->second); indent_impl(out) << cls_prefix << normalize_name(name) << "[" << key << "]" - << " := " << val << ";" << endl; + << " := " << val << ";" << '\n'; } } else if (type->is_list() || type->is_set()) { t_type* etype; @@ -1208,7 +1206,7 @@ void t_delphi_generator::print_const_def_value(std::ostream& vars, vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string val = render_const_value(vars, out, name, etype, *v_iter); - indent_impl(out) << cls_prefix << normalize_name(name) << ".Add(" << val << ");" << endl; + indent_impl(out) << cls_prefix << normalize_name(name) << ".Add(" << val << ");" << '\n'; } } } @@ -1218,7 +1216,7 @@ void t_delphi_generator::print_private_field(std::ostream& out, t_type* type, t_const_value* value) { (void)value; - indent(out) << "class var F" << name << ": " << type_name(type) << ";" << endl; + indent(out) << "class var F" << name << ": " << type_name(type) << ";" << '\n'; } bool t_delphi_generator::const_needs_var(t_type* type) { @@ -1236,11 +1234,11 @@ void t_delphi_generator::print_const_prop(std::ostream& out, (void)value; if (const_needs_var(type)) { indent(out) << "class property " << name << ": " << type_name(type) << " read F" << name << ";" - << endl; + << '\n'; } else { std::ostringstream vars; // dummy string v2 = render_const_value(vars, out, name, type, value); - indent(out) << "const " << name << " = " << v2 << ";" << endl; + indent(out) << "const " << name << " = " << v2 << ";" << '\n'; } } @@ -1257,14 +1255,14 @@ void t_delphi_generator::print_const_value(std::ostream& vars, if (truetype->is_base_type()) { // already done // string v2 = render_const_value( vars, out, name, type, value); - // indent_impl(out) << name << " := " << v2 << ";" << endl; + // indent_impl(out) << name << " := " << v2 << ";" << '\n'; } else if (truetype->is_enum()) { indent_impl(out) << name << " := " << type_name(type) << "." << value->get_identifier_name() - << ";" << endl; + << ";" << '\n'; } else { string typname; typname = type_name(truetype, true, false, type->is_xception(), type->is_xception()); - indent_impl(out) << name << " := " << typname << ".Create;" << endl; + indent_impl(out) << name << " := " << typname << ".Create;" << '\n'; print_const_def_value(vars, out, name, truetype, value); } } @@ -1341,7 +1339,7 @@ string t_delphi_generator::render_const_value(ostream& vars, render << type_name(type, false) << "." << value->get_identifier_name(); } else { string t = tmp("tmp"); - vars << " " << t << " : " << type_name(type) << ";" << endl; + vars << " " << t << " : " << type_name(type) << ";" << '\n'; print_const_value(vars, out, t, type, value); render << t; } @@ -1418,26 +1416,26 @@ void t_delphi_generator::generate_delphi_struct_impl(ostream& out, (*m_iter)->get_value()); if ((*m_iter)->get_req() != t_field::T_REQUIRED) { indent_impl(code) << prop_name((*m_iter), is_exception, "F__isset_") << " := True;" - << endl; + << '\n'; } } } indent_down_impl(); indent_impl(out) << "constructor " << cls_prefix << cls_nm << "." - << "Create;" << endl; + << "Create;" << '\n'; if (!vars.str().empty()) { - out << "var" << endl; + out << "var" << '\n'; out << vars.str(); } - indent_impl(out) << "begin" << endl; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); if (is_exception && (!is_x_factory)) { - indent_impl(out) << "inherited Create('');" << endl; + indent_impl(out) << "inherited Create('');" << '\n'; } else { - indent_impl(out) << "inherited;" << endl; + indent_impl(out) << "inherited;" << '\n'; } if (!code.str().empty()) { @@ -1445,28 +1443,28 @@ void t_delphi_generator::generate_delphi_struct_impl(ostream& out, } indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; + indent_impl(out) << "end;" << '\n' << '\n'; if ((members.size() > 0) && is_exception && (!is_x_factory)) { indent_impl(out) << "constructor " << cls_prefix << cls_nm << "." << "Create(" << constructor_argument_list(tstruct, indent_impl()) << ");" - << endl; - indent_impl(out) << "begin" << endl; + << '\n'; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); - indent_impl(out) << "Create;" << endl; + indent_impl(out) << "Create;" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { string propname = prop_name((*m_iter)->get_name(), is_exception); string param_name = constructor_param_name((*m_iter)->get_name()); - indent_impl(out) << propname << " := " << param_name << ";" << endl; + indent_impl(out) << propname << " := " << param_name << ";" << '\n'; } - indent_impl(out) << "UpdateMessageProperty;" << endl; + indent_impl(out) << "UpdateMessageProperty;" << '\n'; indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; + indent_impl(out) << "end;" << '\n' << '\n'; } indent_impl(out) << "destructor " << cls_prefix << cls_nm << "." - << "Destroy;" << endl; - indent_impl(out) << "begin" << endl; + << "Destroy;" << '\n'; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -1477,46 +1475,46 @@ void t_delphi_generator::generate_delphi_struct_impl(ostream& out, finalize_field(out, prop_name(*m_iter, is_exception), t, (*m_iter)->get_value()); } - indent_impl(out) << "inherited;" << endl; + indent_impl(out) << "inherited;" << '\n'; indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; + indent_impl(out) << "end;" << '\n' << '\n'; if (is_exception && (!is_x_factory)) { indent_impl(out) << "function " << cls_prefix << cls_nm << "." << exception_factory_name - << ": I" << exception_factory_name << ";" << endl; - indent_impl(out) << "begin" << endl; + << ": I" << exception_factory_name << ";" << '\n'; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); - indent_impl(out) << "if F" << exception_factory_name << " = nil" << endl; - indent_impl(out) << "then F" << exception_factory_name << " := T" << exception_factory_name << "Impl.Create;" << endl << endl; - indent_impl(out) << "result := F" << exception_factory_name << ";" << endl; + indent_impl(out) << "if F" << exception_factory_name << " = nil" << '\n'; + indent_impl(out) << "then F" << exception_factory_name << " := T" << exception_factory_name << "Impl.Create;" << '\n' << '\n'; + indent_impl(out) << "result := F" << exception_factory_name << ";" << '\n'; indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; - indent_impl(out) << "function " << cls_prefix << cls_nm << ".QueryInterface(const IID: TGUID; out Obj): HRESULT;" << endl; - indent_impl(out) << "begin" << endl; + indent_impl(out) << "end;" << '\n' << '\n'; + indent_impl(out) << "function " << cls_prefix << cls_nm << ".QueryInterface(const IID: TGUID; out Obj): HRESULT;" << '\n'; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); - indent_impl(out) << "if GetInterface(IID, Obj)" << endl; - indent_impl(out) << "then result := S_OK" << endl; - indent_impl(out) << "else result := E_NOINTERFACE;" << endl; + indent_impl(out) << "if GetInterface(IID, Obj)" << '\n'; + indent_impl(out) << "then result := S_OK" << '\n'; + indent_impl(out) << "else result := E_NOINTERFACE;" << '\n'; indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; - indent_impl(out) << "function " << cls_prefix << cls_nm << "._AddRef: Integer;" << endl; - indent_impl(out) << "begin" << endl; + indent_impl(out) << "end;" << '\n' << '\n'; + indent_impl(out) << "function " << cls_prefix << cls_nm << "._AddRef: Integer;" << '\n'; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); - indent_impl(out) << "result := -1; // not refcounted" << endl; + indent_impl(out) << "result := -1; // not refcounted" << '\n'; indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; - indent_impl(out) << "function " << cls_prefix << cls_nm << "._Release: Integer;" << endl; - indent_impl(out) << "begin" << endl; + indent_impl(out) << "end;" << '\n' << '\n'; + indent_impl(out) << "function " << cls_prefix << cls_nm << "._Release: Integer;" << '\n'; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); - indent_impl(out) << "result := -1; // not refcounted" << endl; + indent_impl(out) << "result := -1; // not refcounted" << '\n'; indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; + indent_impl(out) << "end;" << '\n' << '\n'; } if (tstruct->is_union()) { indent_impl(out) << "procedure " << cls_prefix << cls_nm << "." - << "ClearUnionValues;" << endl; - indent_impl(out) << "begin" << endl; + << "ClearUnionValues;" << '\n'; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_type* t = (*m_iter)->get_type(); @@ -1536,7 +1534,7 @@ void t_delphi_generator::generate_delphi_struct_impl(ostream& out, exception_factory_name); } indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; + indent_impl(out) << "end;" << '\n' << '\n'; } for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -1601,12 +1599,12 @@ void t_delphi_generator::generate_delphi_struct_type_factory(ostream& out, print_delphi_struct_type_factory_func(out, tstruct); out << ": "; out << struct_intf_name; - out << ";" << endl; - out << "begin" << endl; + out << ";" << '\n'; + out << "begin" << '\n'; indent_up(); - indent(out) << "Result := " << cls_nm << ".Create;" << endl; + indent(out) << "Result := " << cls_nm << ".Create;" << '\n'; indent_down(); - out << "end;" << endl << endl; + out << "end;" << '\n' << '\n'; } void t_delphi_generator::generate_delphi_struct_type_factory_registration(ostream& out, @@ -1628,7 +1626,7 @@ void t_delphi_generator::generate_delphi_struct_type_factory_registration(ostrea indent(out) << " TypeRegistry.RegisterTypeFactory<" << struct_intf_name << ">("; print_delphi_struct_type_factory_func(out, tstruct); out << ");"; - out << endl; + out << '\n'; } void t_delphi_generator::generate_delphi_struct_definition(ostream& out, @@ -1662,11 +1660,11 @@ void t_delphi_generator::generate_delphi_struct_definition(ostream& out, generate_delphi_doc(out, tstruct); if(rtti_) { - indent(out) << "{$TYPEINFO ON}" << endl; - indent(out) << "{$RTTI EXPLICIT METHODS([vcPublic, vcPublished]) PROPERTIES([vcPublic, vcPublished])}" << endl; - indent(out) << struct_intf_name << " = interface(IBaseWithTypeInfo)" << endl; + indent(out) << "{$TYPEINFO ON}" << '\n'; + indent(out) << "{$RTTI EXPLICIT METHODS([vcPublic, vcPublished]) PROPERTIES([vcPublic, vcPublished])}" << '\n'; + indent(out) << struct_intf_name << " = interface(IBaseWithTypeInfo)" << '\n'; } else { - indent(out) << struct_intf_name << " = interface(IBase)" << endl; + indent(out) << struct_intf_name << " = interface(IBase)" << '\n'; } indent_up(); @@ -1678,20 +1676,20 @@ void t_delphi_generator::generate_delphi_struct_definition(ostream& out, } if (is_x_factory) { - out << endl; - indent(out) << "// Create Exception Object" << endl; - indent(out) << "function CreateException: " << type_name(tstruct, true, true) << ";" << endl; + out << '\n'; + indent(out) << "// Create Exception Object" << '\n'; + indent(out) << "function CreateException: " << type_name(tstruct, true, true) << ";" << '\n'; } if (members.size() > 0) { - out << endl; + out << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { generate_property(out, *m_iter, true, is_exception); } } if (members.size() > 0) { - out << endl; + out << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() != t_field::T_REQUIRED) { generate_delphi_isset_reader_writer_definition(out, *m_iter, is_exception); @@ -1700,22 +1698,22 @@ void t_delphi_generator::generate_delphi_struct_definition(ostream& out, } if (members.size() > 0) { - out << endl; + out << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() != t_field::T_REQUIRED) { isset_name = prop_name(*m_iter, is_exception, "__isset_"); indent(out) << "property " << isset_name << ": System.Boolean read Get" << isset_name << " write Set" << isset_name << ";" - << endl; + << '\n'; } } } indent_down(); - indent(out) << "end;" << endl; + indent(out) << "end;" << '\n'; if(rtti_) { - indent(out) << "{$IFNDEF TYPEINFO_WAS_ON} {$TYPEINFO OFF} {$ENDIF}" << endl; + indent(out) << "{$IFNDEF TYPEINFO_WAS_ON} {$TYPEINFO OFF} {$ENDIF}" << '\n'; } - indent(out) << endl; + indent(out) << '\n'; } generate_delphi_doc(out, tstruct); @@ -1729,40 +1727,40 @@ void t_delphi_generator::generate_delphi_struct_definition(ostream& out, } else { out << "TInterfacedObject, IBase, ISupportsToString, " << struct_intf_name; } - out << ")" << endl; + out << ")" << '\n'; if (is_exception && (!is_x_factory)) { - indent(out) << "public" << endl; + indent(out) << "public" << '\n'; indent_up(); - indent(out) << "type" << endl; + indent(out) << "type" << '\n'; indent_up(); generate_delphi_struct_definition(out, tstruct, is_exception, in_class, is_result, true); indent_down(); indent_down(); } - indent(out) << "private" << endl; + indent(out) << "private" << '\n'; indent_up(); if (is_exception && (!is_x_factory)) { - indent(out) << "F" << exception_factory_name << " :" << struct_intf_name << ";" << endl << endl; + indent(out) << "F" << exception_factory_name << " :" << struct_intf_name << ";" << '\n' << '\n'; } for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - indent(out) << declare_field(*m_iter, false, "F", is_exception) << endl; + indent(out) << declare_field(*m_iter, false, "F", is_exception) << '\n'; } if (members.size() > 0) { - indent(out) << endl; + indent(out) << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() != t_field::T_REQUIRED) { isset_name = prop_name(*m_iter, is_exception, "F__isset_"); - indent(out) << isset_name << ": System.Boolean;" << endl; + indent(out) << isset_name << ": System.Boolean;" << '\n'; } } } - indent(out) << endl; + indent(out) << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { generate_delphi_property_reader_definition(out, *m_iter, is_exception); @@ -1770,106 +1768,106 @@ void t_delphi_generator::generate_delphi_struct_definition(ostream& out, } if (tstruct->is_union()) { - out << endl; - indent(out) << "// Clear values(for union's property setter)" << endl; - indent(out) << "procedure ClearUnionValues;" << endl; + out << '\n'; + indent(out) << "// Clear values(for union's property setter)" << '\n'; + indent(out) << "procedure ClearUnionValues;" << '\n'; } if (members.size() > 0) { - out << endl; + out << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() != t_field::T_REQUIRED) { isset_name = prop_name(*m_iter, is_exception, "__isset_"); - indent(out) << "function Get" << isset_name << ": System.Boolean;" << endl; - indent(out) << "procedure Set" << isset_name << "( const value : System.Boolean);" << endl; + indent(out) << "function Get" << isset_name << ": System.Boolean;" << '\n'; + indent(out) << "procedure Set" << isset_name << "( const value : System.Boolean);" << '\n'; } } } if (is_exception && (!is_x_factory)) { - out << endl; + out << '\n'; indent_down(); - indent(out) << "strict protected" << endl; - indent_up(); - indent(out) << "function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;" << endl; - indent(out) << "function _AddRef: Integer; stdcall;" << endl; - indent(out) << "function _Release: Integer; stdcall;" << endl; - out << endl; + indent(out) << "strict protected" << '\n'; + indent_up(); + indent(out) << "function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;" << '\n'; + indent(out) << "function _AddRef: Integer; stdcall;" << '\n'; + indent(out) << "function _Release: Integer; stdcall;" << '\n'; + out << '\n'; } indent_down(); - indent(out) << "public" << endl; + indent(out) << "public" << '\n'; indent_up(); if ((members.size() > 0) && is_exception && (!is_x_factory)) { - indent(out) << "constructor Create; overload;" << endl; + indent(out) << "constructor Create; overload;" << '\n'; indent(out) << "constructor Create(" << constructor_argument_list(tstruct, indent()) - << "); overload;" << endl; + << "); overload;" << '\n'; } else { - indent(out) << "constructor Create;" << endl; + indent(out) << "constructor Create;" << '\n'; } - indent(out) << "destructor Destroy; override;" << endl; + indent(out) << "destructor Destroy; override;" << '\n'; - out << endl; - indent(out) << "function ToString: string; override;" << endl; + out << '\n'; + indent(out) << "function ToString: string; override;" << '\n'; if (is_exception && (!is_x_factory)) { - out << endl; - indent(out) << "// Exception Factory" << endl; - indent(out) << "function " << exception_factory_name << ": " << struct_intf_name << ";" << endl; + out << '\n'; + indent(out) << "// Exception Factory" << '\n'; + indent(out) << "function " << exception_factory_name << ": " << struct_intf_name << ";" << '\n'; } - out << endl; - indent(out) << "// IBase" << endl; - indent(out) << "procedure Read( const iprot: IProtocol);" << endl; - indent(out) << "procedure Write( const oprot: IProtocol);" << endl; + out << '\n'; + indent(out) << "// IBase" << '\n'; + indent(out) << "procedure Read( const iprot: IProtocol);" << '\n'; + indent(out) << "procedure Write( const oprot: IProtocol);" << '\n'; if (is_exception && is_x_factory) { - out << endl; - indent(out) << "// Create Exception Object" << endl; - indent(out) << "function CreateException: " << type_name(tstruct, true, true) << ";" << endl; + out << '\n'; + indent(out) << "// Create Exception Object" << '\n'; + indent(out) << "function CreateException: " << type_name(tstruct, true, true) << ";" << '\n'; } if (members.size() > 0) { - out << endl; - indent(out) << "// Properties" << endl; + out << '\n'; + indent(out) << "// Properties" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { generate_property(out, *m_iter, true, is_exception); } } if (members.size() > 0) { - out << endl; - indent(out) << "// isset" << endl; + out << '\n'; + indent(out) << "// isset" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() != t_field::T_REQUIRED) { isset_name = prop_name(*m_iter, is_exception, "__isset_"); indent(out) << "property " << isset_name << ": System.Boolean read Get" << isset_name << " write Set" << isset_name << ";" - << endl; + << '\n'; } } } indent_down(); - indent(out) << "end;" << endl << endl; + indent(out) << "end;" << '\n' << '\n'; } void t_delphi_generator::generate_service(t_service* tservice) { indent_up(); generate_delphi_doc(s_service, tservice); - indent(s_service) << normalize_clsnm(service_name_, "T") << " = class" << endl; - indent(s_service) << "public" << endl; + indent(s_service) << normalize_clsnm(service_name_, "T") << " = class" << '\n'; + indent(s_service) << "public" << '\n'; indent_up(); - indent(s_service) << "type" << endl; + indent(s_service) << "type" << '\n'; generate_service_interface(tservice); generate_service_client(tservice); generate_service_server(tservice); generate_service_helpers(tservice); indent_down(); indent_down(); - indent(s_service) << "end;" << endl; - indent(s_service) << endl; + indent(s_service) << "end;" << '\n'; + indent(s_service) << '\n'; indent_down(); } @@ -1893,9 +1891,9 @@ void t_delphi_generator::generate_service_interface(t_service* tservice, bool fo extends = type_name(tservice->get_extends(), true, true); extends_iface = extends + "." + iface_name; generate_delphi_doc(s_service, tservice); - indent(s_service) << iface_name << " = interface(" << extends_iface << ")" << endl; + indent(s_service) << iface_name << " = interface(" << extends_iface << ")" << '\n'; } else { - indent(s_service) << iface_name << " = interface" << endl; + indent(s_service) << iface_name << " = interface" << '\n'; } indent_up(); @@ -1904,10 +1902,10 @@ void t_delphi_generator::generate_service_interface(t_service* tservice, bool fo vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_delphi_doc(s_service, *f_iter); - indent(s_service) << function_signature(*f_iter, for_async) << endl; + indent(s_service) << function_signature(*f_iter, for_async) << '\n'; } indent_down(); - indent(s_service) << "end;" << endl << endl; + indent(s_service) << "end;" << '\n' << '\n'; indent_down(); } @@ -1921,7 +1919,7 @@ void t_delphi_generator::generate_guid(std::ostream& out) { std::wstring guid_wstr(guid_chars); std::wstring_convert> convert; std::string guid_str = convert.to_bytes(guid_wstr); - indent(out) << "['" << guid_str << "']" << endl; + indent(out) << "['" << guid_str << "']" << '\n'; } } #else @@ -1955,78 +1953,78 @@ void t_delphi_generator::generate_service_client(t_service* tservice) { extends = type_name(tservice->get_extends(), true, true); extends_client = extends + ".TClient"; } - indent(s_service) << "TClient = class( " << extends_client << ", " << implements << ")" << endl; + indent(s_service) << "TClient = class( " << extends_client << ", " << implements << ")" << '\n'; - indent(s_service) << "public" << endl; + indent(s_service) << "public" << '\n'; indent_up(); - indent(s_service) << "constructor Create( prot: IProtocol); overload;" << endl; + indent(s_service) << "constructor Create( prot: IProtocol); overload;" << '\n'; indent_impl(s_service_impl) << "constructor " << normalize_clsnm(service_name_, "T") - << ".TClient.Create( prot: IProtocol);" << endl; - indent_impl(s_service_impl) << "begin" << endl; + << ".TClient.Create( prot: IProtocol);" << '\n'; + indent_impl(s_service_impl) << "begin" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "Create( prot, prot );" << endl; + indent_impl(s_service_impl) << "Create( prot, prot );" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl << endl; + indent_impl(s_service_impl) << "end;" << '\n' << '\n'; indent(s_service) - << "constructor Create( const iprot: IProtocol; const oprot: IProtocol); overload;" << endl; + << "constructor Create( const iprot: IProtocol; const oprot: IProtocol); overload;" << '\n'; indent_impl(s_service_impl) << "constructor " << normalize_clsnm(service_name_, "T") << ".TClient.Create( const iprot: IProtocol; const oprot: IProtocol);" - << endl; - indent_impl(s_service_impl) << "begin" << endl; + << '\n'; + indent_impl(s_service_impl) << "begin" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "inherited Create;" << endl; - indent_impl(s_service_impl) << "iprot_ := iprot;" << endl; - indent_impl(s_service_impl) << "oprot_ := oprot;" << endl; + indent_impl(s_service_impl) << "inherited Create;" << '\n'; + indent_impl(s_service_impl) << "iprot_ := iprot;" << '\n'; + indent_impl(s_service_impl) << "oprot_ := oprot;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl << endl; + indent_impl(s_service_impl) << "end;" << '\n' << '\n'; indent_down(); if (extends.empty()) { - indent(s_service) << "protected" << endl; + indent(s_service) << "protected" << '\n'; indent_up(); - indent(s_service) << "iprot_: IProtocol;" << endl; - indent(s_service) << "oprot_: IProtocol;" << endl; - indent(s_service) << "seqid_: System.Integer;" << endl; + indent(s_service) << "iprot_: IProtocol;" << '\n'; + indent(s_service) << "oprot_: IProtocol;" << '\n'; + indent(s_service) << "seqid_: System.Integer;" << '\n'; indent_down(); - indent(s_service) << "public" << endl; + indent(s_service) << "public" << '\n'; indent_up(); - indent(s_service) << "property InputProtocol: IProtocol read iprot_;" << endl; - indent(s_service) << "property OutputProtocol: IProtocol read oprot_;" << endl; + indent(s_service) << "property InputProtocol: IProtocol read iprot_;" << '\n'; + indent(s_service) << "property OutputProtocol: IProtocol read oprot_;" << '\n'; indent_down(); } vector functions = tservice->get_functions(); vector::const_iterator f_iter; - indent(s_service) << "protected" << endl; + indent(s_service) << "protected" << '\n'; indent_up(); - indent(s_service) << "// Iface" << endl; + indent(s_service) << "// Iface" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { string funname = (*f_iter)->get_name(); generate_delphi_doc(s_service, *f_iter); - indent(s_service) << function_signature(*f_iter, false) << endl; + indent(s_service) << function_signature(*f_iter, false) << '\n'; } if( async_) { - indent(s_service) << endl; - indent(s_service) << "// IAsync" << endl; + indent(s_service) << '\n'; + indent(s_service) << "// IAsync" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { string funname = (*f_iter)->get_name(); generate_delphi_doc(s_service, *f_iter); - indent(s_service) << function_signature(*f_iter, true) << endl; + indent(s_service) << function_signature(*f_iter, true) << '\n'; } } indent_down(); - indent(s_service) << "public" << endl; + indent(s_service) << "public" << '\n'; indent_up(); string full_cls = normalize_clsnm(service_name_, "T") + ".TClient"; @@ -2044,20 +2042,20 @@ void t_delphi_generator::generate_service_client(t_service* tservice) { bool for_async = (mode != 0); mode--; - indent_impl(s_service_impl) << function_signature(*f_iter, for_async, full_cls) << endl; - indent_impl(s_service_impl) << "begin" << endl; + indent_impl(s_service_impl) << function_signature(*f_iter, for_async, full_cls) << '\n'; + indent_impl(s_service_impl) << "begin" << '\n'; indent_up_impl(); t_type* ttype = (*f_iter)->get_returntype(); if( for_async) { if (is_void(ttype)) { // Delphi forces us to specify a type with IFuture, so we use Integer=0 for void methods - indent_impl(s_service_impl) << "result := TTask.Future(function: System.Integer" << endl; + indent_impl(s_service_impl) << "result := TTask.Future(function: System.Integer" << '\n'; } else { string rettype = type_name(ttype, false, true, false, true); - indent_impl(s_service_impl) << "result := TTask.Future<" << rettype << ">(function: " << rettype << endl; + indent_impl(s_service_impl) << "result := TTask.Future<" << rettype << ">(function: " << rettype << '\n'; } - indent_impl(s_service_impl) << "begin" << endl; + indent_impl(s_service_impl) << "begin" << '\n'; indent_up_impl(); } @@ -2072,26 +2070,26 @@ void t_delphi_generator::generate_service_client(t_service* tservice) { } s_service_impl << normalize_name((*fld_iter)->get_name()); } - s_service_impl << ");" << endl; + s_service_impl << ");" << '\n'; if (!(*f_iter)->is_oneway()) { s_service_impl << indent_impl(); if (!(*f_iter)->get_returntype()->is_void()) { s_service_impl << "Result := "; } - s_service_impl << "recv_" << funname << "();" << endl; + s_service_impl << "recv_" << funname << "();" << '\n'; } if( for_async) { if (is_void(ttype)) { - indent_impl(s_service_impl) << "Result := 0;" << endl; // no IFuture in Delphi + indent_impl(s_service_impl) << "Result := 0;" << '\n'; // no IFuture in Delphi } indent_down_impl(); - indent_impl(s_service_impl) << "end);" << endl; + indent_impl(s_service_impl) << "end);" << '\n'; } indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl << endl; + indent_impl(s_service_impl) << "end;" << '\n' << '\n'; } t_function send_function(g_type_void, @@ -2105,41 +2103,41 @@ void t_delphi_generator::generate_service_client(t_service* tservice) { string argsvar = tmp("_args"); string msgvar = tmp("_msg"); - indent(s_service) << function_signature(&send_function, false) << endl; - indent_impl(s_service_impl) << function_signature(&send_function, false, full_cls) << endl; - indent_impl(s_service_impl) << "var" << endl; + indent(s_service) << function_signature(&send_function, false) << '\n'; + indent_impl(s_service_impl) << function_signature(&send_function, false, full_cls) << '\n'; + indent_impl(s_service_impl) << "var" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << argsvar << " : " << args_intfnm << ";" << endl; - indent_impl(s_service_impl) << msgvar << " : Thrift.Protocol.TThriftMessage;" << endl; + indent_impl(s_service_impl) << argsvar << " : " << args_intfnm << ";" << '\n'; + indent_impl(s_service_impl) << msgvar << " : Thrift.Protocol.TThriftMessage;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "begin" << endl; + indent_impl(s_service_impl) << "begin" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "seqid_ := seqid_ + 1;" << endl; + indent_impl(s_service_impl) << "seqid_ := seqid_ + 1;" << '\n'; indent_impl(s_service_impl) << "Thrift.Protocol.Init( " << msgvar << ", '" << funname << "', " << ((*f_iter)->is_oneway() ? "TMessageType.Oneway" : "TMessageType.Call") - << ", seqid_);" << endl; + << ", seqid_);" << '\n'; - indent_impl(s_service_impl) << "oprot_.WriteMessageBegin( " << msgvar << " );" << endl; - indent_impl(s_service_impl) << argsvar << " := " << args_clsnm << "Impl.Create();" << endl; + indent_impl(s_service_impl) << "oprot_.WriteMessageBegin( " << msgvar << " );" << '\n'; + indent_impl(s_service_impl) << argsvar << " := " << args_clsnm << "Impl.Create();" << '\n'; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { indent_impl(s_service_impl) << argsvar << "." << prop_name(*fld_iter) << " := " << normalize_name((*fld_iter)->get_name()) << ";" - << endl; + << '\n'; } - indent_impl(s_service_impl) << argsvar << ".Write(oprot_);" << endl; + indent_impl(s_service_impl) << argsvar << ".Write(oprot_);" << '\n'; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { indent_impl(s_service_impl) << argsvar << "." << prop_name(*fld_iter) - << " := " << empty_value((*fld_iter)->get_type()) << ";" << endl; + << " := " << empty_value((*fld_iter)->get_type()) << ";" << '\n'; } - indent_impl(s_service_impl) << "oprot_.WriteMessageEnd();" << endl; - indent_impl(s_service_impl) << "oprot_.Transport.Flush();" << endl; + indent_impl(s_service_impl) << "oprot_.WriteMessageEnd();" << '\n'; + indent_impl(s_service_impl) << "oprot_.Transport.Flush();" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl << endl; + indent_impl(s_service_impl) << "end;" << '\n' << '\n'; if (!(*f_iter)->is_oneway()) { string org_resultname = (*f_iter)->get_name() + "_result"; @@ -2159,72 +2157,72 @@ void t_delphi_generator::generate_service_client(t_service* tservice) { string appexvar = tmp("_ax"); string retvar = tmp("_ret"); - indent(s_service) << function_signature(&recv_function, false) << endl; - indent_impl(s_service_impl) << function_signature(&recv_function, false, full_cls) << endl; - indent_impl(s_service_impl) << "var" << endl; + indent(s_service) << function_signature(&recv_function, false) << '\n'; + indent_impl(s_service_impl) << function_signature(&recv_function, false, full_cls) << '\n'; + indent_impl(s_service_impl) << "var" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << msgvar << " : Thrift.Protocol.TThriftMessage;" << endl; + indent_impl(s_service_impl) << msgvar << " : Thrift.Protocol.TThriftMessage;" << '\n'; if (xceptions.size() > 0) { - indent_impl(s_service_impl) << exceptvar << " : Exception;" << endl; + indent_impl(s_service_impl) << exceptvar << " : Exception;" << '\n'; } - indent_impl(s_service_impl) << appexvar << " : TApplicationException;" << endl; - indent_impl(s_service_impl) << retvar << " : " << result_intfnm << ";" << endl; + indent_impl(s_service_impl) << appexvar << " : TApplicationException;" << '\n'; + indent_impl(s_service_impl) << retvar << " : " << result_intfnm << ";" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "begin" << endl; + indent_impl(s_service_impl) << "begin" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << msgvar << " := iprot_.ReadMessageBegin();" << endl; - indent_impl(s_service_impl) << "if (" << msgvar << ".Type_ = TMessageType.Exception) then begin" << endl; + indent_impl(s_service_impl) << msgvar << " := iprot_.ReadMessageBegin();" << '\n'; + indent_impl(s_service_impl) << "if (" << msgvar << ".Type_ = TMessageType.Exception) then begin" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << appexvar << " := TApplicationException.Read(iprot_);" << endl; - indent_impl(s_service_impl) << "iprot_.ReadMessageEnd();" << endl; - indent_impl(s_service_impl) << "raise " << appexvar << ";" << endl; + indent_impl(s_service_impl) << appexvar << " := TApplicationException.Read(iprot_);" << '\n'; + indent_impl(s_service_impl) << "iprot_.ReadMessageEnd();" << '\n'; + indent_impl(s_service_impl) << "raise " << appexvar << ";" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl; + indent_impl(s_service_impl) << "end;" << '\n'; - indent_impl(s_service_impl) << retvar << " := " << result_clsnm << "Impl.Create();" << endl; - indent_impl(s_service_impl) << retvar << ".Read(iprot_);" << endl; - indent_impl(s_service_impl) << "iprot_.ReadMessageEnd();" << endl; + indent_impl(s_service_impl) << retvar << " := " << result_clsnm << "Impl.Create();" << '\n'; + indent_impl(s_service_impl) << retvar << ".Read(iprot_);" << '\n'; + indent_impl(s_service_impl) << "iprot_.ReadMessageEnd();" << '\n'; if (!(*f_iter)->get_returntype()->is_void()) { - indent_impl(s_service_impl) << "if (" << retvar << ".__isset_success) then begin" << endl; + indent_impl(s_service_impl) << "if (" << retvar << ".__isset_success) then begin" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "Result := " << retvar << ".Success;" << endl; + indent_impl(s_service_impl) << "Result := " << retvar << ".Success;" << '\n'; t_type* type = (*f_iter)->get_returntype(); if (type->is_struct() || type->is_xception() || type->is_map() || type->is_list() || type->is_set()) { - indent_impl(s_service_impl) << retvar << ".Success := nil;" << endl; + indent_impl(s_service_impl) << retvar << ".Success := nil;" << '\n'; } - indent_impl(s_service_impl) << "Exit;" << endl; + indent_impl(s_service_impl) << "Exit;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl; + indent_impl(s_service_impl) << "end;" << '\n'; } vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { indent_impl(s_service_impl) << "if (" << retvar << "." << prop_name(*x_iter, false, "__isset_") - << ") then begin" << endl; + << ") then begin" << '\n'; indent_up_impl(); indent_impl(s_service_impl) << exceptvar << " := " << retvar << "." << prop_name(*x_iter) - << ".CreateException;" << endl; - indent_impl(s_service_impl) << "raise " << exceptvar << ";" << endl; + << ".CreateException;" << '\n'; + indent_impl(s_service_impl) << "raise " << exceptvar << ";" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl; + indent_impl(s_service_impl) << "end;" << '\n'; } if (!(*f_iter)->get_returntype()->is_void()) { indent_impl(s_service_impl) << "raise TApplicationExceptionMissingResult.Create('" - << (*f_iter)->get_name() << " failed: unknown result');" << endl; + << (*f_iter)->get_name() << " failed: unknown result');" << '\n'; } indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl << endl; + indent_impl(s_service_impl) << "end;" << '\n' << '\n'; } } indent_down(); - indent(s_service) << "end;" << endl << endl; + indent(s_service) << "end;" << '\n' << '\n'; } void t_delphi_generator::generate_service_server(t_service* tservice) { @@ -2239,164 +2237,164 @@ void t_delphi_generator::generate_service_server(t_service* tservice) { if (tservice->get_extends() != nullptr) { extends = type_name(tservice->get_extends(), true, true); extends_processor = extends + ".TProcessorImpl"; - indent(s_service) << "TProcessorImpl = class(" << extends_processor << ", IProcessor)" << endl; + indent(s_service) << "TProcessorImpl = class(" << extends_processor << ", IProcessor)" << '\n'; } else { - indent(s_service) << "TProcessorImpl = class( TInterfacedObject, IProcessor)" << endl; + indent(s_service) << "TProcessorImpl = class( TInterfacedObject, IProcessor)" << '\n'; } - indent(s_service) << "public" << endl; + indent(s_service) << "public" << '\n'; indent_up(); - indent(s_service) << "constructor Create( iface_: Iface );" << endl; - indent(s_service) << "destructor Destroy; override;" << endl; + indent(s_service) << "constructor Create( iface_: Iface );" << '\n'; + indent(s_service) << "destructor Destroy; override;" << '\n'; indent_down(); - indent_impl(s_service_impl) << "constructor " << full_cls << ".Create( iface_: Iface );" << endl; - indent_impl(s_service_impl) << "begin" << endl; + indent_impl(s_service_impl) << "constructor " << full_cls << ".Create( iface_: Iface );" << '\n'; + indent_impl(s_service_impl) << "begin" << '\n'; indent_up_impl(); if (tservice->get_extends() != nullptr) { - indent_impl(s_service_impl) << "inherited Create( iface_);" << endl; + indent_impl(s_service_impl) << "inherited Create( iface_);" << '\n'; } else { - indent_impl(s_service_impl) << "inherited Create;" << endl; + indent_impl(s_service_impl) << "inherited Create;" << '\n'; } - indent_impl(s_service_impl) << "Self.iface_ := iface_;" << endl; + indent_impl(s_service_impl) << "Self.iface_ := iface_;" << '\n'; if (tservice->get_extends() != nullptr) { - indent_impl(s_service_impl) << "ASSERT( processMap_ <> nil); // inherited" << endl; + indent_impl(s_service_impl) << "ASSERT( processMap_ <> nil); // inherited" << '\n'; } else { indent_impl(s_service_impl) - << "processMap_ := TThriftDictionaryImpl.Create;" << endl; + << "processMap_ := TThriftDictionaryImpl.Create;" << '\n'; } for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { indent_impl(s_service_impl) << "processMap_.AddOrSetValue( '" << (*f_iter)->get_name() << "', " - << (*f_iter)->get_name() << "_Process);" << endl; + << (*f_iter)->get_name() << "_Process);" << '\n'; } indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl << endl; + indent_impl(s_service_impl) << "end;" << '\n' << '\n'; - indent_impl(s_service_impl) << "destructor " << full_cls << ".Destroy;" << endl; - indent_impl(s_service_impl) << "begin" << endl; + indent_impl(s_service_impl) << "destructor " << full_cls << ".Destroy;" << '\n'; + indent_impl(s_service_impl) << "begin" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "inherited;" << endl; + indent_impl(s_service_impl) << "inherited;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl << endl; + indent_impl(s_service_impl) << "end;" << '\n' << '\n'; - indent(s_service) << "private" << endl; + indent(s_service) << "private" << '\n'; indent_up(); - indent(s_service) << "iface_: Iface;" << endl; + indent(s_service) << "iface_: Iface;" << '\n'; indent_down(); if (tservice->get_extends() == nullptr) { - indent(s_service) << "protected" << endl; + indent(s_service) << "protected" << '\n'; indent_up(); - indent(s_service) << "type" << endl; + indent(s_service) << "type" << '\n'; indent_up(); indent(s_service) << "TProcessFunction = reference to procedure( seqid: System.Integer; const iprot: " "IProtocol; const oprot: IProtocol" - << (events_ ? "; const events : IRequestEvents" : "") << ");" << endl; + << (events_ ? "; const events : IRequestEvents" : "") << ");" << '\n'; indent_down(); indent_down(); - indent(s_service) << "protected" << endl; + indent(s_service) << "protected" << '\n'; indent_up(); - indent(s_service) << "processMap_: IThriftDictionary;" << endl; + indent(s_service) << "processMap_: IThriftDictionary;" << '\n'; indent_down(); } - indent(s_service) << "public" << endl; + indent(s_service) << "public" << '\n'; indent_up(); if (extends.empty()) { indent(s_service) << "function Process( const iprot: IProtocol; const oprot: IProtocol; const " - "events : IProcessorEvents): System.Boolean;" << endl; + "events : IProcessorEvents): System.Boolean;" << '\n'; } else { indent(s_service) << "function Process( const iprot: IProtocol; const oprot: IProtocol; const " - "events : IProcessorEvents): System.Boolean; reintroduce;" << endl; + "events : IProcessorEvents): System.Boolean; reintroduce;" << '\n'; } indent_impl(s_service_impl) << "function " << full_cls << ".Process( const iprot: IProtocol; " "const oprot: IProtocol; const events " - ": IProcessorEvents): System.Boolean;" << endl; + ": IProcessorEvents): System.Boolean;" << '\n'; ; - indent_impl(s_service_impl) << "var" << endl; + indent_impl(s_service_impl) << "var" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "msg : Thrift.Protocol.TThriftMessage;" << endl; - indent_impl(s_service_impl) << "fn : TProcessFunction;" << endl; - indent_impl(s_service_impl) << "x : TApplicationException;" << endl; + indent_impl(s_service_impl) << "msg : Thrift.Protocol.TThriftMessage;" << '\n'; + indent_impl(s_service_impl) << "fn : TProcessFunction;" << '\n'; + indent_impl(s_service_impl) << "x : TApplicationException;" << '\n'; if (events_) { - indent_impl(s_service_impl) << "context : IRequestEvents;" << endl; + indent_impl(s_service_impl) << "context : IRequestEvents;" << '\n'; } indent_down_impl(); - indent_impl(s_service_impl) << "begin" << endl; + indent_impl(s_service_impl) << "begin" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "try" << endl; + indent_impl(s_service_impl) << "try" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "msg := iprot.ReadMessageBegin();" << endl; - indent_impl(s_service_impl) << "fn := nil;" << endl; - indent_impl(s_service_impl) << "if not processMap_.TryGetValue(msg.Name, fn)" << endl; - indent_impl(s_service_impl) << "or not Assigned(fn) then begin" << endl; + indent_impl(s_service_impl) << "msg := iprot.ReadMessageBegin();" << '\n'; + indent_impl(s_service_impl) << "fn := nil;" << '\n'; + indent_impl(s_service_impl) << "if not processMap_.TryGetValue(msg.Name, fn)" << '\n'; + indent_impl(s_service_impl) << "or not Assigned(fn) then begin" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "TProtocolUtil.Skip(iprot, TType.Struct);" << endl; - indent_impl(s_service_impl) << "iprot.ReadMessageEnd();" << endl; + indent_impl(s_service_impl) << "TProtocolUtil.Skip(iprot, TType.Struct);" << '\n'; + indent_impl(s_service_impl) << "iprot.ReadMessageEnd();" << '\n'; indent_impl(s_service_impl) << "x := " "TApplicationExceptionUnknownMethod.Create(" - "'Invalid method name: ''' + msg.Name + '''');" << endl; + "'Invalid method name: ''' + msg.Name + '''');" << '\n'; indent_impl(s_service_impl) << "Thrift.Protocol.Init( msg, msg.Name, TMessageType.Exception, msg.SeqID);" - << endl; - indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg);" << endl; - indent_impl(s_service_impl) << "x.Write(oprot);" << endl; - indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << endl; - indent_impl(s_service_impl) << "oprot.Transport.Flush();" << endl; - indent_impl(s_service_impl) << "Result := True;" << endl; - indent_impl(s_service_impl) << "Exit;" << endl; + << '\n'; + indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg);" << '\n'; + indent_impl(s_service_impl) << "x.Write(oprot);" << '\n'; + indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << '\n'; + indent_impl(s_service_impl) << "oprot.Transport.Flush();" << '\n'; + indent_impl(s_service_impl) << "Result := True;" << '\n'; + indent_impl(s_service_impl) << "Exit;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl; + indent_impl(s_service_impl) << "end;" << '\n'; if (events_) { - indent_impl(s_service_impl) << "if events <> nil" << endl; - indent_impl(s_service_impl) << "then context := events.CreateRequestContext(msg.Name)" << endl; - indent_impl(s_service_impl) << "else context := nil;" << endl; - indent_impl(s_service_impl) << "try" << endl; + indent_impl(s_service_impl) << "if events <> nil" << '\n'; + indent_impl(s_service_impl) << "then context := events.CreateRequestContext(msg.Name)" << '\n'; + indent_impl(s_service_impl) << "else context := nil;" << '\n'; + indent_impl(s_service_impl) << "try" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "fn(msg.SeqID, iprot, oprot, context);" << endl; + indent_impl(s_service_impl) << "fn(msg.SeqID, iprot, oprot, context);" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "finally" << endl; + indent_impl(s_service_impl) << "finally" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "if context <> nil then begin" << endl; + indent_impl(s_service_impl) << "if context <> nil then begin" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "context.CleanupContext;" << endl; - indent_impl(s_service_impl) << "context := nil;" << endl; + indent_impl(s_service_impl) << "context.CleanupContext;" << '\n'; + indent_impl(s_service_impl) << "context := nil;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl; + indent_impl(s_service_impl) << "end;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl; + indent_impl(s_service_impl) << "end;" << '\n'; } else { - indent_impl(s_service_impl) << "fn(msg.SeqID, iprot, oprot);" << endl; + indent_impl(s_service_impl) << "fn(msg.SeqID, iprot, oprot);" << '\n'; } indent_down_impl(); - indent_impl(s_service_impl) << "except" << endl; + indent_impl(s_service_impl) << "except" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "on TTransportExceptionTimedOut do begin" << endl; + indent_impl(s_service_impl) << "on TTransportExceptionTimedOut do begin" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "Result := True;" << endl; - indent_impl(s_service_impl) << "Exit;" << endl; + indent_impl(s_service_impl) << "Result := True;" << '\n'; + indent_impl(s_service_impl) << "Exit;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl; - indent_impl(s_service_impl) << "else begin" << endl; + indent_impl(s_service_impl) << "end;" << '\n'; + indent_impl(s_service_impl) << "else begin" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "Result := False;" << endl; - indent_impl(s_service_impl) << "Exit;" << endl; + indent_impl(s_service_impl) << "Result := False;" << '\n'; + indent_impl(s_service_impl) << "Exit;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl; + indent_impl(s_service_impl) << "end;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl; - indent_impl(s_service_impl) << "Result := True;" << endl; + indent_impl(s_service_impl) << "end;" << '\n'; + indent_impl(s_service_impl) << "Result := True;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl << endl; + indent_impl(s_service_impl) << "end;" << '\n' << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_process_function(tservice, *f_iter); } indent_down(); - indent(s_service) << "end;" << endl << endl; + indent(s_service) << "end;" << '\n' << '\n'; } void t_delphi_generator::generate_function_helpers(t_function* tfunction) { @@ -2439,46 +2437,46 @@ void t_delphi_generator::generate_process_function(t_service* tservice, t_functi indent(s_service) << "procedure " << funcname << "_Process( seqid: System.Integer; const iprot: IProtocol; const oprot: IProtocol" - << (events_ ? "; const events : IRequestEvents" : "") << ");" << endl; + << (events_ ? "; const events : IRequestEvents" : "") << ");" << '\n'; if (tfunction->is_oneway()) { - indent_impl(s_service_impl) << "// one way processor" << endl; + indent_impl(s_service_impl) << "// one way processor" << '\n'; } else { - indent_impl(s_service_impl) << "// both way processor" << endl; + indent_impl(s_service_impl) << "// both way processor" << '\n'; } indent_impl(s_service_impl) << "procedure " << full_cls << "." << funcname << "_Process( seqid: System.Integer; const iprot: IProtocol; const oprot: IProtocol" - << (events_ ? "; const events : IRequestEvents" : "") << ");" << endl; - indent_impl(s_service_impl) << "var" << endl; + << (events_ ? "; const events : IRequestEvents" : "") << ");" << '\n'; + indent_impl(s_service_impl) << "var" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "args: " << args_intfnm << ";" << endl; + indent_impl(s_service_impl) << "args: " << args_intfnm << ";" << '\n'; if (!tfunction->is_oneway()) { - indent_impl(s_service_impl) << "msg: Thrift.Protocol.TThriftMessage;" << endl; - indent_impl(s_service_impl) << "ret: " << result_intfnm << ";" << endl; - indent_impl(s_service_impl) << "appx : TApplicationException;" << endl; + indent_impl(s_service_impl) << "msg: Thrift.Protocol.TThriftMessage;" << '\n'; + indent_impl(s_service_impl) << "ret: " << result_intfnm << ";" << '\n'; + indent_impl(s_service_impl) << "appx : TApplicationException;" << '\n'; } indent_down_impl(); - indent_impl(s_service_impl) << "begin" << endl; + indent_impl(s_service_impl) << "begin" << '\n'; indent_up_impl(); if (!tfunction->is_oneway()) { - indent_impl(s_service_impl) << "ret := " << result_clsnm << "Impl.Create;" << endl; + indent_impl(s_service_impl) << "ret := " << result_clsnm << "Impl.Create;" << '\n'; } - indent_impl(s_service_impl) << "try" << endl; + indent_impl(s_service_impl) << "try" << '\n'; indent_up_impl(); if (events_) { - indent_impl(s_service_impl) << "if events <> nil then events.PreRead;" << endl; + indent_impl(s_service_impl) << "if events <> nil then events.PreRead;" << '\n'; } - indent_impl(s_service_impl) << "args := " << args_clsnm << "Impl.Create;" << endl; - indent_impl(s_service_impl) << "args.Read(iprot);" << endl; - indent_impl(s_service_impl) << "iprot.ReadMessageEnd();" << endl; + indent_impl(s_service_impl) << "args := " << args_clsnm << "Impl.Create;" << '\n'; + indent_impl(s_service_impl) << "args.Read(iprot);" << '\n'; + indent_impl(s_service_impl) << "iprot.ReadMessageEnd();" << '\n'; if (events_) { - indent_impl(s_service_impl) << "if events <> nil then events.PostRead;" << endl; + indent_impl(s_service_impl) << "if events <> nil then events.PostRead;" << '\n'; } t_struct* xs = tfunction->get_xceptions(); @@ -2503,88 +2501,88 @@ void t_delphi_generator::generate_process_function(t_service* tservice, t_functi } s_service_impl << "args." << prop_name(*f_iter); } - s_service_impl << ");" << endl; + s_service_impl << ");" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { indent_impl(s_service_impl) << "args." << prop_name(*f_iter) - << " := " << empty_value((*f_iter)->get_type()) << ";" << endl; + << " := " << empty_value((*f_iter)->get_type()) << ";" << '\n'; } indent_down_impl(); - indent_impl(s_service_impl) << "except" << endl; + indent_impl(s_service_impl) << "except" << '\n'; indent_up_impl(); for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { indent_impl(s_service_impl) << "on E: " << type_name((*x_iter)->get_type(), true, true) - << " do begin" << endl; + << " do begin" << '\n'; indent_up_impl(); if (!tfunction->is_oneway()) { string factory_name = normalize_clsnm((*x_iter)->get_type()->get_name(), "", true) + "Factory"; indent_impl(s_service_impl) << "ret." << prop_name(*x_iter) << " := E." << factory_name << ";" - << endl; + << '\n'; } indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl; + indent_impl(s_service_impl) << "end;" << '\n'; } - indent_impl(s_service_impl) << "on E: Exception do begin" << endl; + indent_impl(s_service_impl) << "on E: Exception do begin" << '\n'; indent_up_impl(); if(events_) { - indent_impl(s_service_impl) << "if events <> nil then events.UnhandledError(E);" << endl; + indent_impl(s_service_impl) << "if events <> nil then events.UnhandledError(E);" << '\n'; } if (!tfunction->is_oneway()) { indent_impl(s_service_impl) << "appx := TApplicationExceptionInternalError.Create(E.Message);" - << endl; - indent_impl(s_service_impl) << "try" << endl; + << '\n'; + indent_impl(s_service_impl) << "try" << '\n'; indent_up_impl(); if(events_) { - indent_impl(s_service_impl) << "if events <> nil then events.PreWrite;" << endl; + indent_impl(s_service_impl) << "if events <> nil then events.PreWrite;" << '\n'; } indent_impl(s_service_impl) << "Thrift.Protocol.Init( msg, '" << tfunction->get_name() << "', TMessageType.Exception, seqid);" - << endl; - indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg);" << endl; - indent_impl(s_service_impl) << "appx.Write(oprot);" << endl; - indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << endl; - indent_impl(s_service_impl) << "oprot.Transport.Flush();" << endl; + << '\n'; + indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg);" << '\n'; + indent_impl(s_service_impl) << "appx.Write(oprot);" << '\n'; + indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << '\n'; + indent_impl(s_service_impl) << "oprot.Transport.Flush();" << '\n'; if(events_) { - indent_impl(s_service_impl) << "if events <> nil then events.PostWrite;" << endl; + indent_impl(s_service_impl) << "if events <> nil then events.PostWrite;" << '\n'; } - indent_impl(s_service_impl) << "Exit;" << endl; + indent_impl(s_service_impl) << "Exit;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "finally" << endl; + indent_impl(s_service_impl) << "finally" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << "appx.Free;" << endl; + indent_impl(s_service_impl) << "appx.Free;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl; + indent_impl(s_service_impl) << "end;" << '\n'; } indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl; + indent_impl(s_service_impl) << "end;" << '\n'; indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl; + indent_impl(s_service_impl) << "end;" << '\n'; if (!tfunction->is_oneway()) { if (events_) { - indent_impl(s_service_impl) << "if events <> nil then events.PreWrite;" << endl; + indent_impl(s_service_impl) << "if events <> nil then events.PreWrite;" << '\n'; } indent_impl(s_service_impl) << "Thrift.Protocol.Init( msg, '" << tfunction->get_name() << "', TMessageType.Reply, seqid); " - << endl; - indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg); " << endl; - indent_impl(s_service_impl) << "ret.Write(oprot);" << endl; - indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << endl; - indent_impl(s_service_impl) << "oprot.Transport.Flush();" << endl; + << '\n'; + indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg); " << '\n'; + indent_impl(s_service_impl) << "ret.Write(oprot);" << '\n'; + indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << '\n'; + indent_impl(s_service_impl) << "oprot.Transport.Flush();" << '\n'; if (events_) { - indent_impl(s_service_impl) << "if events <> nil then events.PostWrite;" << endl; + indent_impl(s_service_impl) << "if events <> nil then events.PostWrite;" << '\n'; } } else if (events_) { - indent_impl(s_service_impl) << "if events <> nil then events.OnewayComplete;" << endl; + indent_impl(s_service_impl) << "if events <> nil then events.OnewayComplete;" << '\n'; } indent_down_impl(); - indent_impl(s_service_impl) << "end;" << endl << endl; + indent_impl(s_service_impl) << "end;" << '\n' << '\n'; } void t_delphi_generator::generate_deserialize_field(ostream& out, @@ -2657,7 +2655,7 @@ void t_delphi_generator::generate_deserialize_field(ostream& out, out << "ReadI32()"; out << ");"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", tfield->get_name().c_str(), @@ -2677,8 +2675,8 @@ void t_delphi_generator::generate_deserialize_struct(ostream& out, typ_name = type_name(tstruct, true, false); } - indent_impl(out) << prefix << name << " := " << typ_name << ".Create;" << endl; - indent_impl(out) << prefix << name << ".Read(iprot);" << endl; + indent_impl(out) << prefix << name << " := " << typ_name << ".Create;" << '\n'; + indent_impl(out) << prefix << name << ".Read(iprot);" << '\n'; } void t_delphi_generator::generate_deserialize_container(ostream& out, @@ -2706,22 +2704,22 @@ void t_delphi_generator::generate_deserialize_container(ostream& out, } else if (ttype->is_list()) { local_var = obj + ": TThriftList;"; } - local_vars << " " << local_var << endl; + local_vars << " " << local_var << '\n'; counter = tmp("_i"); local_var = counter + ": System.Integer;"; - local_vars << " " << local_var << endl; + local_vars << " " << local_var << '\n'; - indent_impl(out) << name << " := " << type_name(ttype, true) << ".Create;" << endl; + indent_impl(out) << name << " := " << type_name(ttype, true) << ".Create;" << '\n'; if (ttype->is_map()) { - indent_impl(out) << obj << " := iprot.ReadMapBegin();" << endl; + indent_impl(out) << obj << " := iprot.ReadMapBegin();" << '\n'; } else if (ttype->is_set()) { - indent_impl(out) << obj << " := iprot.ReadSetBegin();" << endl; + indent_impl(out) << obj << " := iprot.ReadSetBegin();" << '\n'; } else if (ttype->is_list()) { - indent_impl(out) << obj << " := iprot.ReadListBegin();" << endl; + indent_impl(out) << obj << " := iprot.ReadListBegin();" << '\n'; } - indent_impl(out) << "for " << counter << " := 0 to " << obj << ".Count - 1 do begin" << endl; + indent_impl(out) << "for " << counter << " := 0 to " << obj << ".Count - 1 do begin" << '\n'; indent_up_impl(); if (ttype->is_map()) { generate_deserialize_map_element(out, is_xception, (t_map*)ttype, name, local_vars); @@ -2731,14 +2729,14 @@ void t_delphi_generator::generate_deserialize_container(ostream& out, generate_deserialize_list_element(out, is_xception, (t_list*)ttype, name, local_vars); } indent_down_impl(); - indent_impl(out) << "end;" << endl; + indent_impl(out) << "end;" << '\n'; if (ttype->is_map()) { - indent_impl(out) << "iprot.ReadMapEnd();" << endl; + indent_impl(out) << "iprot.ReadMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent_impl(out) << "iprot.ReadSetEnd();" << endl; + indent_impl(out) << "iprot.ReadSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent_impl(out) << "iprot.ReadListEnd();" << endl; + indent_impl(out) << "iprot.ReadListEnd();" << '\n'; } } @@ -2755,13 +2753,13 @@ void t_delphi_generator::generate_deserialize_map_element(ostream& out, t_field fkey(tmap->get_key_type(), key); t_field fval(tmap->get_val_type(), val); - local_vars << " " << declare_field(&fkey) << endl; - local_vars << " " << declare_field(&fval) << endl; + local_vars << " " << declare_field(&fkey) << '\n'; + local_vars << " " << declare_field(&fval) << '\n'; generate_deserialize_field(out, is_xception, &fkey, "", local_vars); generate_deserialize_field(out, is_xception, &fval, "", local_vars); - indent_impl(out) << prefix << ".AddOrSetValue( " << key << ", " << val << ");" << endl; + indent_impl(out) << prefix << ".AddOrSetValue( " << key << ", " << val << ");" << '\n'; } void t_delphi_generator::generate_deserialize_set_element(ostream& out, @@ -2771,9 +2769,9 @@ void t_delphi_generator::generate_deserialize_set_element(ostream& out, ostream& local_vars) { string elem = tmp("_elem"); t_field felem(tset->get_elem_type(), elem); - local_vars << " " << declare_field(&felem) << endl; + local_vars << " " << declare_field(&felem) << '\n'; generate_deserialize_field(out, is_xception, &felem, "", local_vars); - indent_impl(out) << prefix << ".Add(" << elem << ");" << endl; + indent_impl(out) << prefix << ".Add(" << elem << ");" << '\n'; } void t_delphi_generator::generate_deserialize_list_element(ostream& out, @@ -2783,9 +2781,9 @@ void t_delphi_generator::generate_deserialize_list_element(ostream& out, ostream& local_vars) { string elem = tmp("_elem"); t_field felem(tlist->get_elem_type(), elem); - local_vars << " " << declare_field(&felem) << endl; + local_vars << " " << declare_field(&felem) << '\n'; generate_deserialize_field(out, is_xception, &felem, "", local_vars); - indent_impl(out) << prefix << ".Add(" << elem << ");" << endl; + indent_impl(out) << prefix << ".Add(" << elem << ");" << '\n'; } void t_delphi_generator::generate_serialize_field(ostream& out, @@ -2856,7 +2854,7 @@ void t_delphi_generator::generate_serialize_field(ostream& out, } else if (type->is_enum()) { out << "WriteI32(System.Integer(" << name << "));"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO SERIALIZE '%s%s' TYPE '%s'\n", prefix.c_str(), @@ -2871,7 +2869,7 @@ void t_delphi_generator::generate_serialize_struct(ostream& out, ostream& local_vars) { (void)local_vars; (void)tstruct; - out << indent_impl() << prefix << ".Write(oprot);" << endl; + out << indent_impl() << prefix << ".Write(oprot);" << '\n'; } void t_delphi_generator::generate_serialize_container(ostream& out, @@ -2882,42 +2880,42 @@ void t_delphi_generator::generate_serialize_container(ostream& out, string obj; if (ttype->is_map()) { obj = tmp("map"); - local_vars << " " << obj << " : TThriftMap;" << endl; + local_vars << " " << obj << " : TThriftMap;" << '\n'; indent_impl(out) << "Thrift.Protocol.Init( " << obj << ", " << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << prefix - << ".Count);" << endl; - indent_impl(out) << "oprot.WriteMapBegin( " << obj << ");" << endl; + << ".Count);" << '\n'; + indent_impl(out) << "oprot.WriteMapBegin( " << obj << ");" << '\n'; } else if (ttype->is_set()) { obj = tmp("set_"); - local_vars << " " << obj << " : TThriftSet;" << endl; + local_vars << " " << obj << " : TThriftSet;" << '\n'; indent_impl(out) << "Thrift.Protocol.Init( " << obj << ", " << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " << prefix - << ".Count);" << endl; - indent_impl(out) << "oprot.WriteSetBegin( " << obj << ");" << endl; + << ".Count);" << '\n'; + indent_impl(out) << "oprot.WriteSetBegin( " << obj << ");" << '\n'; } else if (ttype->is_list()) { obj = tmp("list_"); - local_vars << " " << obj << " : TThriftList;" << endl; + local_vars << " " << obj << " : TThriftList;" << '\n'; indent_impl(out) << "Thrift.Protocol.Init( " << obj << ", " << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << prefix - << ".Count);" << endl; - indent_impl(out) << "oprot.WriteListBegin( " << obj << ");" << endl; + << ".Count);" << '\n'; + indent_impl(out) << "oprot.WriteListBegin( " << obj << ");" << '\n'; } string iter = tmp("_iter"); if (ttype->is_map()) { - local_vars << " " << iter << ": " << type_name(((t_map*)ttype)->get_key_type()) << ";" << endl; - indent_impl(out) << "for " << iter << " in " << prefix << ".Keys do begin" << endl; + local_vars << " " << iter << ": " << type_name(((t_map*)ttype)->get_key_type()) << ";" << '\n'; + indent_impl(out) << "for " << iter << " in " << prefix << ".Keys do begin" << '\n'; indent_up_impl(); } else if (ttype->is_set()) { local_vars << " " << iter << ": " << type_name(((t_set*)ttype)->get_elem_type()) << ";" - << endl; - indent_impl(out) << "for " << iter << " in " << prefix << " do begin" << endl; + << '\n'; + indent_impl(out) << "for " << iter << " in " << prefix << " do begin" << '\n'; indent_up_impl(); } else if (ttype->is_list()) { local_vars << " " << iter << ": " << type_name(((t_list*)ttype)->get_elem_type()) << ";" - << endl; - indent_impl(out) << "for " << iter << " in " << prefix << " do begin" << endl; + << '\n'; + indent_impl(out) << "for " << iter << " in " << prefix << " do begin" << '\n'; indent_up_impl(); } @@ -2930,14 +2928,14 @@ void t_delphi_generator::generate_serialize_container(ostream& out, } indent_down_impl(); - indent_impl(out) << "end;" << endl; + indent_impl(out) << "end;" << '\n'; if (ttype->is_map()) { - indent_impl(out) << "oprot.WriteMapEnd();" << endl; + indent_impl(out) << "oprot.WriteMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent_impl(out) << "oprot.WriteSetEnd();" << endl; + indent_impl(out) << "oprot.WriteSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent_impl(out) << "oprot.WriteListEnd();" << endl; + indent_impl(out) << "oprot.WriteListEnd();" << '\n'; } } @@ -2989,10 +2987,10 @@ void t_delphi_generator::generate_delphi_property(ostream& out, bool is_xception = ftype->is_xception(); generate_delphi_doc(out, tfield); indent(out) << "property " << prop_name(tfield, struct_is_xception) << ": " - << type_name(ftype, false, true, is_xception, true) - << " read " << prop_name(tfield, struct_is_xception, fieldPrefix) - << " write " << prop_name(tfield, struct_is_xception, "Set") - << ";" << endl; + << type_name(ftype, false, true, is_xception, true) + << " read " << prop_name(tfield, struct_is_xception, fieldPrefix) + << " write " << prop_name(tfield, struct_is_xception, "Set") + << ";" << '\n'; } std::string t_delphi_generator::prop_name(t_field* tfield, bool is_xception, std::string prefix) { @@ -3217,7 +3215,7 @@ string t_delphi_generator::function_signature(t_function* tfunction, } string signature = ""; - + if( for_async) { if (is_void(ttype)) { signature = "function " + prefix + normalize_name(tfunction->get_name(), true, is_xception) + "Async(" @@ -3296,10 +3294,10 @@ string t_delphi_generator::constructor_argument_list(t_struct* tstruct, string c if (line.size() > 80) { if (firstline) { - result << endl << newline_indent; + result << '\n' << newline_indent; firstline = false; } - result << line << endl; + result << line << '\n'; line = newline_indent; } else if (line.size() > 0) { line += " "; @@ -3419,7 +3417,7 @@ void t_delphi_generator::generate_delphi_property_writer_definition(ostream& out indent(out) << "procedure " << prop_name(tfield, is_xception_class, "Set") << "( const Value: " << type_name(ftype, false, true, is_xception, true) << ");" - << endl; + << '\n'; } void t_delphi_generator::generate_delphi_property_reader_definition(ostream& out, @@ -3429,14 +3427,14 @@ void t_delphi_generator::generate_delphi_property_reader_definition(ostream& out bool is_xception = ftype->is_xception(); indent(out) << "function " << prop_name(tfield, is_xception_class, "Get") << ": " - << type_name(ftype, false, true, is_xception, true) << ";" << endl; + << type_name(ftype, false, true, is_xception, true) << ";" << '\n'; } void t_delphi_generator::generate_delphi_isset_reader_writer_definition(ostream& out, t_field* tfield, bool is_xception) { - indent(out) << "function " << prop_name(tfield, is_xception,"Get__isset_") << ": System.Boolean;" << endl; - indent(out) << "procedure " << prop_name(tfield, is_xception, "Set__isset_") << "( const value : System.Boolean);" << endl; + indent(out) << "function " << prop_name(tfield, is_xception,"Get__isset_") << ": System.Boolean;" << '\n'; + indent(out) << "procedure " << prop_name(tfield, is_xception, "Set__isset_") << "( const value : System.Boolean);" << '\n'; } void t_delphi_generator::generate_delphi_clear_union_value(ostream& out, @@ -3460,14 +3458,14 @@ void t_delphi_generator::generate_delphi_clear_union_value(ostream& out, bool is_xception = ftype->is_xception(); indent_impl(out) << "if " << prop_name(tfield, is_xception_class,"F__isset_") << " then begin" - << endl; + << '\n'; indent_up_impl(); - indent_impl(out) << prop_name(tfield, is_xception_class,"F__isset_") << " := False;" << endl; + indent_impl(out) << prop_name(tfield, is_xception_class,"F__isset_") << " := False;" << '\n'; indent_impl(out) << prop_name(tfield, is_xception_class,fieldPrefix) << " := " << "Default( " << type_name(ftype, false, true, is_xception, true) << ");" - << endl; + << '\n'; indent_down_impl(); - indent_impl(out) << "end;" << endl; + indent_impl(out) << "end;" << '\n'; } void t_delphi_generator::generate_delphi_property_writer_impl(ostream& out, @@ -3488,24 +3486,24 @@ void t_delphi_generator::generate_delphi_property_writer_impl(ostream& out, indent_impl(out) << "procedure " << cls_prefix << name << "." << prop_name(tfield, is_xception_class,"Set") << "( const Value: " << type_name(ftype, false, true, is_xception, true) << ");" - << endl; - indent_impl(out) << "begin" << endl; + << '\n'; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); if (is_union) { - indent_impl(out) << "ClearUnionValues;" << endl; + indent_impl(out) << "ClearUnionValues;" << '\n'; } if (tfield->get_req() != t_field::T_REQUIRED) { - indent_impl(out) << prop_name(tfield, is_xception_class,"F__isset_") << " := True;" << endl; + indent_impl(out) << prop_name(tfield, is_xception_class,"F__isset_") << " := True;" << '\n'; } - indent_impl(out) << prop_name(tfield, is_xception_class,fieldPrefix) << " := Value;" << endl; + indent_impl(out) << prop_name(tfield, is_xception_class,fieldPrefix) << " := Value;" << '\n'; if (is_xception_class && (!is_xception_factory)) { indent_impl(out) << xception_factory_name << "." << prop_name(tfield, is_xception_class) - << " := Value;" << endl; + << " := Value;" << '\n'; } indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; + indent_impl(out) << "end;" << '\n' << '\n'; } void t_delphi_generator::generate_delphi_property_reader_impl(ostream& out, @@ -3522,13 +3520,13 @@ void t_delphi_generator::generate_delphi_property_reader_impl(ostream& out, indent_impl(out) << "function " << cls_prefix << name << "." << prop_name(tfield, is_xception_class,"Get") << ": " - << type_name(ftype, false, true, is_xception, true) << ";" << endl; - indent_impl(out) << "begin" << endl; + << type_name(ftype, false, true, is_xception, true) << ";" << '\n'; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); indent_impl(out) << "Result := " << prop_name(tfield, is_xception_class,fieldPrefix) << ";" - << endl; + << '\n'; indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; + indent_impl(out) << "end;" << '\n' << '\n'; } void t_delphi_generator::generate_delphi_isset_reader_writer_impl(ostream& out, @@ -3541,22 +3539,22 @@ void t_delphi_generator::generate_delphi_isset_reader_writer_impl(ostream& out, (void)type; string isset_name = prop_name(tfield, is_xception, "__isset_"); - + indent_impl(out) << "function " << cls_prefix << name << "." - << "Get" << isset_name << ": System.Boolean;" << endl; - indent_impl(out) << "begin" << endl; + << "Get" << isset_name << ": System.Boolean;" << '\n'; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); - indent_impl(out) << "Result := " << fieldPrefix << isset_name << ";" << endl; + indent_impl(out) << "Result := " << fieldPrefix << isset_name << ";" << '\n'; indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; - + indent_impl(out) << "end;" << '\n' << '\n'; + indent_impl(out) << "procedure " << cls_prefix << name << "." - << "Set" << isset_name << "( const value: System.Boolean);" << endl; - indent_impl(out) << "begin" << endl; + << "Set" << isset_name << "( const value: System.Boolean);" << '\n'; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); - indent_impl(out) << fieldPrefix << isset_name << " := value;" << endl; + indent_impl(out) << fieldPrefix << isset_name << " := value;" << '\n'; indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; + indent_impl(out) << "end;" << '\n' << '\n'; } void t_delphi_generator::generate_delphi_create_exception_impl(ostream& out, @@ -3569,14 +3567,14 @@ void t_delphi_generator::generate_delphi_create_exception_impl(ostream& out, string cls_nm = type_name(tstruct, true, false, is_exception, is_exception); indent_impl(out) << "function " << cls_nm << ".CreateException: " << exception_cls_nm << ";" - << endl; + << '\n'; - indent_impl(out) << "begin" << endl; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); - indent_impl(out) << "Result := " << exception_cls_nm << ".Create;" << endl; + indent_impl(out) << "Result := " << exception_cls_nm << ".Create;" << '\n'; string factory_name = normalize_clsnm(tstruct->get_name(), "", true) + "Factory"; - indent_impl(out) << "Result.F" << factory_name << " := Self;" << endl; + indent_impl(out) << "Result.F" << factory_name << " := Self;" << '\n'; const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; @@ -3586,20 +3584,20 @@ void t_delphi_generator::generate_delphi_create_exception_impl(ostream& out, for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { propname = prop_name(*f_iter, is_exception); if ((*f_iter)->get_req() != t_field::T_REQUIRED) { - indent_impl(out) << "if " << prop_name(*f_iter, is_exception,"__isset_") << " then begin" << endl; + indent_impl(out) << "if " << prop_name(*f_iter, is_exception,"__isset_") << " then begin" << '\n'; indent_up_impl(); } - indent_impl(out) << "Result." << propname << " := " << propname << ";" << endl; + indent_impl(out) << "Result." << propname << " := " << propname << ";" << '\n'; if ((*f_iter)->get_req() != t_field::T_REQUIRED) { indent_down_impl(); - indent_impl(out) << "end;" << endl; + indent_impl(out) << "end;" << '\n'; } } - indent_impl(out) << "Result.UpdateMessageProperty;" << endl; + indent_impl(out) << "Result.UpdateMessageProperty;" << '\n'; indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; + indent_impl(out) << "end;" << '\n' << '\n'; } void t_delphi_generator::generate_delphi_struct_reader_impl(ostream& out, @@ -3614,53 +3612,53 @@ void t_delphi_generator::generate_delphi_struct_reader_impl(ostream& out, const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; - indent_impl(code_block) << "begin" << endl; + indent_impl(code_block) << "begin" << '\n'; indent_up_impl(); - indent_impl(local_vars) << "tracker : IProtocolRecursionTracker;" << endl; - indent_impl(code_block) << "tracker := iprot.NextRecursionLevel;" << endl; + indent_impl(local_vars) << "tracker : IProtocolRecursionTracker;" << '\n'; + indent_impl(code_block) << "tracker := iprot.NextRecursionLevel;" << '\n'; // local bools for required fields for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) { indent_impl(local_vars) << prop_name(*f_iter, is_exception,"_req_isset_") << " : System.Boolean;" - << endl; + << '\n'; indent_impl(code_block) << prop_name(*f_iter, is_exception,"_req_isset_") << " := FALSE;" - << endl; + << '\n'; } } - indent_impl(code_block) << "struc := iprot.ReadStructBegin;" << endl; + indent_impl(code_block) << "struc := iprot.ReadStructBegin;" << '\n'; - indent_impl(code_block) << "try" << endl; + indent_impl(code_block) << "try" << '\n'; indent_up_impl(); - indent_impl(code_block) << "while (true) do begin" << endl; + indent_impl(code_block) << "while (true) do begin" << '\n'; indent_up_impl(); - indent_impl(code_block) << "field_ := iprot.ReadFieldBegin();" << endl; + indent_impl(code_block) << "field_ := iprot.ReadFieldBegin();" << '\n'; - indent_impl(code_block) << "if (field_.Type_ = TType.Stop) then Break;" << endl; + indent_impl(code_block) << "if (field_.Type_ = TType.Stop) then Break;" << '\n'; bool first = true; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if (first) { - code_block << endl; - indent_impl(code_block) << "case field_.ID of" << endl; + code_block << '\n'; + indent_impl(code_block) << "case field_.ID of" << '\n'; indent_up_impl(); } first = false; if (f_iter != fields.begin()) { - code_block << endl; + code_block << '\n'; } - indent_impl(code_block) << (*f_iter)->get_key() << ": begin" << endl; + indent_impl(code_block) << (*f_iter)->get_key() << ": begin" << '\n'; indent_up_impl(); indent_impl(code_block) << "if (field_.Type_ = " << type_to_enum((*f_iter)->get_type()) - << ") then begin" << endl; + << ") then begin" << '\n'; indent_up_impl(); generate_deserialize_field(code_block, is_exception, *f_iter, "Self.", local_vars); @@ -3668,82 +3666,82 @@ void t_delphi_generator::generate_delphi_struct_reader_impl(ostream& out, // required field? if ((*f_iter)->get_req() == t_field::T_REQUIRED) { indent_impl(code_block) << prop_name(*f_iter, is_exception,"_req_isset_") << " := TRUE;" - << endl; + << '\n'; } indent_down_impl(); - indent_impl(code_block) << "end else begin" << endl; + indent_impl(code_block) << "end else begin" << '\n'; indent_up_impl(); - indent_impl(code_block) << "TProtocolUtil.Skip(iprot, field_.Type_);" << endl; + indent_impl(code_block) << "TProtocolUtil.Skip(iprot, field_.Type_);" << '\n'; indent_down_impl(); - indent_impl(code_block) << "end;" << endl; + indent_impl(code_block) << "end;" << '\n'; indent_down_impl(); indent_impl(code_block) << "end;"; } if (!first) { - code_block << endl; + code_block << '\n'; indent_down_impl(); - indent_impl(code_block) << "else" << endl; + indent_impl(code_block) << "else" << '\n'; indent_up_impl(); } - indent_impl(code_block) << "TProtocolUtil.Skip(iprot, field_.Type_);" << endl; + indent_impl(code_block) << "TProtocolUtil.Skip(iprot, field_.Type_);" << '\n'; if (!first) { indent_down_impl(); - indent_impl(code_block) << "end;" << endl; + indent_impl(code_block) << "end;" << '\n'; } - indent_impl(code_block) << "iprot.ReadFieldEnd;" << endl; + indent_impl(code_block) << "iprot.ReadFieldEnd;" << '\n'; indent_down_impl(); - indent_impl(code_block) << "end;" << endl; + indent_impl(code_block) << "end;" << '\n'; indent_down_impl(); - indent_impl(code_block) << "finally" << endl; + indent_impl(code_block) << "finally" << '\n'; indent_up_impl(); - indent_impl(code_block) << "iprot.ReadStructEnd;" << endl; + indent_impl(code_block) << "iprot.ReadStructEnd;" << '\n'; indent_down_impl(); - indent_impl(code_block) << "end;" << endl; + indent_impl(code_block) << "end;" << '\n'; // all required fields have been read? first = true; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) { if(first) { - code_block << endl; + code_block << '\n'; first = false; } - indent_impl(code_block) << "if not " << prop_name(*f_iter, is_exception,"_req_isset_") << endl; + indent_impl(code_block) << "if not " << prop_name(*f_iter, is_exception,"_req_isset_") << '\n'; indent_impl(code_block) << "then raise TProtocolExceptionInvalidData.Create(" << "'required field " << prop_name(*f_iter, is_exception) << " not set');" - << endl; + << '\n'; } } - + if( is_exception && (!is_x_factory)) { - code_block << endl; - indent_impl(code_block) << "UpdateMessageProperty;" << endl; + code_block << '\n'; + indent_impl(code_block) << "UpdateMessageProperty;" << '\n'; } indent_down_impl(); - indent_impl(code_block) << "end;" << endl << endl; + indent_impl(code_block) << "end;" << '\n' << '\n'; string cls_nm; cls_nm = type_name(tstruct, true, is_exception && (!is_x_factory), is_x_factory, is_x_factory); indent_impl(out) << "procedure " << cls_prefix << cls_nm << ".Read( const iprot: IProtocol);" - << endl; - indent_impl(out) << "var" << endl; + << '\n'; + indent_impl(out) << "var" << '\n'; indent_up_impl(); - indent_impl(out) << "field_ : TThriftField;" << endl; - indent_impl(out) << "struc : TThriftStruct;" << endl; + indent_impl(out) << "field_ : TThriftField;" << '\n'; + indent_impl(out) << "struc : TThriftStruct;" << '\n'; indent_down_impl(); - out << local_vars.str() << endl; + out << local_vars.str() << '\n'; out << code_block.str(); } @@ -3760,51 +3758,51 @@ void t_delphi_generator::generate_delphi_struct_result_writer_impl(ostream& out, const vector& fields = tstruct->get_sorted_members(); vector::const_iterator f_iter; - indent_impl(code_block) << "begin" << endl; + indent_impl(code_block) << "begin" << '\n'; indent_up_impl(); - indent_impl(local_vars) << "tracker : IProtocolRecursionTracker;" << endl; - indent_impl(code_block) << "tracker := oprot.NextRecursionLevel;" << endl; + indent_impl(local_vars) << "tracker : IProtocolRecursionTracker;" << '\n'; + indent_impl(code_block) << "tracker := oprot.NextRecursionLevel;" << '\n'; - indent_impl(code_block) << "Thrift.Protocol.Init( struc, '" << name << "');" << endl; - indent_impl(code_block) << "oprot.WriteStructBegin(struc);" << endl; + indent_impl(code_block) << "Thrift.Protocol.Init( struc, '" << name << "');" << '\n'; + indent_impl(code_block) << "oprot.WriteStructBegin(struc);" << '\n'; if (fields.size() > 0) { - indent_impl(code_block) << "Thrift.Protocol.Init( field_);" << endl; + indent_impl(code_block) << "Thrift.Protocol.Init( field_);" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { indent_impl(code_block) << "if (" << prop_name(*f_iter, is_exception,"__isset_") << ") then" - << endl; - indent_impl(code_block) << "begin" << endl; + << '\n'; + indent_impl(code_block) << "begin" << '\n'; indent_up_impl(); - indent_impl(code_block) << "field_.Name := '" << (*f_iter)->get_name() << "';" << endl; + indent_impl(code_block) << "field_.Name := '" << (*f_iter)->get_name() << "';" << '\n'; indent_impl(code_block) << "field_.Type_ := " << type_to_enum((*f_iter)->get_type()) << ";" - << endl; - indent_impl(code_block) << "field_.ID := " << (*f_iter)->get_key() << ";" << endl; - indent_impl(code_block) << "oprot.WriteFieldBegin(field_);" << endl; + << '\n'; + indent_impl(code_block) << "field_.ID := " << (*f_iter)->get_key() << ";" << '\n'; + indent_impl(code_block) << "oprot.WriteFieldBegin(field_);" << '\n'; generate_serialize_field(code_block, is_exception, *f_iter, "Self.", local_vars); - indent_impl(code_block) << "oprot.WriteFieldEnd();" << endl; + indent_impl(code_block) << "oprot.WriteFieldEnd();" << '\n'; indent_down_impl(); } } - indent_impl(code_block) << "oprot.WriteFieldStop();" << endl; - indent_impl(code_block) << "oprot.WriteStructEnd();" << endl; + indent_impl(code_block) << "oprot.WriteFieldStop();" << '\n'; + indent_impl(code_block) << "oprot.WriteStructEnd();" << '\n'; indent_down_impl(); - indent_impl(code_block) << "end;" << endl << endl; + indent_impl(code_block) << "end;" << '\n' << '\n'; string cls_nm; cls_nm = type_name(tstruct, true, is_exception && (!is_x_factory), is_x_factory, is_x_factory); indent_impl(out) << "procedure " << cls_prefix << cls_nm << ".Write( const oprot: IProtocol);" - << endl; - indent_impl(out) << "var" << endl; + << '\n'; + indent_impl(out) << "var" << '\n'; indent_up_impl(); - indent_impl(out) << "struc : TThriftStruct;" << endl; + indent_impl(out) << "struc : TThriftStruct;" << '\n'; if (fields.size() > 0) { - indent_impl(out) << "field_ : TThriftField;" << endl; + indent_impl(out) << "field_ : TThriftField;" << '\n'; } out << local_vars.str(); @@ -3825,17 +3823,17 @@ void t_delphi_generator::generate_delphi_struct_writer_impl(ostream& out, const vector& fields = tstruct->get_sorted_members(); vector::const_iterator f_iter; - indent_impl(code_block) << "begin" << endl; + indent_impl(code_block) << "begin" << '\n'; indent_up_impl(); - indent_impl(local_vars) << "tracker : IProtocolRecursionTracker;" << endl; - indent_impl(code_block) << "tracker := oprot.NextRecursionLevel;" << endl; + indent_impl(local_vars) << "tracker : IProtocolRecursionTracker;" << '\n'; + indent_impl(code_block) << "tracker := oprot.NextRecursionLevel;" << '\n'; - indent_impl(code_block) << "Thrift.Protocol.Init( struc, '" << name << "');" << endl; - indent_impl(code_block) << "oprot.WriteStructBegin(struc);" << endl; + indent_impl(code_block) << "Thrift.Protocol.Init( struc, '" << name << "');" << '\n'; + indent_impl(code_block) << "oprot.WriteStructBegin(struc);" << '\n'; if (fields.size() > 0) { - indent_impl(code_block) << "Thrift.Protocol.Init( field_);" << endl; + indent_impl(code_block) << "Thrift.Protocol.Init( field_);" << '\n'; } for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { @@ -3846,54 +3844,54 @@ void t_delphi_generator::generate_delphi_struct_writer_impl(ostream& out, bool has_isset = (!is_required); if (is_required && null_allowed) { null_allowed = false; - indent_impl(code_block) << "if (Self." << fieldname << " = nil)" << endl; + indent_impl(code_block) << "if (Self." << fieldname << " = nil)" << '\n'; indent_impl(code_block) << "then raise TProtocolExceptionInvalidData.Create(" << "'required field " << fieldname << " not set');" - << endl; + << '\n'; } if (null_allowed) { indent_impl(code_block) << "if (Self." << fieldname << " <> nil)"; if (has_isset) { code_block << " and " << isset_name; } - code_block << " then begin" << endl; + code_block << " then begin" << '\n'; indent_up_impl(); } else { if (has_isset) { - indent_impl(code_block) << "if (" << isset_name << ") then begin" << endl; + indent_impl(code_block) << "if (" << isset_name << ") then begin" << '\n'; indent_up_impl(); } } - indent_impl(code_block) << "field_.Name := '" << (*f_iter)->get_name() << "';" << endl; + indent_impl(code_block) << "field_.Name := '" << (*f_iter)->get_name() << "';" << '\n'; indent_impl(code_block) << "field_.Type_ := " << type_to_enum((*f_iter)->get_type()) << ";" - << endl; - indent_impl(code_block) << "field_.ID := " << (*f_iter)->get_key() << ";" << endl; - indent_impl(code_block) << "oprot.WriteFieldBegin(field_);" << endl; + << '\n'; + indent_impl(code_block) << "field_.ID := " << (*f_iter)->get_key() << ";" << '\n'; + indent_impl(code_block) << "oprot.WriteFieldBegin(field_);" << '\n'; generate_serialize_field(code_block, is_exception, *f_iter, "Self.", local_vars); - indent_impl(code_block) << "oprot.WriteFieldEnd();" << endl; + indent_impl(code_block) << "oprot.WriteFieldEnd();" << '\n'; if (null_allowed || has_isset) { indent_down_impl(); - indent_impl(code_block) << "end;" << endl; + indent_impl(code_block) << "end;" << '\n'; } } - indent_impl(code_block) << "oprot.WriteFieldStop();" << endl; - indent_impl(code_block) << "oprot.WriteStructEnd();" << endl; + indent_impl(code_block) << "oprot.WriteFieldStop();" << '\n'; + indent_impl(code_block) << "oprot.WriteStructEnd();" << '\n'; indent_down_impl(); - indent_impl(code_block) << "end;" << endl << endl; + indent_impl(code_block) << "end;" << '\n' << '\n'; string cls_nm; cls_nm = type_name(tstruct, true, is_exception && (!is_x_factory), is_x_factory, is_x_factory); indent_impl(out) << "procedure " << cls_prefix << cls_nm << ".Write( const oprot: IProtocol);" - << endl; - indent_impl(out) << "var" << endl; + << '\n'; + indent_impl(out) << "var" << '\n'; indent_up_impl(); - indent_impl(out) << "struc : TThriftStruct;" << endl; + indent_impl(out) << "struc : TThriftStruct;" << '\n'; if (fields.size() > 0) { - indent_impl(out) << "field_ : TThriftField;" << endl; + indent_impl(out) << "field_ : TThriftField;" << '\n'; } out << local_vars.str(); indent_down_impl(); @@ -3921,28 +3919,28 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, string tmp_first = tmp("_first"); bool useFirstFlag = false; - indent_impl(out) << "function " << cls_prefix << cls_nm << ".ToString: string;" << endl; - indent_impl(out) << "var" << endl; + indent_impl(out) << "function " << cls_prefix << cls_nm << ".ToString: string;" << '\n'; + indent_impl(out) << "var" << '\n'; indent_up_impl(); - indent_impl(out) << tmp_sb << " : TThriftStringBuilder;" << endl; + indent_impl(out) << tmp_sb << " : TThriftStringBuilder;" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool is_optional = ((*f_iter)->get_req() != t_field::T_REQUIRED); if (is_optional) { - indent_impl(out) << tmp_first << " : System.Boolean;" << endl; + indent_impl(out) << tmp_first << " : System.Boolean;" << '\n'; useFirstFlag = true; } break; } indent_down_impl(); - indent_impl(out) << "begin" << endl; + indent_impl(out) << "begin" << '\n'; indent_up_impl(); - indent_impl(out) << tmp_sb << " := TThriftStringBuilder.Create('(');" << endl; - indent_impl(out) << "try" << endl; + indent_impl(out) << tmp_sb << " := TThriftStringBuilder.Create('(');" << '\n'; + indent_impl(out) << "try" << '\n'; indent_up_impl(); if (useFirstFlag) { - indent_impl(out) << tmp_first << " := TRUE;" << endl; + indent_impl(out) << tmp_first << " := TRUE;" << '\n'; } bool had_required = false; // set to true after first required field has been processed @@ -3955,26 +3953,26 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, if (is_optional) { out << " and " << prop_name(*f_iter, is_exception,"__isset_"); } - out << " then begin" << endl; + out << " then begin" << '\n'; indent_up_impl(); } else { if (is_optional) { indent_impl(out) << "if (" << prop_name(*f_iter, is_exception, "__isset_") << ") then begin" - << endl; + << '\n'; indent_up_impl(); } } if (useFirstFlag && (!had_required)) { - indent_impl(out) << "if not " << tmp_first << " then " << tmp_sb << ".Append(',');" << endl; + indent_impl(out) << "if not " << tmp_first << " then " << tmp_sb << ".Append(',');" << '\n'; if (is_optional) { - indent_impl(out) << tmp_first << " := FALSE;" << endl; + indent_impl(out) << tmp_first << " := FALSE;" << '\n'; } indent_impl(out) << tmp_sb << ".Append('" << prop_name((*f_iter), is_exception) << ": ');" - << endl; + << '\n'; } else { indent_impl(out) << tmp_sb << ".Append(', " << prop_name((*f_iter), is_exception) << ": ');" - << endl; + << '\n'; } t_type* ttype = (*f_iter)->get_type(); @@ -3985,23 +3983,23 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, if (ttype->is_xception() || ttype->is_struct()) { indent_impl(out) << "if (Self." << prop_name((*f_iter), is_exception) << " = nil) then " << tmp_sb << ".Append('') else " << tmp_sb << ".Append( Self." - << prop_name((*f_iter), is_exception) << ".ToString());" << endl; + << prop_name((*f_iter), is_exception) << ".ToString());" << '\n'; } else if (ttype->is_enum()) { - indent_impl(out) << tmp_sb << ".Append(EnumUtils<" - << type_name(ttype, false, true, false, false) - << ">.ToString( System.Ord( Self." - << prop_name((*f_iter), is_exception) << ")));" << endl; + indent_impl(out) << tmp_sb << ".Append(EnumUtils<" + << type_name(ttype, false, true, false, false) + << ">.ToString( System.Ord( Self." + << prop_name((*f_iter), is_exception) << ")));" << '\n'; } else if (ttype->is_uuid()) { indent_impl(out) << tmp_sb << ".Append( GUIDToString(Self." << prop_name((*f_iter), is_exception) << "));" - << endl; + << '\n'; } else { indent_impl(out) << tmp_sb << ".Append( Self." << prop_name((*f_iter), is_exception) << ");" - << endl; + << '\n'; } if (null_allowed || is_optional) { indent_down_impl(); - indent_impl(out) << "end;" << endl; + indent_impl(out) << "end;" << '\n'; } if (!is_optional) { @@ -4009,21 +4007,21 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, } } - indent_impl(out) << tmp_sb << ".Append(')');" << endl; - indent_impl(out) << "Result := " << tmp_sb << ".ToString;" << endl; + indent_impl(out) << tmp_sb << ".Append(')');" << '\n'; + indent_impl(out) << "Result := " << tmp_sb << ".ToString;" << '\n'; if (useFirstFlag) { - indent_impl(out) << "if " << tmp_first << " then {prevent warning};" << endl; + indent_impl(out) << "if " << tmp_first << " then {prevent warning};" << '\n'; } indent_down_impl(); - indent_impl(out) << "finally" << endl; + indent_impl(out) << "finally" << '\n'; indent_up_impl(); - indent_impl(out) << tmp_sb << ".Free;" << endl; + indent_impl(out) << tmp_sb << ".Free;" << '\n'; indent_down_impl(); - indent_impl(out) << "end;" << endl; + indent_impl(out) << "end;" << '\n'; indent_down_impl(); - indent_impl(out) << "end;" << endl << endl; + indent_impl(out) << "end;" << '\n' << '\n'; } bool t_delphi_generator::is_void(t_type* type) { diff --git a/compiler/cpp/src/thrift/generate/t_erl_generator.cc b/compiler/cpp/src/thrift/generate/t_erl_generator.cc index 72939729668..f28c7fd81d5 100644 --- a/compiler/cpp/src/thrift/generate/t_erl_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_erl_generator.cc @@ -39,8 +39,6 @@ using std::string; using std::stringstream; using std::vector; -static const std::string endl = "\n"; // avoid ostream << std::endl flushes - /** * Erlang code generator. * @@ -268,14 +266,14 @@ void t_erl_generator::init_generator() { hrl_header(f_types_hrl_file_, program_module_name + "_types"); - f_types_file_ << erl_autogen_comment() << endl - << "-module(" << program_module_name << "_types)." << endl - << erl_imports() << endl; + f_types_file_ << erl_autogen_comment() << '\n' + << "-module(" << program_module_name << "_types)." << '\n' + << erl_imports() << '\n'; - f_types_file_ << "-include(\"" << program_module_name << "_types.hrl\")." << endl - << endl; + f_types_file_ << "-include(\"" << program_module_name << "_types.hrl\")." << '\n' + << '\n'; - f_types_hrl_file_ << render_includes() << endl; + f_types_hrl_file_ << render_includes() << '\n'; // consts files string f_consts_name = get_out_dir() + program_module_name + "_constants.erl"; @@ -284,28 +282,28 @@ void t_erl_generator::init_generator() { f_consts_file_.open(f_consts_name.c_str()); f_consts_hrl_file_.open(f_consts_hrl_name.c_str()); - f_consts_file_ << erl_autogen_comment() << endl - << "-module(" << program_module_name << "_constants)." << endl - << erl_imports() << endl - << "-include(\"" << program_module_name << "_types.hrl\")." << endl - << endl; + f_consts_file_ << erl_autogen_comment() << '\n' + << "-module(" << program_module_name << "_constants)." << '\n' + << erl_imports() << '\n' + << "-include(\"" << program_module_name << "_types.hrl\")." << '\n' + << '\n'; - f_consts_hrl_file_ << erl_autogen_comment() << endl << erl_imports() << endl - << "-include(\"" << program_module_name << "_types.hrl\")." << endl << endl; + f_consts_hrl_file_ << erl_autogen_comment() << '\n' << erl_imports() << '\n' + << "-include(\"" << program_module_name << "_types.hrl\")." << '\n' << '\n'; } /** * Boilerplate at beginning and end of header files */ void t_erl_generator::hrl_header(ostream& out, string name) { - out << erl_autogen_comment() << endl - << "-ifndef(_" << name << "_included)." << endl << "-define(_" << name << "_included, yeah)." - << endl; + out << erl_autogen_comment() << '\n' + << "-ifndef(_" << name << "_included)." << '\n' << "-define(_" << name << "_included, yeah)." + << '\n'; } void t_erl_generator::hrl_footer(ostream& out, string name) { (void)name; - out << "-endif." << endl; + out << "-endif." << '\n'; } /** @@ -365,13 +363,13 @@ void t_erl_generator::close_generator() { export_types_string("struct_names", 0); export_types_string("exception_names", 0); - f_types_file_ << "-export([" << export_types_lines_.str() << "])." << endl << endl; + f_types_file_ << "-export([" << export_types_lines_.str() << "])." << '\n' << '\n'; f_types_file_ << f_info_.str(); - f_types_file_ << "struct_info(_) -> erlang:error(function_clause)." << endl << endl; + f_types_file_ << "struct_info(_) -> erlang:error(function_clause)." << '\n' << '\n'; f_types_file_ << f_info_ext_.str(); - f_types_file_ << "struct_info_ext(_) -> erlang:error(function_clause)." << endl << endl; + f_types_file_ << "struct_info_ext(_) -> erlang:error(function_clause)." << '\n' << '\n'; generate_const_functions(); @@ -527,10 +525,10 @@ void t_erl_generator::generate_enum(t_enum* tenum) { string name = (*c_iter)->get_name(); indent(f_types_hrl_file_) << "-define(" << constify(make_safe_for_module_name(program_name_)) << "_" << constify(tenum->get_name()) << "_" << constify(name) << ", " - << value << ")." << endl; + << value << ")." << '\n'; } - f_types_hrl_file_ << endl; + f_types_hrl_file_ << '\n'; } void t_erl_generator::generate_enum_info(t_enum* tenum){ @@ -551,7 +549,7 @@ void t_erl_generator::generate_enum_info(t_enum* tenum){ } indent_down(); } - f_types_file_ << "\n"; + f_types_file_ << '\n'; indent(f_types_file_) << "];\n\n"; indent_down(); } @@ -579,7 +577,7 @@ void t_erl_generator::generate_const(t_const* tconst) { v_consts_.push_back(tconst); f_consts_hrl_file_ << "-define(" << constify(make_safe_for_module_name(program_name_)) << "_" - << constify(name) << ", " << render_const_value(type, value) << ")." << endl << endl; + << constify(name) << ", " << render_const_value(type, value) << ")." << '\n' << '\n'; } /** @@ -809,7 +807,7 @@ void t_erl_generator::generate_erl_struct(t_struct* tstruct, bool is_exception) * @param tstruct The struct definition */ void t_erl_generator::generate_erl_struct_definition(ostream& out, t_struct* tstruct) { - indent(out) << "%% struct " << type_name(tstruct) << endl << endl; + indent(out) << "%% struct " << type_name(tstruct) << '\n' << '\n'; std::stringstream buf; buf << indent() << "-record(" << type_name(tstruct) << ", {"; @@ -819,13 +817,13 @@ void t_erl_generator::generate_erl_struct_definition(ostream& out, t_struct* tst for (vector::const_iterator m_iter = members.begin(); m_iter != members.end();) { generate_erl_struct_member(buf, *m_iter); if (++m_iter != members.end()) { - buf << "," << endl << field_indent; + buf << "," << '\n' << field_indent; } } buf << "})."; - out << buf.str() << endl; - out << "-type " + type_name(tstruct) << "() :: #" + type_name(tstruct) + "{}." << endl << endl; + out << buf.str() << '\n'; + out << "-type " + type_name(tstruct) << "() :: #" + type_name(tstruct) + "{}." << '\n' << '\n'; } /** @@ -871,19 +869,19 @@ string t_erl_generator::render_member_value(t_field* field) { * Generates the read method for a struct */ void t_erl_generator::generate_erl_struct_info(ostream& out, t_struct* tstruct) { - indent(out) << "struct_info(" << type_name(tstruct) << ") ->" << endl; + indent(out) << "struct_info(" << type_name(tstruct) << ") ->" << '\n'; indent_up(); - out << indent() << render_type_term(tstruct, true) << ";" << endl; + out << indent() << render_type_term(tstruct, true) << ";" << '\n'; indent_down(); - out << endl; + out << '\n'; } void t_erl_generator::generate_erl_extended_struct_info(ostream& out, t_struct* tstruct) { - indent(out) << "struct_info_ext(" << type_name(tstruct) << ") ->" << endl; + indent(out) << "struct_info_ext(" << type_name(tstruct) << ") ->" << '\n'; indent_up(); - out << indent() << render_type_term(tstruct, true, true) << ";" << endl; + out << indent() << render_type_term(tstruct, true, true) << ";" << '\n'; indent_down(); - out << endl; + out << '\n'; } /** @@ -909,11 +907,11 @@ void t_erl_generator::generate_service(t_service* tservice) { if (tservice->get_extends() != nullptr) { f_service_hrl_ << "-include(\"" << make_safe_for_module_name(tservice->get_extends()->get_name()) - << "_thrift.hrl\"). % inherit " << endl; + << "_thrift.hrl\"). % inherit " << '\n'; } f_service_hrl_ << "-include(\"" << make_safe_for_module_name(program_name_) << "_types.hrl\")." - << endl << endl; + << '\n' << '\n'; // Generate the three main parts of the service (well, two for now in PHP) generate_service_helpers(tservice); // cpiro: New Erlang Order @@ -924,13 +922,13 @@ void t_erl_generator::generate_service(t_service* tservice) { // indent_down(); - f_service_file_ << erl_autogen_comment() << endl << "-module(" << service_name_ << "_thrift)." - << endl << "-behaviour(thrift_service)." << endl << endl << erl_imports() << endl; + f_service_file_ << erl_autogen_comment() << '\n' << "-module(" << service_name_ << "_thrift)." + << '\n' << "-behaviour(thrift_service)." << '\n' << '\n' << erl_imports() << '\n'; f_service_file_ << "-include(\"" << make_safe_for_module_name(tservice->get_name()) - << "_thrift.hrl\")." << endl << endl; + << "_thrift.hrl\")." << '\n' << '\n'; - f_service_file_ << "-export([" << export_lines_.str() << "])." << endl << endl; + f_service_file_ << "-export([" << export_lines_.str() << "])." << '\n' << '\n'; f_service_file_ << f_service_.str(); @@ -946,7 +944,7 @@ void t_erl_generator::generate_service_metadata(t_service* tservice) { vector functions = tservice->get_functions(); size_t num_functions = functions.size(); - indent(f_service_) << "function_names() -> " << endl; + indent(f_service_) << "function_names() -> " << '\n'; indent_up(); indent(f_service_) << "["; @@ -972,14 +970,14 @@ void t_erl_generator::generate_service_helpers(t_service* tservice) { vector::iterator f_iter; // indent(f_service_) << - // "% HELPER FUNCTIONS AND STRUCTURES" << endl << endl; + // "% HELPER FUNCTIONS AND STRUCTURES" << '\n' << '\n'; export_string("struct_info", 1); for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_erl_function_helpers(*f_iter); } - f_service_ << "struct_info(_) -> erlang:error(function_clause)." << endl; + f_service_ << "struct_info(_) -> erlang:error(function_clause)." << '\n'; } /** @@ -1002,26 +1000,26 @@ void t_erl_generator::generate_service_interface(t_service* tservice) { vector functions = tservice->get_functions(); vector::iterator f_iter; - f_service_ << "%%% interface" << endl; + f_service_ << "%%% interface" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { - f_service_ << indent() << "% " << function_signature(*f_iter) << endl; + f_service_ << indent() << "% " << function_signature(*f_iter) << '\n'; generate_function_info(tservice, *f_iter); } // Inheritance - pass unknown functions to base class if (tservice->get_extends() != nullptr) { - indent(f_service_) << "function_info(Function, InfoType) ->" << endl; + indent(f_service_) << "function_info(Function, InfoType) ->" << '\n'; indent_up(); indent(f_service_) << make_safe_for_module_name(tservice->get_extends()->get_name()) - << "_thrift:function_info(Function, InfoType)." << endl; + << "_thrift:function_info(Function, InfoType)." << '\n'; indent_down(); } else { // return function_clause error for non-existent functions - indent(f_service_) << "function_info(_Func, _Info) -> erlang:error(function_clause)." << endl; + indent(f_service_) << "function_info(_Func, _Info) -> erlang:error(function_clause)." << '\n'; } - indent(f_service_) << endl; + indent(f_service_) << '\n'; } /** @@ -1036,30 +1034,30 @@ void t_erl_generator::generate_function_info(t_service* tservice, t_function* tf t_struct* arg_struct = tfunction->get_arglist(); // function_info(Function, params_type): - indent(f_service_) << "function_info(" << name_atom << ", params_type) ->" << endl; + indent(f_service_) << "function_info(" << name_atom << ", params_type) ->" << '\n'; indent_up(); - indent(f_service_) << render_type_term(arg_struct, true) << ";" << endl; + indent(f_service_) << render_type_term(arg_struct, true) << ";" << '\n'; indent_down(); // function_info(Function, reply_type): - indent(f_service_) << "function_info(" << name_atom << ", reply_type) ->" << endl; + indent(f_service_) << "function_info(" << name_atom << ", reply_type) ->" << '\n'; indent_up(); if (!tfunction->get_returntype()->is_void()) - indent(f_service_) << render_type_term(tfunction->get_returntype(), false) << ";" << endl; + indent(f_service_) << render_type_term(tfunction->get_returntype(), false) << ";" << '\n'; else if (tfunction->is_oneway()) - indent(f_service_) << "oneway_void;" << endl; + indent(f_service_) << "oneway_void;" << '\n'; else indent(f_service_) << "{struct, []}" - << ";" << endl; + << ";" << '\n'; indent_down(); // function_info(Function, exceptions): - indent(f_service_) << "function_info(" << name_atom << ", exceptions) ->" << endl; + indent(f_service_) << "function_info(" << name_atom << ", exceptions) ->" << '\n'; indent_up(); - indent(f_service_) << render_type_term(xs, true) << ";" << endl; + indent(f_service_) << render_type_term(xs, true) << ";" << '\n'; indent_down(); } @@ -1246,11 +1244,11 @@ std::string t_erl_generator::render_type_term(t_type* type, } if (++i != end) { - buf << "," << endl << field_indent; + buf << "," << '\n' << field_indent; } } - buf << "]}" << endl; + buf << "]}" << '\n'; return buf.str(); } else { return "{struct, {" + atomify(type_module(type)) + ", " + type_name(type) + "}}"; diff --git a/compiler/cpp/src/thrift/generate/t_generator.cc b/compiler/cpp/src/thrift/generate/t_generator.cc index 970281e74cf..68602377ed5 100644 --- a/compiler/cpp/src/thrift/generate/t_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_generator.cc @@ -77,8 +77,8 @@ void t_generator::generate_program() { } std::set t_generator::lang_keywords_for_validation() const { - // Nothing by default. It makes no sense to restrict the whole world to use non-PHP keywords only. - // Override on a per-generator(!) basis if you cannot live without it, e.g. that particular language has no + // Nothing by default. It makes no sense to restrict the whole world to use non-PHP keywords only. + // Override on a per-generator(!) basis if you cannot live without it, e.g. that particular language has no // mechanism or way to deal with it properly, so we absolutely need to fail on it as the last possible resort. return {}; } @@ -172,11 +172,11 @@ void t_generator::generate_docstring_comment(ostream& out, docs.getline(line, 1024); if (strlen(line) > 0) { - indent(out) << line_prefix << line << std::endl; + indent(out) << line_prefix << line << '\n'; } else if (line_prefix.empty()){ - out << std::endl; + out << '\n'; } else if(!docs.eof()) { - indent(out) << line_prefix << std::endl; + indent(out) << line_prefix << '\n'; } } if (!comment_end.empty()) diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc index db30c8bae8c..72a9f065a53 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc @@ -518,7 +518,7 @@ void t_go_generator::init_generator() { f_consts_ << go_autogen_comment() << go_package() << render_includes(true); - f_const_values_ << endl << "func init() {" << endl; + f_const_values_ << '\n' << "func init() {" << '\n'; // Create file for the GoUnusedProtection__ variable string f_unused_prot_name_ = package_dir_ + "/" + "GoUnusedProtection__.go"; @@ -744,7 +744,7 @@ string t_go_generator::go_imports_end() { * Closes the type files */ void t_go_generator::close_generator() { - f_const_values_ << "}" << endl << endl; + f_const_values_ << "}" << '\n' << '\n'; f_consts_ << f_const_values_.str(); // Close types and constants files @@ -768,11 +768,11 @@ void t_go_generator::generate_typedef(t_typedef* ttypedef) { return; } - f_types_ << "type " << new_type_name << " " << base_type << endl << endl; + f_types_ << "type " << new_type_name << " " << base_type << '\n' << '\n'; // Generate a convenience function that converts an instance of a type // (which may be a constant) into a pointer to an instance of a type. f_types_ << "func " << new_type_name << "Ptr(v " << new_type_name << ") *" << new_type_name - << " { return &v }" << endl << endl; + << " { return &v }" << '\n' << '\n'; } /** @@ -785,14 +785,14 @@ void t_go_generator::generate_enum(t_enum* tenum) { std::ostringstream to_string_mapping, from_string_mapping; std::string tenum_name(publicize(tenum->get_name())); generate_go_docstring(f_types_, tenum); - f_types_ << "type " << tenum_name << " int64" << endl << "const (" << endl; + f_types_ << "type " << tenum_name << " int64" << '\n' << "const (" << '\n'; - to_string_mapping << indent() << "func (p " << tenum_name << ") String() string {" << endl; - to_string_mapping << indent() << " switch p {" << endl; + to_string_mapping << indent() << "func (p " << tenum_name << ") String() string {" << '\n'; + to_string_mapping << indent() << " switch p {" << '\n'; from_string_mapping << indent() << "func " << tenum_name << "FromString(s string) (" << tenum_name - << ", error) {" << endl; - from_string_mapping << indent() << " switch s {" << endl; + << ", error) {" << '\n'; + from_string_mapping << indent() << " switch s {" << '\n'; vector constants = tenum->get_constants(); vector::iterator c_iter; @@ -804,68 +804,68 @@ void t_go_generator::generate_enum(t_enum* tenum) { string iter_std_name(escape_string((*c_iter)->get_name())); string iter_name((*c_iter)->get_name()); f_types_ << indent() << " " << tenum_name << "_" << iter_name << ' ' << tenum_name << " = " - << value << endl; + << value << '\n'; // Dictionaries to/from string names of enums to_string_mapping << indent() << " case " << tenum_name << "_" << iter_name << ": return \"" - << iter_std_name << "\"" << endl; + << iter_std_name << "\"" << '\n'; if (iter_std_name != escape_string(iter_name)) { from_string_mapping << indent() << " case \"" << iter_std_name << "\", \"" << escape_string(iter_name) << "\": return " << tenum_name << "_" - << iter_name << ", nil " << endl; + << iter_name << ", nil " << '\n'; } else { from_string_mapping << indent() << " case \"" << iter_std_name << "\": return " << tenum_name - << "_" << iter_name << ", nil " << endl; + << "_" << iter_name << ", nil " << '\n'; } } - to_string_mapping << indent() << " }" << endl; - to_string_mapping << indent() << " return \"\"" << endl; - to_string_mapping << indent() << "}" << endl; - from_string_mapping << indent() << " }" << endl; + to_string_mapping << indent() << " }" << '\n'; + to_string_mapping << indent() << " return \"\"" << '\n'; + to_string_mapping << indent() << "}" << '\n'; + from_string_mapping << indent() << " }" << '\n'; from_string_mapping << indent() << " return " << tenum_name << "(0)," - << " fmt.Errorf(\"not a valid " << tenum_name << " string\")" << endl; - from_string_mapping << indent() << "}" << endl; + << " fmt.Errorf(\"not a valid " << tenum_name << " string\")" << '\n'; + from_string_mapping << indent() << "}" << '\n'; - f_types_ << ")" << endl << endl << to_string_mapping.str() << endl << from_string_mapping.str() - << endl << endl; + f_types_ << ")" << '\n' << '\n' << to_string_mapping.str() << '\n' << from_string_mapping.str() + << '\n' << '\n'; // Generate a convenience function that converts an instance of an enum // (which may be a constant) into a pointer to an instance of that enum // type. f_types_ << "func " << tenum_name << "Ptr(v " << tenum_name << ") *" << tenum_name - << " { return &v }" << endl << endl; + << " { return &v }" << '\n' << '\n'; // Generate MarshalText - f_types_ << "func (p " << tenum_name << ") MarshalText() ([]byte, error) {" << endl; - f_types_ << "return []byte(p.String()), nil" << endl; - f_types_ << "}" << endl << endl; + f_types_ << "func (p " << tenum_name << ") MarshalText() ([]byte, error) {" << '\n'; + f_types_ << "return []byte(p.String()), nil" << '\n'; + f_types_ << "}" << '\n' << '\n'; // Generate UnmarshalText - f_types_ << "func (p *" << tenum_name << ") UnmarshalText(text []byte) error {" << endl; - f_types_ << "q, err := " << tenum_name << "FromString(string(text))" << endl; - f_types_ << "if (err != nil) {" << endl << "return err" << endl << "}" << endl; - f_types_ << "*p = q" << endl; - f_types_ << "return nil" << endl; - f_types_ << "}" << endl << endl; + f_types_ << "func (p *" << tenum_name << ") UnmarshalText(text []byte) error {" << '\n'; + f_types_ << "q, err := " << tenum_name << "FromString(string(text))" << '\n'; + f_types_ << "if (err != nil) {" << '\n' << "return err" << '\n' << "}" << '\n'; + f_types_ << "*p = q" << '\n'; + f_types_ << "return nil" << '\n'; + f_types_ << "}" << '\n' << '\n'; // Generate Scan for sql.Scanner interface - f_types_ << "func (p *" << tenum_name << ") Scan(value interface{}) error {" <get_name()); t_const_value* value = tconst->get_value(); if (type->is_enum() || (type->is_base_type() && ((t_base_type*)type)->get_base() != t_base_type::TYPE_UUID)) { - indent(f_consts_) << "const " << name << " = " << render_const_value(type, value, name) << endl; + indent(f_consts_) << "const " << name << " = " << render_const_value(type, value, name) << '\n'; } else { - f_const_values_ << indent() << name << " = " << render_const_value(type, value, name) << endl - << endl; + f_const_values_ << indent() << name << " = " << render_const_value(type, value, name) << '\n' + << '\n'; - f_consts_ << indent() << "var " << name << " " << type_to_go_type(type) << endl; + f_consts_ << indent() << "var " << name << " " << type_to_go_type(type) << '\n'; } } @@ -1079,8 +1079,8 @@ string t_go_generator::render_const_value(t_type* type, t_const_value* value, co if (field_type == nullptr) { throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string(); } - out << endl << indent() << publicize(v_iter->first->get_string()) << ": " - << render_const_value(field_type, v_iter->second, name, is_optional) << "," << endl; + out << '\n' << indent() << publicize(v_iter->first->get_string()) << ": " + << render_const_value(field_type, v_iter->second, name, is_optional) << "," << '\n'; } indent_down(); @@ -1090,13 +1090,13 @@ string t_go_generator::render_const_value(t_type* type, t_const_value* value, co t_type* ktype = ((t_map*)type)->get_key_type(); t_type* vtype = ((t_map*)type)->get_val_type(); const map& val = value->get_map(); - out << "map[" << type_to_go_key_type(ktype) << "]" << type_to_go_type(vtype) << "{" << endl; + out << "map[" << type_to_go_key_type(ktype) << "]" << type_to_go_type(vtype) << "{" << '\n'; indent_up(); map::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { out << indent() << render_const_value(ktype, v_iter->first, name) << ": " - << render_const_value(vtype, v_iter->second, name) << "," << endl; + << render_const_value(vtype, v_iter->second, name) << "," << '\n'; } indent_down(); @@ -1104,7 +1104,7 @@ string t_go_generator::render_const_value(t_type* type, t_const_value* value, co } else if (type->is_list()) { t_type* etype = ((t_list*)type)->get_elem_type(); const vector& val = value->get_list(); - out << "[]" << type_to_go_type(etype) << "{" << endl; + out << "[]" << type_to_go_type(etype) << "{" << '\n'; indent_up(); vector::const_iterator v_iter; @@ -1117,7 +1117,7 @@ string t_go_generator::render_const_value(t_type* type, t_const_value* value, co } else if (type->is_set()) { t_type* etype = ((t_set*)type)->get_elem_type(); const vector& val = value->get_list(); - out << "[]" << type_to_go_type(etype) << "{" << endl; + out << "[]" << type_to_go_type(etype) << "{" << '\n'; indent_up(); vector::const_iterator v_iter; @@ -1158,12 +1158,12 @@ void t_go_generator::generate_go_struct(t_struct* tstruct, bool is_exception) { generate_go_struct_definition(f_types_, tstruct, is_exception); // generate Validate function std::string tstruct_name(publicize(tstruct->get_name(), false)); - f_types_ << "func (p *" << tstruct_name << ") Validate() error {" << endl; + f_types_ << "func (p *" << tstruct_name << ") Validate() error {" << '\n'; indent_up(); go_validator_generator(this).generate_struct_validator(f_types_, tstruct); - f_types_ << indent() << "return nil" << endl; + f_types_ << indent() << "return nil" << '\n'; indent_down(); - f_types_ << "}" << endl; + f_types_ << "}" << '\n'; } void t_go_generator::get_publicized_name_and_def_value(t_field* tfield, @@ -1186,13 +1186,13 @@ void t_go_generator::generate_go_struct_initializer(ostream& out, t_const_value* def_value; get_publicized_name_and_def_value(member, &publicized_name, &def_value); if (!pointer_field && def_value != nullptr && !omit_initialization(member)) { - out << endl << indent() << publicized_name << ": " + out << '\n' << indent() << publicized_name << ": " << render_field_initial_value(member, member->get_name(), pointer_field) << "," - << endl; + << '\n'; } } - out << "}" << endl; + out << "}" << '\n'; } /** @@ -1211,7 +1211,7 @@ void t_go_generator::generate_go_struct_definition(ostream& out, std::string tstruct_name(publicize(tstruct->get_name(), is_args || is_result)); generate_go_docstring(out, tstruct); - out << indent() << "type " << tstruct_name << " struct {" << endl; + out << indent() << "type " << tstruct_name << " struct {" << '\n'; /* Here we generate the structure specification for the fastbinary codec. These specifications have the following structure: @@ -1253,9 +1253,9 @@ void t_go_generator::generate_go_struct_definition(ostream& out, } int last_unused = sorted_keys_pos - 1; if (first_unused < last_unused) { - indent(out) << "// unused fields # " << first_unused << " to " << last_unused << endl; + indent(out) << "// unused fields # " << first_unused << " to " << last_unused << '\n'; } else if (first_unused == last_unused) { - indent(out) << "// unused field # " << first_unused << endl; + indent(out) << "// unused field # " << first_unused << '\n'; } } @@ -1296,25 +1296,25 @@ void t_go_generator::generate_go_struct_definition(ostream& out, out << ",required"; } - out << "\" " << gotag << "`" << endl; + out << "\" " << gotag << "`" << '\n'; sorted_keys_pos++; } } else { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { // This fills in default values, as opposed to nulls out << indent() << publicize((*m_iter)->get_name()) << " " - << type_to_go_type((*m_iter)->get_type()) << endl; + << type_to_go_type((*m_iter)->get_type()) << '\n'; } } indent_down(); - out << indent() << "}" << endl << endl; - out << indent() << "func New" << tstruct_name << "() *" << tstruct_name << " {" << endl; + out << indent() << "}" << '\n' << '\n'; + out << indent() << "func New" << tstruct_name << "() *" << tstruct_name << " {" << '\n'; indent_up(); out << indent() << "return &"; generate_go_struct_initializer(out, tstruct, is_result || is_args); indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; // Default values for optional fields for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { string publicized_name; @@ -1328,7 +1328,7 @@ void t_go_generator::generate_go_struct_definition(ostream& out, if (def_value != nullptr) { out << " = " << render_const_value(fieldType, def_value, (*m_iter)->get_name()); } - out << endl; + out << '\n'; } // num_setable is used for deciding if Count* methods will be generated for union fields. @@ -1342,24 +1342,24 @@ void t_go_generator::generate_go_struct_definition(ostream& out, string goOptType = type_to_go_type_with_opt(fieldType, true); string maybepointer = goOptType != goType ? "*" : ""; out << indent() << "func (p *" << tstruct_name << ") Get" << publicized_name << "() " - << goType << " {" << endl; + << goType << " {" << '\n'; indent_up(); - out << indent() << "if !p.IsSet" << publicized_name << "() {" << endl; + out << indent() << "if !p.IsSet" << publicized_name << "() {" << '\n'; indent_up(); - out << indent() << "return " << def_var_name << endl; + out << indent() << "return " << def_var_name << '\n'; indent_down(); - out << indent() << "}" << endl; - out << indent() << "return " << maybepointer << "p." << publicized_name << endl; + out << indent() << "}" << '\n'; + out << indent() << "return " << maybepointer << "p." << publicized_name << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } else { - out << endl; + out << '\n'; out << indent() << "func (p *" << tstruct_name << ") Get" << publicized_name << "() " - << goType << " {" << endl; + << goType << " {" << '\n'; indent_up(); - out << indent() << "return p." << publicized_name << endl; + out << indent() << "return p." << publicized_name << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } @@ -1374,57 +1374,57 @@ void t_go_generator::generate_go_struct_definition(ostream& out, generate_go_struct_equals(out, tstruct, tstruct_name); } - out << indent() << "func (p *" << tstruct_name << ") String() string {" << endl; + out << indent() << "func (p *" << tstruct_name << ") String() string {" << '\n'; indent_up(); - out << indent() << "if p == nil {" << endl; + out << indent() << "if p == nil {" << '\n'; indent_up(); - out << indent() << "return \"\"" << endl; + out << indent() << "return \"\"" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; out << indent() << "return fmt.Sprintf(\"" << escape_string(tstruct_name) << "(%+v)\", *p)" - << endl; + << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; if (is_exception) { - out << indent() << "func (p *" << tstruct_name << ") Error() string {" << endl; + out << indent() << "func (p *" << tstruct_name << ") Error() string {" << '\n'; indent_up(); - out << indent() << "return p.String()" << endl; + out << indent() << "return p.String()" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; - out << indent() << "func (" << tstruct_name << ") TExceptionType() thrift.TExceptionType {" << endl; + out << indent() << "func (" << tstruct_name << ") TExceptionType() thrift.TExceptionType {" << '\n'; indent_up(); - out << indent() << "return thrift.TExceptionTypeCompiled" << endl; + out << indent() << "return thrift.TExceptionTypeCompiled" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; out << indent() << "var _ thrift.TException = (*" << tstruct_name << ")(nil)" - << endl << endl; + << '\n' << '\n'; } if (!read_write_private_) { // Generate the implementation of slog.LogValuer, // see: https://issues.apache.org/jira/browse/THRIFT-5745 - out << indent() << "func (p *" << tstruct_name << ") LogValue() slog.Value {" << endl; + out << indent() << "func (p *" << tstruct_name << ") LogValue() slog.Value {" << '\n'; indent_up(); - out << indent() << "if p == nil {" << endl; + out << indent() << "if p == nil {" << '\n'; indent_up(); - out << indent() << "return slog.AnyValue(nil)" << endl; + out << indent() << "return slog.AnyValue(nil)" << '\n'; indent_down(); - out << indent() << "}" << endl; - out << indent() << "v := thrift.SlogTStructWrapper{" << endl; + out << indent() << "}" << '\n'; + out << indent() << "v := thrift.SlogTStructWrapper{" << '\n'; indent_up(); - out << indent() << "Type: \"*" << package_name_ << "." << tstruct_name << "\"," << endl; - out << indent() << "Value: p," << endl; + out << indent() << "Type: \"*" << package_name_ << "." << tstruct_name << "\"," << '\n'; + out << indent() << "Value: p," << '\n'; indent_down(); - out << indent() << "}" << endl; - out << indent() << "return slog.AnyValue(v)" << endl; + out << indent() << "}" << '\n'; + out << indent() << "return slog.AnyValue(v)" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; out << indent() << "var _ slog.LogValuer = (*" << tstruct_name << ")(nil)" - << endl << endl; + << '\n' << '\n'; } } @@ -1444,25 +1444,25 @@ void t_go_generator::generate_isset_helpers(ostream& out, const string field_name(publicize(escape_string((*f_iter)->get_name()))); if ((*f_iter)->get_req() == t_field::T_OPTIONAL || is_pointer_field(*f_iter)) { out << indent() << "func (p *" << tstruct_name << ") IsSet" << field_name << "() bool {" - << endl; + << '\n'; indent_up(); t_type* ttype = (*f_iter)->get_type()->get_true_type(); bool is_byteslice = ttype->is_binary(); bool compare_to_nil_only = ttype->is_set() || ttype->is_list() || ttype->is_map() || (is_byteslice && !(*f_iter)->get_value()); if (is_pointer_field(*f_iter) || compare_to_nil_only) { - out << indent() << "return p." << field_name << " != nil" << endl; + out << indent() << "return p." << field_name << " != nil" << '\n'; } else { string def_var_name = tstruct_name + "_" + field_name + "_DEFAULT"; if (is_byteslice) { out << indent() << "return !bytes.Equal(p." << field_name << ", " << def_var_name << ")" - << endl; + << '\n'; } else { - out << indent() << "return p." << field_name << " != " << def_var_name << endl; + out << indent() << "return p." << field_name << " != " << def_var_name << '\n'; } } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } } } @@ -1480,9 +1480,9 @@ void t_go_generator::generate_countsetfields_helper(ostream& out, const string escaped_tstruct_name(escape_string(tstruct->get_name())); out << indent() << "func (p *" << tstruct_name << ") CountSetFields" << tstruct_name << "() int {" - << endl; + << '\n'; indent_up(); - out << indent() << "count := 0" << endl; + out << indent() << "count := 0" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) continue; @@ -1494,16 +1494,16 @@ void t_go_generator::generate_countsetfields_helper(ostream& out, const string field_name(publicize(escape_string((*f_iter)->get_name()))); - out << indent() << "if (p.IsSet" << field_name << "()) {" << endl; + out << indent() << "if (p.IsSet" << field_name << "()) {" << '\n'; indent_up(); - out << indent() << "count++" << endl; + out << indent() << "count++" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } - out << indent() << "return count" << endl << endl; + out << indent() << "return count" << '\n' << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } /** @@ -1518,33 +1518,33 @@ void t_go_generator::generate_go_struct_reader(ostream& out, vector::const_iterator f_iter; string escaped_tstruct_name(escape_string(tstruct->get_name())); out << indent() << "func (p *" << tstruct_name << ") " << read_method_name_ << "(ctx context.Context, iprot thrift.TProtocol) error {" - << endl; + << '\n'; indent_up(); - out << indent() << "if _, err := iprot.ReadStructBegin(ctx); err != nil {" << endl; + out << indent() << "if _, err := iprot.ReadStructBegin(ctx); err != nil {" << '\n'; out << indent() << " return thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)" - << endl; - out << indent() << "}" << endl << endl; + << '\n'; + out << indent() << "}" << '\n' << '\n'; // Required variables does not have IsSet functions, so we need tmp vars to check them. for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) { const string field_name(publicize(escape_string((*f_iter)->get_name()))); - indent(out) << "var isset" << field_name << " bool = false;" << endl; + indent(out) << "var isset" << field_name << " bool = false;" << '\n'; } } - out << endl; + out << '\n'; // Loop over reading in fields - indent(out) << "for {" << endl; + indent(out) << "for {" << '\n'; indent_up(); // Read beginning field marker - out << indent() << "_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)" << endl; - out << indent() << "if err != nil {" << endl; + out << indent() << "_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)" << '\n'; + out << indent() << "if err != nil {" << '\n'; out << indent() << " return thrift.PrependError(fmt.Sprintf(" - "\"%T field %d read error: \", p, fieldId), err)" << endl; - out << indent() << "}" << endl; + "\"%T field %d read error: \", p, fieldId), err)" << '\n'; + out << indent() << "}" << '\n'; // Check for field STOP marker and break - out << indent() << "if fieldTypeId == thrift.STOP { break; }" << endl; + out << indent() << "if fieldTypeId == thrift.STOP { break; }" << '\n'; string thriftFieldTypeId; // Generate deserialization code for known cases @@ -1553,7 +1553,7 @@ void t_go_generator::generate_go_struct_reader(ostream& out, // Switch statement on the field we are reading, false if no fields present bool have_switch = !fields.empty(); if (have_switch) { - indent(out) << "switch fieldId {" << endl; + indent(out) << "switch fieldId {" << '\n'; } // All the fields we know @@ -1569,7 +1569,7 @@ void t_go_generator::generate_go_struct_reader(ostream& out, field_method_suffix *= -1; } - out << indent() << "case " << field_id << ":" << endl; + out << indent() << "case " << field_id << ":" << '\n'; indent_up(); thriftFieldTypeId = type_to_enum((*f_iter)->get_type()); @@ -1577,23 +1577,23 @@ void t_go_generator::generate_go_struct_reader(ostream& out, thriftFieldTypeId = "thrift.STRING"; } - out << indent() << "if fieldTypeId == " << thriftFieldTypeId << " {" << endl; + out << indent() << "if fieldTypeId == " << thriftFieldTypeId << " {" << '\n'; out << indent() << " if err := p." << field_method_prefix << field_method_suffix << "(ctx, iprot); err != nil {" - << endl; - out << indent() << " return err" << endl; - out << indent() << " }" << endl; + << '\n'; + out << indent() << " return err" << '\n'; + out << indent() << " }" << '\n'; // Mark required field as read if ((*f_iter)->get_req() == t_field::T_REQUIRED) { const string field_name(publicize(escape_string((*f_iter)->get_name()))); - out << indent() << " isset" << field_name << " = true" << endl; + out << indent() << " isset" << field_name << " = true" << '\n'; } - out << indent() << "} else {" << endl; - out << indent() << " if err := iprot.Skip(ctx, fieldTypeId); err != nil {" << endl; - out << indent() << " return err" << endl; - out << indent() << " }" << endl; - out << indent() << "}" << endl; + out << indent() << "} else {" << '\n'; + out << indent() << " if err := iprot.Skip(ctx, fieldTypeId); err != nil {" << '\n'; + out << indent() << " return err" << '\n'; + out << indent() << " }" << '\n'; + out << indent() << "}" << '\n'; indent_down(); @@ -1601,46 +1601,46 @@ void t_go_generator::generate_go_struct_reader(ostream& out, // Begin switch default case if (have_switch) { - out << indent() << "default:" << endl; + out << indent() << "default:" << '\n'; indent_up(); } // Skip unknown fields in either case - out << indent() << "if err := iprot.Skip(ctx, fieldTypeId); err != nil {" << endl; - out << indent() << " return err" << endl; - out << indent() << "}" << endl; + out << indent() << "if err := iprot.Skip(ctx, fieldTypeId); err != nil {" << '\n'; + out << indent() << " return err" << '\n'; + out << indent() << "}" << '\n'; // End switch default case if (have_switch) { indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } // Read field end marker - out << indent() << "if err := iprot.ReadFieldEnd(ctx); err != nil {" << endl; - out << indent() << " return err" << endl; - out << indent() << "}" << endl; + out << indent() << "if err := iprot.ReadFieldEnd(ctx); err != nil {" << '\n'; + out << indent() << " return err" << '\n'; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl; - out << indent() << "if err := iprot.ReadStructEnd(ctx); err != nil {" << endl; + out << indent() << "}" << '\n'; + out << indent() << "if err := iprot.ReadStructEnd(ctx); err != nil {" << '\n'; out << indent() << " return thrift.PrependError(fmt.Sprintf(" - "\"%T read struct end error: \", p), err)" << endl; - out << indent() << "}" << endl; + "\"%T read struct end error: \", p), err)" << '\n'; + out << indent() << "}" << '\n'; // Return error if any required fields are missing. for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) { const string field_name(publicize(escape_string((*f_iter)->get_name()))); - out << indent() << "if !isset" << field_name << "{" << endl; + out << indent() << "if !isset" << field_name << "{" << '\n'; out << indent() << " return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, " - "fmt.Errorf(\"Required field " << field_name << " is not set\"));" << endl; - out << indent() << "}" << endl; + "fmt.Errorf(\"Required field " << field_name << " is not set\"));" << '\n'; + out << indent() << "}" << '\n'; } } - out << indent() << "return nil" << endl; + out << indent() << "return nil" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { string field_type_name(publicize((*f_iter)->get_type()->get_name())); @@ -1655,12 +1655,12 @@ void t_go_generator::generate_go_struct_reader(ostream& out, } out << indent() << "func (p *" << tstruct_name << ") " << field_method_prefix << field_method_suffix - << "(ctx context.Context, iprot thrift.TProtocol) error {" << endl; + << "(ctx context.Context, iprot thrift.TProtocol) error {" << '\n'; indent_up(); generate_deserialize_field(out, *f_iter, false, "p."); indent_down(); - out << indent() << " return nil" << endl; - out << indent() << "}" << endl << endl; + out << indent() << " return nil" << '\n'; + out << indent() << "}" << '\n' << '\n'; } } @@ -1673,18 +1673,18 @@ void t_go_generator::generate_go_struct_writer(ostream& out, string name(tstruct->get_name()); const vector& fields = tstruct->get_sorted_members(); vector::const_iterator f_iter; - indent(out) << "func (p *" << tstruct_name << ") " << write_method_name_ << "(ctx context.Context, oprot thrift.TProtocol) error {" << endl; + indent(out) << "func (p *" << tstruct_name << ") " << write_method_name_ << "(ctx context.Context, oprot thrift.TProtocol) error {" << '\n'; indent_up(); if (tstruct->is_union() && uses_countsetfields) { std::string tstruct_name(publicize(tstruct->get_name())); - out << indent() << "if c := p.CountSetFields" << tstruct_name << "(); c != 1 {" << endl + out << indent() << "if c := p.CountSetFields" << tstruct_name << "(); c != 1 {" << '\n' << indent() << " return fmt.Errorf(\"%T write union: exactly one field must be set (%d set)\", p, c)" - << endl << indent() << "}" << endl; + << '\n' << indent() << "}" << '\n'; } - out << indent() << "if err := oprot.WriteStructBegin(ctx, \"" << name << "\"); err != nil {" << endl; + out << indent() << "if err := oprot.WriteStructBegin(ctx, \"" << name << "\"); err != nil {" << '\n'; out << indent() << " return thrift.PrependError(fmt.Sprintf(" - "\"%T write struct begin error: \", p), err) }" << endl; + "\"%T write struct begin error: \", p), err) }" << '\n'; string field_name; string escape_field_name; @@ -1692,7 +1692,7 @@ void t_go_generator::generate_go_struct_writer(ostream& out, t_field::e_req field_required; int32_t field_id = -1; - out << indent() << "if p != nil {" << endl; + out << indent() << "if p != nil {" << '\n'; indent_up(); for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { @@ -1708,20 +1708,20 @@ void t_go_generator::generate_go_struct_writer(ostream& out, } out << indent() << "if err := p." << field_method_prefix << field_method_suffix - << "(ctx, oprot); err != nil { return err }" << endl; + << "(ctx, oprot); err != nil { return err }" << '\n'; } indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; // Write the struct map - out << indent() << "if err := oprot.WriteFieldStop(ctx); err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"write field stop error: \", err) }" << endl; - out << indent() << "if err := oprot.WriteStructEnd(ctx); err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"write struct stop error: \", err) }" << endl; - out << indent() << "return nil" << endl; + out << indent() << "if err := oprot.WriteFieldStop(ctx); err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"write field stop error: \", err) }" << '\n'; + out << indent() << "if err := oprot.WriteStructEnd(ctx); err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"write struct stop error: \", err) }" << '\n'; + out << indent() << "return nil" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { string field_method_prefix("writeField"); @@ -1738,35 +1738,35 @@ void t_go_generator::generate_go_struct_writer(ostream& out, } out << indent() << "func (p *" << tstruct_name << ") " << field_method_prefix << field_method_suffix - << "(ctx context.Context, oprot thrift.TProtocol) (err error) {" << endl; + << "(ctx context.Context, oprot thrift.TProtocol) (err error) {" << '\n'; indent_up(); if (field_required == t_field::T_OPTIONAL) { - out << indent() << "if p.IsSet" << publicize(field_name) << "() {" << endl; + out << indent() << "if p.IsSet" << publicize(field_name) << "() {" << '\n'; indent_up(); } out << indent() << "if err := oprot.WriteFieldBegin(ctx, \"" << escape_field_name << "\", " - << type_to_enum((*f_iter)->get_type()) << ", " << field_id << "); err != nil {" << endl; + << type_to_enum((*f_iter)->get_type()) << ", " << field_id << "); err != nil {" << '\n'; out << indent() << " return thrift.PrependError(fmt.Sprintf(\"%T write field begin error " - << field_id << ":" << escape_field_name << ": \", p), err) }" << endl; + << field_id << ":" << escape_field_name << ": \", p), err) }" << '\n'; // Write field contents generate_serialize_field(out, *f_iter, "p."); // Write field closer - out << indent() << "if err := oprot.WriteFieldEnd(ctx); err != nil {" << endl; + out << indent() << "if err := oprot.WriteFieldEnd(ctx); err != nil {" << '\n'; out << indent() << " return thrift.PrependError(fmt.Sprintf(\"%T write field end error " - << field_id << ":" << escape_field_name << ": \", p), err) }" << endl; + << field_id << ":" << escape_field_name << ": \", p), err) }" << '\n'; if (field_required == t_field::T_OPTIONAL) { indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } indent_down(); - out << indent() << " return err" << endl; - out << indent() << "}" << endl << endl; + out << indent() << " return err" << '\n'; + out << indent() << "}" << '\n' << '\n'; } } @@ -1777,20 +1777,20 @@ void t_go_generator::generate_go_struct_equals(ostream& out, const vector& fields = tstruct->get_sorted_members(); vector::const_iterator f_iter; indent(out) << "func (p *" << tstruct_name << ") " << equals_method_name_ << "(other *" - << tstruct_name << ") bool {" << endl; + << tstruct_name << ") bool {" << '\n'; indent_up(); string field_name; string publicize_field_name; - out << indent() << "if p == other {" << endl; + out << indent() << "if p == other {" << '\n'; indent_up(); - out << indent() << "return true" << endl; + out << indent() << "return true" << '\n'; indent_down(); - out << indent() << "} else if p == nil || other == nil {" << endl; + out << indent() << "} else if p == nil || other == nil {" << '\n'; indent_up(); - out << indent() << "return false" << endl; + out << indent() << "return false" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { field_name = (*f_iter)->get_name(); @@ -1806,23 +1806,23 @@ void t_go_generator::generate_go_struct_equals(ostream& out, && (ttype->is_base_type() || ttype->is_enum() || ttype->is_container())) { string tgtv = "(*" + tgt + ")"; string srcv = "(*" + src + ")"; - out << indent() << "if " << tgt << " != " << src << " {" << endl; + out << indent() << "if " << tgt << " != " << src << " {" << '\n'; indent_up(); - out << indent() << "if " << tgt << " == nil || " << src << " == nil {" << endl; + out << indent() << "if " << tgt << " == nil || " << src << " == nil {" << '\n'; indent_up(); - out << indent() << "return false" << endl; + out << indent() << "return false" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; generate_go_equals(out, field_type, tgtv, srcv); indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } else { generate_go_equals(out, field_type, tgt, src); } } - out << indent() << "return true" << endl; + out << indent() << "return true" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } /** @@ -1842,7 +1842,7 @@ void t_go_generator::generate_service(t_service* tservice) { if(!skip_remote_) { generate_service_remote(tservice); } - f_types_ << endl; + f_types_ << '\n'; } /** @@ -1853,7 +1853,7 @@ void t_go_generator::generate_service(t_service* tservice) { void t_go_generator::generate_service_helpers(t_service* tservice) { vector functions = tservice->get_functions(); vector::iterator f_iter; - f_types_ << "// HELPER FUNCTIONS AND STRUCTURES" << endl << endl; + f_types_ << "// HELPER FUNCTIONS AND STRUCTURES" << '\n' << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { t_struct* ts = (*f_iter)->get_arglist(); @@ -1920,17 +1920,17 @@ void t_go_generator::generate_service_interface(t_service* tservice) { vector functions = tservice->get_functions(); if (!functions.empty()) { - f_types_ << endl; + f_types_ << '\n'; vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_go_docstring(f_types_, (*f_iter)); - f_types_ << indent() << function_signature_if(*f_iter, "", true) << endl; + f_types_ << indent() << function_signature_if(*f_iter, "", true) << '\n'; } } indent_down(); - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "}" << '\n' << '\n'; } /** @@ -1963,23 +1963,23 @@ void t_go_generator::generate_service_client(t_service* tservice) { extends_field = extends_client.substr(extends_client.find(".") + 1); generate_go_docstring(f_types_, tservice); - f_types_ << indent() << "type " << serviceName << "Client struct {" << endl; + f_types_ << indent() << "type " << serviceName << "Client struct {" << '\n'; indent_up(); if (!extends_client.empty()) { - f_types_ << indent() << "*" << extends_client << endl; + f_types_ << indent() << "*" << extends_client << '\n'; } else { - f_types_ << indent() << "c thrift.TClient" << endl; - f_types_ << indent() << "meta thrift.ResponseMeta" << endl; + f_types_ << indent() << "c thrift.TClient" << '\n'; + f_types_ << indent() << "meta thrift.ResponseMeta" << '\n'; } indent_down(); - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "}" << '\n' << '\n'; // Legacy constructor function f_types_ << indent() << "func New" << serviceName << "ClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *" << serviceName - << "Client {" << endl; + << "Client {" << '\n'; indent_up(); f_types_ << indent() << "return &" << serviceName << "Client"; @@ -1987,72 +1987,72 @@ void t_go_generator::generate_service_client(t_service* tservice) { f_types_ << "{" << extends_field << ": " << extends_client_new << "Factory(t, f)}"; } else { indent_up(); - f_types_ << "{" << endl; - f_types_ << indent() << "c: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t))," << endl; + f_types_ << "{" << '\n'; + f_types_ << indent() << "c: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t))," << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; } indent_down(); - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "}" << '\n' << '\n'; // Legacy constructor function with custom input & output protocols f_types_ << indent() << "func New" << serviceName << "ClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *" - << serviceName << "Client {" << endl; + << serviceName << "Client {" << '\n'; indent_up(); f_types_ << indent() << "return &" << serviceName << "Client"; if (!extends.empty()) { f_types_ << "{" << extends_field << ": " << extends_client_new << "Protocol(t, iprot, oprot)}" - << endl; + << '\n'; } else { indent_up(); - f_types_ << "{" << endl; - f_types_ << indent() << "c: thrift.NewTStandardClient(iprot, oprot)," << endl; + f_types_ << "{" << '\n'; + f_types_ << indent() << "c: thrift.NewTStandardClient(iprot, oprot)," << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; } indent_down(); - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "}" << '\n' << '\n'; // Constructor function f_types_ << indent() << "func New" << serviceName - << "Client(c thrift.TClient) *" << serviceName << "Client {" << endl; + << "Client(c thrift.TClient) *" << serviceName << "Client {" << '\n'; indent_up(); - f_types_ << indent() << "return &" << serviceName << "Client{" << endl; + f_types_ << indent() << "return &" << serviceName << "Client{" << '\n'; indent_up(); if (!extends.empty()) { - f_types_ << indent() << extends_field << ": " << extends_client_new << "(c)," << endl; + f_types_ << indent() << extends_field << ": " << extends_client_new << "(c)," << '\n'; } else { - f_types_ << indent() << "c: c," << endl; + f_types_ << indent() << "c: c," << '\n'; } indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "}" << '\n' << '\n'; if (extends.empty()) { - f_types_ << indent() << "func (p *" << serviceName << "Client) Client_() thrift.TClient {" << endl; + f_types_ << indent() << "func (p *" << serviceName << "Client) Client_() thrift.TClient {" << '\n'; indent_up(); - f_types_ << indent() << "return p.c" << endl; + f_types_ << indent() << "return p.c" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "}" << '\n' << '\n'; - f_types_ << indent() << "func (p *" << serviceName << "Client) LastResponseMeta_() thrift.ResponseMeta {" << endl; + f_types_ << indent() << "func (p *" << serviceName << "Client) LastResponseMeta_() thrift.ResponseMeta {" << '\n'; indent_up(); - f_types_ << indent() << "return p.meta" << endl; + f_types_ << indent() << "return p.meta" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "}" << '\n' << '\n'; - f_types_ << indent() << "func (p *" << serviceName << "Client) SetLastResponseMeta_(meta thrift.ResponseMeta) {" << endl; + f_types_ << indent() << "func (p *" << serviceName << "Client) SetLastResponseMeta_(meta thrift.ResponseMeta) {" << '\n'; indent_up(); - f_types_ << indent() << "p.meta = meta" << endl; + f_types_ << indent() << "p.meta = meta" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "}" << '\n' << '\n'; } // Generate client method implementations @@ -2067,59 +2067,59 @@ void t_go_generator::generate_service_client(t_service* tservice) { // Open function generate_go_docstring(f_types_, (*f_iter)); f_types_ << indent() << "func (p *" << serviceName << "Client) " - << function_signature_if(*f_iter, "", true) << " {" << endl; + << function_signature_if(*f_iter, "", true) << " {" << '\n'; indent_up(); std::string method = (*f_iter)->get_name(); std::string argsType = publicize(method + "_args", true); std::string argsName = tmp("_args"); - f_types_ << indent() << "var " << argsName << " " << argsType << endl; + f_types_ << indent() << "var " << argsName << " " << argsType << '\n'; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { f_types_ << indent() << argsName << "." << publicize((*fld_iter)->get_name()) - << " = " << variable_name_to_go_name((*fld_iter)->get_name()) << endl; + << " = " << variable_name_to_go_name((*fld_iter)->get_name()) << '\n'; } if (!(*f_iter)->is_oneway()) { std::string metaName = tmp("_meta"); std::string resultName = tmp("_result"); std::string resultType = publicize(method + "_result", true); - f_types_ << indent() << "var " << resultName << " " << resultType << endl; - f_types_ << indent() << "var " << metaName << " thrift.ResponseMeta" << endl; + f_types_ << indent() << "var " << resultName << " " << resultType << '\n'; + f_types_ << indent() << "var " << metaName << " thrift.ResponseMeta" << '\n'; f_types_ << indent() << metaName << ", _err = p.Client_().Call(ctx, \"" - << method << "\", &" << argsName << ", &" << resultName << ")" << endl; - f_types_ << indent() << "p.SetLastResponseMeta_(" << metaName << ")" << endl; - f_types_ << indent() << "if _err != nil {" << endl; + << method << "\", &" << argsName << ", &" << resultName << ")" << '\n'; + f_types_ << indent() << "p.SetLastResponseMeta_(" << metaName << ")" << '\n'; + f_types_ << indent() << "if _err != nil {" << '\n'; indent_up(); - f_types_ << indent() << "return" << endl; + f_types_ << indent() << "return" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; t_struct* xs = (*f_iter)->get_xceptions(); const std::vector& xceptions = xs->get_members(); vector::const_iterator x_iter; if (!xceptions.empty()) { - f_types_ << indent() << "switch {" << endl; + f_types_ << indent() << "switch {" << '\n'; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { const std::string pubname = publicize((*x_iter)->get_name()); const std::string field = resultName + "." + pubname; - f_types_ << indent() << "case " << field << "!= nil:" << endl; + f_types_ << indent() << "case " << field << "!= nil:" << '\n'; indent_up(); if (!(*f_iter)->get_returntype()->is_void()) { - f_types_ << indent() << "return _r, " << field << endl; + f_types_ << indent() << "return _r, " << field << '\n'; } else { - f_types_ << indent() << "return "<< field << endl; + f_types_ << indent() << "return "<< field << '\n'; } indent_down(); } - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "}" << '\n' << '\n'; } if ((*f_iter)->get_returntype()->is_struct()) { @@ -2130,37 +2130,37 @@ void t_go_generator::generate_service_client(t_service* tservice) { // struct in go. std::string retName = tmp("_ret"); f_types_ << indent() << "if " << retName << " := " << resultName - << ".GetSuccess(); " << retName << " != nil {" << endl; + << ".GetSuccess(); " << retName << " != nil {" << '\n'; indent_up(); - f_types_ << indent() << "return " << retName << ", nil" << endl; + f_types_ << indent() << "return " << retName << ", nil" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; f_types_ << indent() << "return nil, " << "thrift.NewTApplicationException(thrift.MISSING_RESULT, \"" - << method << " failed: unknown result\")" << endl; + << method << " failed: unknown result\")" << '\n'; } else if (!(*f_iter)->get_returntype()->is_void()) { - f_types_ << indent() << "return " << resultName << ".GetSuccess(), nil" << endl; + f_types_ << indent() << "return " << resultName << ".GetSuccess(), nil" << '\n'; } else { - f_types_ << indent() << "return nil" << endl; + f_types_ << indent() << "return nil" << '\n'; } } else { // Since we don't have response meta for oneway calls, overwrite it with // an empty one to avoid users getting the meta from last call and // mistaken it as from the oneway call. - f_types_ << indent() << "p.SetLastResponseMeta_(thrift.ResponseMeta{})" << endl; + f_types_ << indent() << "p.SetLastResponseMeta_(thrift.ResponseMeta{})" << '\n'; // TODO: would be nice to not to duplicate the call generation f_types_ << indent() << "if _, err := p.Client_().Call(ctx, \"" - << method << "\", &" << argsName << ", nil); err != nil {" << endl; + << method << "\", &" << argsName << ", nil); err != nil {" << '\n'; indent_up(); - f_types_ << indent() << "return err" << endl; + f_types_ << indent() << "return err" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; - f_types_ << indent() << "return nil" << endl; + f_types_ << indent() << "}" << '\n'; + f_types_ << indent() << "return nil" << '\n'; } indent_down(); - f_types_ << "}" << endl << endl; + f_types_ << "}" << '\n' << '\n'; } } @@ -2223,21 +2223,21 @@ void t_go_generator::generate_service_remote(t_service* tservice) { system_packages.push_back("thrift \"" + gen_thrift_import_ + "\""); f_remote << go_autogen_comment(); - f_remote << indent() << "package main" << endl << endl; - f_remote << indent() << "import (" << endl; + f_remote << indent() << "package main" << '\n' << '\n'; + f_remote << indent() << "import (" << '\n'; f_remote << render_system_packages(system_packages); f_remote << indent() << render_included_programs(unused_protection); f_remote << render_program_import(program_, unused_protection); - f_remote << indent() << ")" << endl; - f_remote << indent() << endl; + f_remote << indent() << ")" << '\n'; + f_remote << indent() << '\n'; f_remote << indent() << unused_protection; // filled in render_included_programs() - f_remote << indent() << endl; - f_remote << indent() << "func Usage() {" << endl; + f_remote << indent() << '\n'; + f_remote << indent() << "func Usage() {" << '\n'; f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Usage of \", os.Args[0], \" " "[-h host:port] [-u url] [-f[ramed]] function [arg1 [arg2...]]:\")" - << endl; - f_remote << indent() << " flag.PrintDefaults()" << endl; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"\\nFunctions:\")" << endl; + << '\n'; + f_remote << indent() << " flag.PrintDefaults()" << '\n'; + f_remote << indent() << " fmt.Fprintln(os.Stderr, \"\\nFunctions:\")" << '\n'; string package_name_aliased = package_identifiers_[get_real_go_module(program_)]; @@ -2259,143 +2259,143 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << args[i]->get_type()->get_name() << " " << args[i]->get_name(); } - f_remote << ")\")" << endl; + f_remote << ")\")" << '\n'; } - f_remote << indent() << " fmt.Fprintln(os.Stderr)" << endl; - f_remote << indent() << " os.Exit(0)" << endl; - f_remote << indent() << "}" << endl; - f_remote << indent() << endl; - - f_remote << indent() << "type httpHeaders map[string]string" << endl; - f_remote << indent() << endl; - f_remote << indent() << "func (h httpHeaders) String() string {" << endl; - f_remote << indent() << " var m map[string]string = h" << endl; - f_remote << indent() << " return fmt.Sprintf(\"%s\", m)" << endl; - f_remote << indent() << "}" << endl; - f_remote << indent() << endl; - f_remote << indent() << "func (h httpHeaders) Set(value string) error {" << endl; - f_remote << indent() << " parts := strings.Split(value, \": \")" << endl; - f_remote << indent() << " if len(parts) != 2 {" << endl; - f_remote << indent() << " return fmt.Errorf(\"header should be of format 'Key: Value'\")" << endl; - f_remote << indent() << " }" << endl; - f_remote << indent() << " h[parts[0]] = parts[1]" << endl; - f_remote << indent() << " return nil" << endl; - f_remote << indent() << "}" << endl; - f_remote << indent() << endl; - - f_remote << indent() << "func main() {" << endl; + f_remote << indent() << " fmt.Fprintln(os.Stderr)" << '\n'; + f_remote << indent() << " os.Exit(0)" << '\n'; + f_remote << indent() << "}" << '\n'; + f_remote << indent() << '\n'; + + f_remote << indent() << "type httpHeaders map[string]string" << '\n'; + f_remote << indent() << '\n'; + f_remote << indent() << "func (h httpHeaders) String() string {" << '\n'; + f_remote << indent() << " var m map[string]string = h" << '\n'; + f_remote << indent() << " return fmt.Sprintf(\"%s\", m)" << '\n'; + f_remote << indent() << "}" << '\n'; + f_remote << indent() << '\n'; + f_remote << indent() << "func (h httpHeaders) Set(value string) error {" << '\n'; + f_remote << indent() << " parts := strings.Split(value, \": \")" << '\n'; + f_remote << indent() << " if len(parts) != 2 {" << '\n'; + f_remote << indent() << " return fmt.Errorf(\"header should be of format 'Key: Value'\")" << '\n'; + f_remote << indent() << " }" << '\n'; + f_remote << indent() << " h[parts[0]] = parts[1]" << '\n'; + f_remote << indent() << " return nil" << '\n'; + f_remote << indent() << "}" << '\n'; + f_remote << indent() << '\n'; + + f_remote << indent() << "func main() {" << '\n'; indent_up(); - f_remote << indent() << "flag.Usage = Usage" << endl; - f_remote << indent() << "var host string" << endl; - f_remote << indent() << "var port int" << endl; - f_remote << indent() << "var protocol string" << endl; - f_remote << indent() << "var urlString string" << endl; - f_remote << indent() << "var framed bool" << endl; - f_remote << indent() << "var useHttp bool" << endl; - f_remote << indent() << "headers := make(httpHeaders)" << endl; - f_remote << indent() << "var parsedUrl *url.URL" << endl; - f_remote << indent() << "var trans thrift.TTransport" << endl; - f_remote << indent() << "_ = strconv.Atoi" << endl; - f_remote << indent() << "_ = math.Abs" << endl; - f_remote << indent() << "flag.Usage = Usage" << endl; + f_remote << indent() << "flag.Usage = Usage" << '\n'; + f_remote << indent() << "var host string" << '\n'; + f_remote << indent() << "var port int" << '\n'; + f_remote << indent() << "var protocol string" << '\n'; + f_remote << indent() << "var urlString string" << '\n'; + f_remote << indent() << "var framed bool" << '\n'; + f_remote << indent() << "var useHttp bool" << '\n'; + f_remote << indent() << "headers := make(httpHeaders)" << '\n'; + f_remote << indent() << "var parsedUrl *url.URL" << '\n'; + f_remote << indent() << "var trans thrift.TTransport" << '\n'; + f_remote << indent() << "_ = strconv.Atoi" << '\n'; + f_remote << indent() << "_ = math.Abs" << '\n'; + f_remote << indent() << "flag.Usage = Usage" << '\n'; f_remote << indent() << "flag.StringVar(&host, \"h\", \"localhost\", \"Specify host and port\")" - << endl; - f_remote << indent() << "flag.IntVar(&port, \"p\", 9090, \"Specify port\")" << endl; + << '\n'; + f_remote << indent() << "flag.IntVar(&port, \"p\", 9090, \"Specify port\")" << '\n'; f_remote << indent() << "flag.StringVar(&protocol, \"P\", \"binary\", \"" - "Specify the protocol (binary, compact, simplejson, json)\")" << endl; - f_remote << indent() << "flag.StringVar(&urlString, \"u\", \"\", \"Specify the url\")" << endl; + "Specify the protocol (binary, compact, simplejson, json)\")" << '\n'; + f_remote << indent() << "flag.StringVar(&urlString, \"u\", \"\", \"Specify the url\")" << '\n'; f_remote << indent() << "flag.BoolVar(&framed, \"framed\", false, \"Use framed transport\")" - << endl; - f_remote << indent() << "flag.BoolVar(&useHttp, \"http\", false, \"Use http\")" << endl; - f_remote << indent() << "flag.Var(headers, \"H\", \"Headers to set on the http(s) request (e.g. -H \\\"Key: Value\\\")\")" << endl; - f_remote << indent() << "flag.Parse()" << endl; - f_remote << indent() << endl; - f_remote << indent() << "if len(urlString) > 0 {" << endl; - f_remote << indent() << " var err error" << endl; - f_remote << indent() << " parsedUrl, err = url.Parse(urlString)" << endl; - f_remote << indent() << " if err != nil {" << endl; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << endl; - f_remote << indent() << " flag.Usage()" << endl; - f_remote << indent() << " }" << endl; - f_remote << indent() << " host = parsedUrl.Host" << endl; + << '\n'; + f_remote << indent() << "flag.BoolVar(&useHttp, \"http\", false, \"Use http\")" << '\n'; + f_remote << indent() << "flag.Var(headers, \"H\", \"Headers to set on the http(s) request (e.g. -H \\\"Key: Value\\\")\")" << '\n'; + f_remote << indent() << "flag.Parse()" << '\n'; + f_remote << indent() << '\n'; + f_remote << indent() << "if len(urlString) > 0 {" << '\n'; + f_remote << indent() << " var err error" << '\n'; + f_remote << indent() << " parsedUrl, err = url.Parse(urlString)" << '\n'; + f_remote << indent() << " if err != nil {" << '\n'; + f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << '\n'; + f_remote << indent() << " flag.Usage()" << '\n'; + f_remote << indent() << " }" << '\n'; + f_remote << indent() << " host = parsedUrl.Host" << '\n'; f_remote << indent() << " useHttp = len(parsedUrl.Scheme) <= 0 || parsedUrl.Scheme == \"http\" || parsedUrl.Scheme == \"https\"" - << endl; - f_remote << indent() << "} else if useHttp {" << endl; + << '\n'; + f_remote << indent() << "} else if useHttp {" << '\n'; f_remote << indent() << " _, err := url.Parse(fmt.Sprint(\"http://\", host, \":\", port))" - << endl; - f_remote << indent() << " if err != nil {" << endl; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << endl; - f_remote << indent() << " flag.Usage()" << endl; - f_remote << indent() << " }" << endl; - f_remote << indent() << "}" << endl; - f_remote << indent() << endl; - f_remote << indent() << "cmd := flag.Arg(0)" << endl; - f_remote << indent() << "var err error" << endl; - f_remote << indent() << "var cfg *thrift.TConfiguration = nil" << endl; - f_remote << indent() << "if useHttp {" << endl; - f_remote << indent() << " trans, err = thrift.NewTHttpClient(parsedUrl.String())" << endl; - f_remote << indent() << " if len(headers) > 0 {" << endl; - f_remote << indent() << " httptrans := trans.(*thrift.THttpClient)" << endl; - f_remote << indent() << " for key, value := range headers {" << endl; - f_remote << indent() << " httptrans.SetHeader(key, value)" << endl; - f_remote << indent() << " }" << endl; - f_remote << indent() << " }" << endl; - f_remote << indent() << "} else {" << endl; - f_remote << indent() << " portStr := fmt.Sprint(port)" << endl; - f_remote << indent() << " if strings.Contains(host, \":\") {" << endl; - f_remote << indent() << " host, portStr, err = net.SplitHostPort(host)" << endl; - f_remote << indent() << " if err != nil {" << endl; + << '\n'; + f_remote << indent() << " if err != nil {" << '\n'; + f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << '\n'; + f_remote << indent() << " flag.Usage()" << '\n'; + f_remote << indent() << " }" << '\n'; + f_remote << indent() << "}" << '\n'; + f_remote << indent() << '\n'; + f_remote << indent() << "cmd := flag.Arg(0)" << '\n'; + f_remote << indent() << "var err error" << '\n'; + f_remote << indent() << "var cfg *thrift.TConfiguration = nil" << '\n'; + f_remote << indent() << "if useHttp {" << '\n'; + f_remote << indent() << " trans, err = thrift.NewTHttpClient(parsedUrl.String())" << '\n'; + f_remote << indent() << " if len(headers) > 0 {" << '\n'; + f_remote << indent() << " httptrans := trans.(*thrift.THttpClient)" << '\n'; + f_remote << indent() << " for key, value := range headers {" << '\n'; + f_remote << indent() << " httptrans.SetHeader(key, value)" << '\n'; + f_remote << indent() << " }" << '\n'; + f_remote << indent() << " }" << '\n'; + f_remote << indent() << "} else {" << '\n'; + f_remote << indent() << " portStr := fmt.Sprint(port)" << '\n'; + f_remote << indent() << " if strings.Contains(host, \":\") {" << '\n'; + f_remote << indent() << " host, portStr, err = net.SplitHostPort(host)" << '\n'; + f_remote << indent() << " if err != nil {" << '\n'; f_remote << indent() << " fmt.Fprintln(os.Stderr, \"error with host:\", err)" - << endl; - f_remote << indent() << " os.Exit(1)" << endl; - f_remote << indent() << " }" << endl; - f_remote << indent() << " }" << endl; - f_remote << indent() << " trans = thrift.NewTSocketConf(net.JoinHostPort(host, portStr), cfg)" << endl; - f_remote << indent() << " if err != nil {" << endl; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"error resolving address:\", err)" << endl; - f_remote << indent() << " os.Exit(1)" << endl; - f_remote << indent() << " }" << endl; - f_remote << indent() << " if framed {" << endl; - f_remote << indent() << " trans = thrift.NewTFramedTransportConf(trans, cfg)" << endl; - f_remote << indent() << " }" << endl; - f_remote << indent() << "}" << endl; - f_remote << indent() << "if err != nil {" << endl; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Error creating transport\", err)" << endl; - f_remote << indent() << " os.Exit(1)" << endl; - f_remote << indent() << "}" << endl; - f_remote << indent() << "defer trans.Close()" << endl; - f_remote << indent() << "var protocolFactory thrift.TProtocolFactory" << endl; - f_remote << indent() << "switch protocol {" << endl; - f_remote << indent() << "case \"compact\":" << endl; - f_remote << indent() << " protocolFactory = thrift.NewTCompactProtocolFactoryConf(cfg)" << endl; - f_remote << indent() << " break" << endl; - f_remote << indent() << "case \"simplejson\":" << endl; - f_remote << indent() << " protocolFactory = thrift.NewTSimpleJSONProtocolFactoryConf(cfg)" << endl; - f_remote << indent() << " break" << endl; - f_remote << indent() << "case \"json\":" << endl; - f_remote << indent() << " protocolFactory = thrift.NewTJSONProtocolFactory()" << endl; - f_remote << indent() << " break" << endl; - f_remote << indent() << "case \"binary\", \"\":" << endl; - f_remote << indent() << " protocolFactory = thrift.NewTBinaryProtocolFactoryConf(cfg)" << endl; - f_remote << indent() << " break" << endl; - f_remote << indent() << "default:" << endl; + << '\n'; + f_remote << indent() << " os.Exit(1)" << '\n'; + f_remote << indent() << " }" << '\n'; + f_remote << indent() << " }" << '\n'; + f_remote << indent() << " trans = thrift.NewTSocketConf(net.JoinHostPort(host, portStr), cfg)" << '\n'; + f_remote << indent() << " if err != nil {" << '\n'; + f_remote << indent() << " fmt.Fprintln(os.Stderr, \"error resolving address:\", err)" << '\n'; + f_remote << indent() << " os.Exit(1)" << '\n'; + f_remote << indent() << " }" << '\n'; + f_remote << indent() << " if framed {" << '\n'; + f_remote << indent() << " trans = thrift.NewTFramedTransportConf(trans, cfg)" << '\n'; + f_remote << indent() << " }" << '\n'; + f_remote << indent() << "}" << '\n'; + f_remote << indent() << "if err != nil {" << '\n'; + f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Error creating transport\", err)" << '\n'; + f_remote << indent() << " os.Exit(1)" << '\n'; + f_remote << indent() << "}" << '\n'; + f_remote << indent() << "defer trans.Close()" << '\n'; + f_remote << indent() << "var protocolFactory thrift.TProtocolFactory" << '\n'; + f_remote << indent() << "switch protocol {" << '\n'; + f_remote << indent() << "case \"compact\":" << '\n'; + f_remote << indent() << " protocolFactory = thrift.NewTCompactProtocolFactoryConf(cfg)" << '\n'; + f_remote << indent() << " break" << '\n'; + f_remote << indent() << "case \"simplejson\":" << '\n'; + f_remote << indent() << " protocolFactory = thrift.NewTSimpleJSONProtocolFactoryConf(cfg)" << '\n'; + f_remote << indent() << " break" << '\n'; + f_remote << indent() << "case \"json\":" << '\n'; + f_remote << indent() << " protocolFactory = thrift.NewTJSONProtocolFactory()" << '\n'; + f_remote << indent() << " break" << '\n'; + f_remote << indent() << "case \"binary\", \"\":" << '\n'; + f_remote << indent() << " protocolFactory = thrift.NewTBinaryProtocolFactoryConf(cfg)" << '\n'; + f_remote << indent() << " break" << '\n'; + f_remote << indent() << "default:" << '\n'; f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Invalid protocol specified: \", protocol)" - << endl; - f_remote << indent() << " Usage()" << endl; - f_remote << indent() << " os.Exit(1)" << endl; - f_remote << indent() << "}" << endl; - f_remote << indent() << "iprot := protocolFactory.GetProtocol(trans)" << endl; - f_remote << indent() << "oprot := protocolFactory.GetProtocol(trans)" << endl; + << '\n'; + f_remote << indent() << " Usage()" << '\n'; + f_remote << indent() << " os.Exit(1)" << '\n'; + f_remote << indent() << "}" << '\n'; + f_remote << indent() << "iprot := protocolFactory.GetProtocol(trans)" << '\n'; + f_remote << indent() << "oprot := protocolFactory.GetProtocol(trans)" << '\n'; f_remote << indent() << "client := " << package_name_aliased << ".New" << publicize(service_name_) - << "Client(thrift.NewTStandardClient(iprot, oprot))" << endl; - f_remote << indent() << "if err := trans.Open(); err != nil {" << endl; + << "Client(thrift.NewTStandardClient(iprot, oprot))" << '\n'; + f_remote << indent() << "if err := trans.Open(); err != nil {" << '\n'; f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Error opening socket to \", " - "host, \":\", port, \" \", err)" << endl; - f_remote << indent() << " os.Exit(1)" << endl; - f_remote << indent() << "}" << endl; - f_remote << indent() << endl; - f_remote << indent() << "switch cmd {" << endl; + "host, \":\", port, \" \", err)" << '\n'; + f_remote << indent() << " os.Exit(1)" << '\n'; + f_remote << indent() << "}" << '\n'; + f_remote << indent() << '\n'; + f_remote << indent() << "switch cmd {" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { t_struct* arg_struct = (*f_iter)->get_arglist(); @@ -2404,13 +2404,13 @@ void t_go_generator::generate_service_remote(t_service* tservice) { string funcName((*f_iter)->get_name()); string pubName(publicize(funcName)); string argumentsName(publicize(funcName + "_args", true, func_to_service[funcName])); - f_remote << indent() << "case \"" << escape_string(funcName) << "\":" << endl; + f_remote << indent() << "case \"" << escape_string(funcName) << "\":" << '\n'; indent_up(); - f_remote << indent() << "if flag.NArg() - 1 != " << num_args << " {" << endl; + f_remote << indent() << "if flag.NArg() - 1 != " << num_args << " {" << '\n'; f_remote << indent() << " fmt.Fprintln(os.Stderr, \"" << escape_string(pubName) << " requires " - << num_args << " args\")" << endl; - f_remote << indent() << " flag.Usage()" << endl; - f_remote << indent() << "}" << endl; + << num_args << " args\")" << '\n'; + f_remote << indent() << " flag.Usage()" << '\n'; + f_remote << indent() << "}" << '\n'; for (std::vector::size_type i = 0; i < num_args; ++i) { std::vector::size_type flagArg = i + 1; @@ -2419,13 +2419,13 @@ void t_go_generator::generate_service_remote(t_service* tservice) { if (the_type2->is_enum()) { f_remote << indent() << "tmp" << i << ", err := (strconv.Atoi(flag.Arg(" << flagArg << ")))" - << endl; - f_remote << indent() << "if err != nil {" << endl; - f_remote << indent() << " Usage()" << endl; - f_remote << indent() << " return" << endl; - f_remote << indent() << "}" << endl; + << '\n'; + f_remote << indent() << "if err != nil {" << '\n'; + f_remote << indent() << " Usage()" << '\n'; + f_remote << indent() << " return" << '\n'; + f_remote << indent() << "}" << '\n'; f_remote << indent() << "argvalue" << i << " := " << package_name_aliased << "." - << publicize(the_type->get_name()) << "(tmp" << i << ")" << endl; + << publicize(the_type->get_name()) << "(tmp" << i << ")" << '\n'; } else if (the_type2->is_base_type()) { t_base_type::t_base e = ((t_base_type*)the_type2)->get_base(); string err(tmp("err")); @@ -2437,72 +2437,72 @@ void t_go_generator::generate_service_remote(t_service* tservice) { case t_base_type::TYPE_STRING: if (the_type2->is_binary()) { f_remote << indent() << "argvalue" << i << " := []byte(flag.Arg(" << flagArg << "))" - << endl; + << '\n'; } else { - f_remote << indent() << "argvalue" << i << " := flag.Arg(" << flagArg << ")" << endl; + f_remote << indent() << "argvalue" << i << " := flag.Arg(" << flagArg << ")" << '\n'; } break; case t_base_type::TYPE_BOOL: f_remote << indent() << "argvalue" << i << " := flag.Arg(" << flagArg << ") == \"true\"" - << endl; + << '\n'; break; case t_base_type::TYPE_I8: f_remote << indent() << "tmp" << i << ", " << err << " := (strconv.Atoi(flag.Arg(" - << flagArg << ")))" << endl; - f_remote << indent() << "if " << err << " != nil {" << endl; - f_remote << indent() << " Usage()" << endl; - f_remote << indent() << " return" << endl; - f_remote << indent() << "}" << endl; - f_remote << indent() << "argvalue" << i << " := int8(tmp" << i << ")" << endl; + << flagArg << ")))" << '\n'; + f_remote << indent() << "if " << err << " != nil {" << '\n'; + f_remote << indent() << " Usage()" << '\n'; + f_remote << indent() << " return" << '\n'; + f_remote << indent() << "}" << '\n'; + f_remote << indent() << "argvalue" << i << " := int8(tmp" << i << ")" << '\n'; break; case t_base_type::TYPE_I16: f_remote << indent() << "tmp" << i << ", " << err << " := (strconv.Atoi(flag.Arg(" - << flagArg << ")))" << endl; - f_remote << indent() << "if " << err << " != nil {" << endl; - f_remote << indent() << " Usage()" << endl; - f_remote << indent() << " return" << endl; - f_remote << indent() << "}" << endl; - f_remote << indent() << "argvalue" << i << " := int16(tmp" << i << ")" << endl; + << flagArg << ")))" << '\n'; + f_remote << indent() << "if " << err << " != nil {" << '\n'; + f_remote << indent() << " Usage()" << '\n'; + f_remote << indent() << " return" << '\n'; + f_remote << indent() << "}" << '\n'; + f_remote << indent() << "argvalue" << i << " := int16(tmp" << i << ")" << '\n'; break; case t_base_type::TYPE_I32: f_remote << indent() << "tmp" << i << ", " << err << " := (strconv.Atoi(flag.Arg(" - << flagArg << ")))" << endl; - f_remote << indent() << "if " << err << " != nil {" << endl; - f_remote << indent() << " Usage()" << endl; - f_remote << indent() << " return" << endl; - f_remote << indent() << "}" << endl; - f_remote << indent() << "argvalue" << i << " := int32(tmp" << i << ")" << endl; + << flagArg << ")))" << '\n'; + f_remote << indent() << "if " << err << " != nil {" << '\n'; + f_remote << indent() << " Usage()" << '\n'; + f_remote << indent() << " return" << '\n'; + f_remote << indent() << "}" << '\n'; + f_remote << indent() << "argvalue" << i << " := int32(tmp" << i << ")" << '\n'; break; case t_base_type::TYPE_I64: f_remote << indent() << "argvalue" << i << ", " << err - << " := (strconv.ParseInt(flag.Arg(" << flagArg << "), 10, 64))" << endl; - f_remote << indent() << "if " << err << " != nil {" << endl; - f_remote << indent() << " Usage()" << endl; - f_remote << indent() << " return" << endl; - f_remote << indent() << "}" << endl; + << " := (strconv.ParseInt(flag.Arg(" << flagArg << "), 10, 64))" << '\n'; + f_remote << indent() << "if " << err << " != nil {" << '\n'; + f_remote << indent() << " Usage()" << '\n'; + f_remote << indent() << " return" << '\n'; + f_remote << indent() << "}" << '\n'; break; case t_base_type::TYPE_DOUBLE: f_remote << indent() << "argvalue" << i << ", " << err - << " := (strconv.ParseFloat(flag.Arg(" << flagArg << "), 64))" << endl; - f_remote << indent() << "if " << err << " != nil {" << endl; - f_remote << indent() << " Usage()" << endl; - f_remote << indent() << " return" << endl; - f_remote << indent() << "}" << endl; + << " := (strconv.ParseFloat(flag.Arg(" << flagArg << "), 64))" << '\n'; + f_remote << indent() << "if " << err << " != nil {" << '\n'; + f_remote << indent() << " Usage()" << '\n'; + f_remote << indent() << " return" << '\n'; + f_remote << indent() << "}" << '\n'; break; case t_base_type::TYPE_UUID: f_remote << indent() << "argvalue" << i << ", " << err - << " := (thrift.ParseTuuid(flag.Arg(" << flagArg << ")))" << endl; - f_remote << indent() << "if " << err << " != nil {" << endl; - f_remote << indent() << " Usage()" << endl; - f_remote << indent() << " return" << endl; - f_remote << indent() << "}" << endl; + << " := (thrift.ParseTuuid(flag.Arg(" << flagArg << ")))" << '\n'; + f_remote << indent() << "if " << err << " != nil {" << '\n'; + f_remote << indent() << " Usage()" << '\n'; + f_remote << indent() << " return" << '\n'; + f_remote << indent() << "}" << '\n'; break; default: @@ -2524,26 +2524,26 @@ void t_go_generator::generate_service_remote(t_service* tservice) { tstruct_module = package_name_aliased; } - f_remote << indent() << arg << " := flag.Arg(" << flagArg << ")" << endl; + f_remote << indent() << arg << " := flag.Arg(" << flagArg << ")" << '\n'; f_remote << indent() << mbTrans << " := thrift.NewTMemoryBufferLen(len(" << arg << "))" - << endl; - f_remote << indent() << "defer " << mbTrans << ".Close()" << endl; + << '\n'; + f_remote << indent() << "defer " << mbTrans << ".Close()" << '\n'; f_remote << indent() << "_, " << err1 << " := " << mbTrans << ".WriteString(" << arg << ")" - << endl; - f_remote << indent() << "if " << err1 << " != nil {" << endl; - f_remote << indent() << " Usage()" << endl; - f_remote << indent() << " return" << endl; - f_remote << indent() << "}" << endl; - f_remote << indent() << factory << " := thrift.NewTJSONProtocolFactory()" << endl; + << '\n'; + f_remote << indent() << "if " << err1 << " != nil {" << '\n'; + f_remote << indent() << " Usage()" << '\n'; + f_remote << indent() << " return" << '\n'; + f_remote << indent() << "}" << '\n'; + f_remote << indent() << factory << " := thrift.NewTJSONProtocolFactory()" << '\n'; f_remote << indent() << jsProt << " := " << factory << ".GetProtocol(" << mbTrans << ")" - << endl; + << '\n'; f_remote << indent() << "argvalue" << i << " := " << tstruct_module << ".New" << tstruct_name - << "()" << endl; - f_remote << indent() << err2 << " := argvalue" << i << "." << read_method_name_ << "(context.Background(), " << jsProt << ")" << endl; - f_remote << indent() << "if " << err2 << " != nil {" << endl; - f_remote << indent() << " Usage()" << endl; - f_remote << indent() << " return" << endl; - f_remote << indent() << "}" << endl; + << "()" << '\n'; + f_remote << indent() << err2 << " := argvalue" << i << "." << read_method_name_ << "(context.Background(), " << jsProt << ")" << '\n'; + f_remote << indent() << "if " << err2 << " != nil {" << '\n'; + f_remote << indent() << " Usage()" << '\n'; + f_remote << indent() << " return" << '\n'; + f_remote << indent() << "}" << '\n'; } else if (the_type2->is_container() || the_type2->is_xception()) { string arg(tmp("arg")); string mbTrans(tmp("mbTrans")); @@ -2552,29 +2552,29 @@ void t_go_generator::generate_service_remote(t_service* tservice) { string jsProt(tmp("jsProt")); string err2(tmp("err")); std::string argName(publicize(args[i]->get_name())); - f_remote << indent() << arg << " := flag.Arg(" << flagArg << ")" << endl; + f_remote << indent() << arg << " := flag.Arg(" << flagArg << ")" << '\n'; f_remote << indent() << mbTrans << " := thrift.NewTMemoryBufferLen(len(" << arg << "))" - << endl; - f_remote << indent() << "defer " << mbTrans << ".Close()" << endl; + << '\n'; + f_remote << indent() << "defer " << mbTrans << ".Close()" << '\n'; f_remote << indent() << "_, " << err1 << " := " << mbTrans << ".WriteString(" << arg << ")" - << endl; - f_remote << indent() << "if " << err1 << " != nil { " << endl; - f_remote << indent() << " Usage()" << endl; - f_remote << indent() << " return" << endl; - f_remote << indent() << "}" << endl; - f_remote << indent() << factory << " := thrift.NewTJSONProtocolFactory()" << endl; + << '\n'; + f_remote << indent() << "if " << err1 << " != nil { " << '\n'; + f_remote << indent() << " Usage()" << '\n'; + f_remote << indent() << " return" << '\n'; + f_remote << indent() << "}" << '\n'; + f_remote << indent() << factory << " := thrift.NewTJSONProtocolFactory()" << '\n'; f_remote << indent() << jsProt << " := " << factory << ".GetProtocol(" << mbTrans << ")" - << endl; + << '\n'; f_remote << indent() << "containerStruct" << i << " := " << package_name_aliased << ".New" - << argumentsName << "()" << endl; + << argumentsName << "()" << '\n'; f_remote << indent() << err2 << " := containerStruct" << i << ".ReadField" << (i + 1) << "(context.Background(), " - << jsProt << ")" << endl; - f_remote << indent() << "if " << err2 << " != nil {" << endl; - f_remote << indent() << " Usage()" << endl; - f_remote << indent() << " return" << endl; - f_remote << indent() << "}" << endl; + << jsProt << ")" << '\n'; + f_remote << indent() << "if " << err2 << " != nil {" << '\n'; + f_remote << indent() << " Usage()" << '\n'; + f_remote << indent() << " return" << '\n'; + f_remote << indent() << "}" << '\n'; f_remote << indent() << "argvalue" << i << " := containerStruct" << i << "." << argName - << endl; + << '\n'; } else { throw("Invalid argument type in generate_service_remote"); } @@ -2585,9 +2585,9 @@ void t_go_generator::generate_service_remote(t_service* tservice) { typedef_module = package_name_aliased; } f_remote << indent() << "value" << i << " := " << typedef_module << "." - << publicize(the_type->get_name()) << "(argvalue" << i << ")" << endl; + << publicize(the_type->get_name()) << "(argvalue" << i << ")" << '\n'; } else { - f_remote << indent() << "value" << i << " := argvalue" << i << endl; + f_remote << indent() << "value" << i << " := argvalue" << i << '\n'; } } @@ -2634,20 +2634,20 @@ void t_go_generator::generate_service_remote(t_service* tservice) { } } - f_remote << "))" << endl; - f_remote << indent() << "fmt.Print(\"\\n\")" << endl; - f_remote << indent() << "break" << endl; + f_remote << "))" << '\n'; + f_remote << indent() << "fmt.Print(\"\\n\")" << '\n'; + f_remote << indent() << "break" << '\n'; indent_down(); } - f_remote << indent() << "case \"\":" << endl; - f_remote << indent() << " Usage()" << endl; - f_remote << indent() << " break" << endl; - f_remote << indent() << "default:" << endl; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Invalid function \", cmd)" << endl; - f_remote << indent() << "}" << endl; + f_remote << indent() << "case \"\":" << '\n'; + f_remote << indent() << " Usage()" << '\n'; + f_remote << indent() << " break" << '\n'; + f_remote << indent() << "default:" << '\n'; + f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Invalid function \", cmd)" << '\n'; + f_remote << indent() << "}" << '\n'; indent_down(); - f_remote << indent() << "}" << endl; + f_remote << indent() << "}" << '\n'; // Close service file f_remote.close(); format_go_output(f_remote_name); @@ -2696,80 +2696,80 @@ void t_go_generator::generate_service_server(t_service* tservice) { string self(tmp("self")); if (extends_processor.empty()) { - f_types_ << indent() << "type " << serviceName << "Processor struct {" << endl; - f_types_ << indent() << " processorMap map[string]thrift.TProcessorFunction" << endl; - f_types_ << indent() << " handler " << serviceName << endl; - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "type " << serviceName << "Processor struct {" << '\n'; + f_types_ << indent() << " processorMap map[string]thrift.TProcessorFunction" << '\n'; + f_types_ << indent() << " handler " << serviceName << '\n'; + f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func (p *" << serviceName << "Processor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {" - << endl; - f_types_ << indent() << " p.processorMap[key] = processor" << endl; - f_types_ << indent() << "}" << endl << endl; + << '\n'; + f_types_ << indent() << " p.processorMap[key] = processor" << '\n'; + f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func (p *" << serviceName << "Processor) GetProcessorFunction(key string) " - "(processor thrift.TProcessorFunction, ok bool) {" << endl; - f_types_ << indent() << " processor, ok = p.processorMap[key]" << endl; - f_types_ << indent() << " return processor, ok" << endl; - f_types_ << indent() << "}" << endl << endl; + "(processor thrift.TProcessorFunction, ok bool) {" << '\n'; + f_types_ << indent() << " processor, ok = p.processorMap[key]" << '\n'; + f_types_ << indent() << " return processor, ok" << '\n'; + f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func (p *" << serviceName - << "Processor) ProcessorMap() map[string]thrift.TProcessorFunction {" << endl; - f_types_ << indent() << " return p.processorMap" << endl; - f_types_ << indent() << "}" << endl << endl; + << "Processor) ProcessorMap() map[string]thrift.TProcessorFunction {" << '\n'; + f_types_ << indent() << " return p.processorMap" << '\n'; + f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func New" << serviceName << "Processor(handler " << serviceName - << ") *" << serviceName << "Processor {" << endl << endl; + << ") *" << serviceName << "Processor {" << '\n' << '\n'; f_types_ << indent() << " " << self << " := &" << serviceName << "Processor{handler:handler, processorMap:make(map[string]thrift.TProcessorFunction)}" - << endl; + << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { string escapedFuncName(escape_string((*f_iter)->get_name())); f_types_ << indent() << " " << self << ".processorMap[\"" << escapedFuncName << "\"] = &" << pServiceName << "Processor" << publicize((*f_iter)->get_name()) - << "{handler:handler}" << endl; + << "{handler:handler}" << '\n'; } string x(tmp("x")); - f_types_ << indent() << "return " << self << endl; - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "return " << self << '\n'; + f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func (p *" << serviceName << "Processor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err " - "thrift.TException) {" << endl; - f_types_ << indent() << " name, _, seqId, err2 := iprot.ReadMessageBegin(ctx)" << endl; - f_types_ << indent() << " if err2 != nil { return false, thrift.WrapTException(err2) }" << endl; - f_types_ << indent() << " if processor, ok := p.GetProcessorFunction(name); ok {" << endl; - f_types_ << indent() << " return processor.Process(ctx, seqId, iprot, oprot)" << endl; - f_types_ << indent() << " }" << endl; - f_types_ << indent() << " iprot.Skip(ctx, thrift.STRUCT)" << endl; - f_types_ << indent() << " iprot.ReadMessageEnd(ctx)" << endl; + "thrift.TException) {" << '\n'; + f_types_ << indent() << " name, _, seqId, err2 := iprot.ReadMessageBegin(ctx)" << '\n'; + f_types_ << indent() << " if err2 != nil { return false, thrift.WrapTException(err2) }" << '\n'; + f_types_ << indent() << " if processor, ok := p.GetProcessorFunction(name); ok {" << '\n'; + f_types_ << indent() << " return processor.Process(ctx, seqId, iprot, oprot)" << '\n'; + f_types_ << indent() << " }" << '\n'; + f_types_ << indent() << " iprot.Skip(ctx, thrift.STRUCT)" << '\n'; + f_types_ << indent() << " iprot.ReadMessageEnd(ctx)" << '\n'; f_types_ << indent() << " " << x << " := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function " - "\" + name)" << endl; - f_types_ << indent() << " oprot.WriteMessageBegin(ctx, name, thrift.EXCEPTION, seqId)" << endl; - f_types_ << indent() << " " << x << ".Write(ctx, oprot)" << endl; - f_types_ << indent() << " oprot.WriteMessageEnd(ctx)" << endl; - f_types_ << indent() << " oprot.Flush(ctx)" << endl; - f_types_ << indent() << " return false, " << x << endl; - f_types_ << indent() << "" << endl; - f_types_ << indent() << "}" << endl << endl; + "\" + name)" << '\n'; + f_types_ << indent() << " oprot.WriteMessageBegin(ctx, name, thrift.EXCEPTION, seqId)" << '\n'; + f_types_ << indent() << " " << x << ".Write(ctx, oprot)" << '\n'; + f_types_ << indent() << " oprot.WriteMessageEnd(ctx)" << '\n'; + f_types_ << indent() << " oprot.Flush(ctx)" << '\n'; + f_types_ << indent() << " return false, " << x << '\n'; + f_types_ << indent() << "" << '\n'; + f_types_ << indent() << "}" << '\n' << '\n'; } else { - f_types_ << indent() << "type " << serviceName << "Processor struct {" << endl; - f_types_ << indent() << " *" << extends_processor << endl; - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "type " << serviceName << "Processor struct {" << '\n'; + f_types_ << indent() << " *" << extends_processor << '\n'; + f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func New" << serviceName << "Processor(handler " << serviceName - << ") *" << serviceName << "Processor {" << endl; + << ") *" << serviceName << "Processor {" << '\n'; f_types_ << indent() << " " << self << " := &" << serviceName << "Processor{" - << extends_processor_new << "(handler)}" << endl; + << extends_processor_new << "(handler)}" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { string escapedFuncName(escape_string((*f_iter)->get_name())); f_types_ << indent() << " " << self << ".AddToProcessorMap(\"" << escapedFuncName << "\", &" << pServiceName << "Processor" << publicize((*f_iter)->get_name()) - << "{handler:handler})" << endl; + << "{handler:handler})" << '\n'; } - f_types_ << indent() << " return " << self << endl; - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << " return " << self << '\n'; + f_types_ << indent() << "}" << '\n' << '\n'; } // Generate the process subfunctions @@ -2777,7 +2777,7 @@ void t_go_generator::generate_service_server(t_service* tservice) { generate_process_function(tservice, *f_iter); } - f_types_ << endl; + f_types_ << '\n'; } /** @@ -2794,90 +2794,90 @@ void t_go_generator::generate_process_function(t_service* tservice, t_function* // t_struct* xs = tfunction->get_xceptions(); // const std::vector& xceptions = xs->get_members(); - f_types_ << indent() << "type " << processorName << " struct {" << endl; - f_types_ << indent() << " handler " << publicize(tservice->get_name()) << endl; - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "type " << processorName << " struct {" << '\n'; + f_types_ << indent() << " handler " << publicize(tservice->get_name()) << '\n'; + f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func (p *" << processorName << ") Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err " - "thrift.TException) {" << endl; + "thrift.TException) {" << '\n'; indent_up(); string write_err; if (!tfunction->is_oneway()) { write_err = tmp("_write_err"); - f_types_ << indent() << "var " << write_err << " error" << endl; + f_types_ << indent() << "var " << write_err << " error" << '\n'; } - f_types_ << indent() << "args := " << argsname << "{}" << endl; - f_types_ << indent() << "if err2 := args." << read_method_name_ << "(ctx, iprot); err2 != nil {" << endl; + f_types_ << indent() << "args := " << argsname << "{}" << '\n'; + f_types_ << indent() << "if err2 := args." << read_method_name_ << "(ctx, iprot); err2 != nil {" << '\n'; indent_up(); - f_types_ << indent() << "iprot.ReadMessageEnd(ctx)" << endl; + f_types_ << indent() << "iprot.ReadMessageEnd(ctx)" << '\n'; if (!tfunction->is_oneway()) { f_types_ << indent() << "x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())" - << endl; + << '\n'; f_types_ << indent() << "oprot.WriteMessageBegin(ctx, \"" << escape_string(tfunction->get_name()) - << "\", thrift.EXCEPTION, seqId)" << endl; - f_types_ << indent() << "x.Write(ctx, oprot)" << endl; - f_types_ << indent() << "oprot.WriteMessageEnd(ctx)" << endl; - f_types_ << indent() << "oprot.Flush(ctx)" << endl; + << "\", thrift.EXCEPTION, seqId)" << '\n'; + f_types_ << indent() << "x.Write(ctx, oprot)" << '\n'; + f_types_ << indent() << "oprot.WriteMessageEnd(ctx)" << '\n'; + f_types_ << indent() << "oprot.Flush(ctx)" << '\n'; } - f_types_ << indent() << "return false, thrift.WrapTException(err2)" << endl; + f_types_ << indent() << "return false, thrift.WrapTException(err2)" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; - f_types_ << indent() << "iprot.ReadMessageEnd(ctx)" << endl << endl; + f_types_ << indent() << "}" << '\n'; + f_types_ << indent() << "iprot.ReadMessageEnd(ctx)" << '\n' << '\n'; // Even though we never create the goroutine in oneway handlers, // always have (nop) tickerCancel defined makes the writing part of code // generating easier and less error-prone. - f_types_ << indent() << "tickerCancel := func() {}" << endl; + f_types_ << indent() << "tickerCancel := func() {}" << '\n'; // Only create the goroutine for non-oneways. if (!tfunction->is_oneway()) { - f_types_ << indent() << "// Start a goroutine to do server side connectivity check." << endl; - f_types_ << indent() << "if thrift.ServerConnectivityCheckInterval > 0 {" << endl; + f_types_ << indent() << "// Start a goroutine to do server side connectivity check." << '\n'; + f_types_ << indent() << "if thrift.ServerConnectivityCheckInterval > 0 {" << '\n'; indent_up(); - f_types_ << indent() << "var cancel context.CancelCauseFunc" << endl; - f_types_ << indent() << "ctx, cancel = context.WithCancelCause(ctx)" << endl; - f_types_ << indent() << "defer cancel(nil)" << endl; - f_types_ << indent() << "var tickerCtx context.Context" << endl; - f_types_ << indent() << "tickerCtx, tickerCancel = context.WithCancel(context.Background())" << endl; - f_types_ << indent() << "defer tickerCancel()" << endl; - f_types_ << indent() << "go func(ctx context.Context, cancel context.CancelCauseFunc) {" << endl; + f_types_ << indent() << "var cancel context.CancelCauseFunc" << '\n'; + f_types_ << indent() << "ctx, cancel = context.WithCancelCause(ctx)" << '\n'; + f_types_ << indent() << "defer cancel(nil)" << '\n'; + f_types_ << indent() << "var tickerCtx context.Context" << '\n'; + f_types_ << indent() << "tickerCtx, tickerCancel = context.WithCancel(context.Background())" << '\n'; + f_types_ << indent() << "defer tickerCancel()" << '\n'; + f_types_ << indent() << "go func(ctx context.Context, cancel context.CancelCauseFunc) {" << '\n'; indent_up(); - f_types_ << indent() << "ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)" << endl; - f_types_ << indent() << "defer ticker.Stop()" << endl; - f_types_ << indent() << "for {" << endl; + f_types_ << indent() << "ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)" << '\n'; + f_types_ << indent() << "defer ticker.Stop()" << '\n'; + f_types_ << indent() << "for {" << '\n'; indent_up(); - f_types_ << indent() << "select {" << endl; - f_types_ << indent() << "case <-ctx.Done():" << endl; + f_types_ << indent() << "select {" << '\n'; + f_types_ << indent() << "case <-ctx.Done():" << '\n'; indent_up(); - f_types_ << indent() << "return" << endl; + f_types_ << indent() << "return" << '\n'; indent_down(); - f_types_ << indent() << "case <-ticker.C:" << endl; + f_types_ << indent() << "case <-ticker.C:" << '\n'; indent_up(); - f_types_ << indent() << "if !iprot.Transport().IsOpen() {" << endl; + f_types_ << indent() << "if !iprot.Transport().IsOpen() {" << '\n'; indent_up(); - f_types_ << indent() << "cancel(thrift.ErrAbandonRequest)" << endl; - f_types_ << indent() << "return" << endl; + f_types_ << indent() << "cancel(thrift.ErrAbandonRequest)" << '\n'; + f_types_ << indent() << "return" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; indent_down(); - f_types_ << indent() << "}(tickerCtx, cancel)" << endl; + f_types_ << indent() << "}(tickerCtx, cancel)" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "}" << '\n' << '\n'; } else { // Make sure we don't get the defined but unused compiling error. - f_types_ << indent() << "_ = tickerCancel" << endl << endl; + f_types_ << indent() << "_ = tickerCancel" << '\n' << '\n'; } if (!tfunction->is_oneway()) { - f_types_ << indent() << "result := " << resultname << "{}" << endl; + f_types_ << indent() << "result := " << resultname << "{}" << '\n'; } bool need_reference = type_need_reference(tfunction->get_returntype()); @@ -2908,93 +2908,93 @@ void t_go_generator::generate_process_function(t_service* tservice, t_function* f_types_ << "args." << publicize((*f_iter)->get_name()); } - f_types_ << "); err2 != nil {" << endl; + f_types_ << "); err2 != nil {" << '\n'; indent_up(); - f_types_ << indent() << "tickerCancel()" << endl; - f_types_ << indent() << "err = thrift.WrapTException(err2)" << endl; + f_types_ << indent() << "tickerCancel()" << '\n'; + f_types_ << indent() << "err = thrift.WrapTException(err2)" << '\n'; t_struct* exceptions = tfunction->get_xceptions(); const vector& x_fields = exceptions->get_members(); if (!x_fields.empty()) { - f_types_ << indent() << "switch v := err2.(type) {" << endl; + f_types_ << indent() << "switch v := err2.(type) {" << '\n'; vector::const_iterator xf_iter; for (xf_iter = x_fields.begin(); xf_iter != x_fields.end(); ++xf_iter) { f_types_ << indent() << "case " << type_to_go_type(((*xf_iter)->get_type())) << ":" - << endl; + << '\n'; indent_up(); - f_types_ << indent() << "result." << publicize((*xf_iter)->get_name()) << " = v" << endl; + f_types_ << indent() << "result." << publicize((*xf_iter)->get_name()) << " = v" << '\n'; indent_down(); } - f_types_ << indent() << "default:" << endl; + f_types_ << indent() << "default:" << '\n'; indent_up(); } if (!tfunction->is_oneway()) { // Avoid writing the error to the wire if it's ErrAbandonRequest - f_types_ << indent() << "if errors.Is(err2, thrift.ErrAbandonRequest) {" << endl; + f_types_ << indent() << "if errors.Is(err2, thrift.ErrAbandonRequest) {" << '\n'; indent_up(); - f_types_ << indent() << "return false, thrift.WrapTException(err2)" << endl; + f_types_ << indent() << "return false, thrift.WrapTException(err2)" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; - f_types_ << indent() << "if errors.Is(err2, context.Canceled) {" << endl; + f_types_ << indent() << "}" << '\n'; + f_types_ << indent() << "if errors.Is(err2, context.Canceled) {" << '\n'; indent_up(); - f_types_ << indent() << "if err := context.Cause(ctx); errors.Is(err, thrift.ErrAbandonRequest) {" << endl; + f_types_ << indent() << "if err := context.Cause(ctx); errors.Is(err, thrift.ErrAbandonRequest) {" << '\n'; indent_up(); - f_types_ << indent() << "return false, thrift.WrapTException(err)" << endl; + f_types_ << indent() << "return false, thrift.WrapTException(err)" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; string exc(tmp("_exc")); f_types_ << indent() << exc << " := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, " "\"Internal error processing " << escape_string(tfunction->get_name()) - << ": \" + err2.Error())" << endl; + << ": \" + err2.Error())" << '\n'; f_types_ << indent() << "if err2 := oprot.WriteMessageBegin(ctx, \"" << escape_string(tfunction->get_name()) - << "\", thrift.EXCEPTION, seqId); err2 != nil {" << endl; + << "\", thrift.EXCEPTION, seqId); err2 != nil {" << '\n'; indent_up(); - f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl; + f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; f_types_ << indent() << "if err2 := " << exc << ".Write(ctx, oprot); " - << write_err << " == nil && err2 != nil {" << endl; + << write_err << " == nil && err2 != nil {" << '\n'; indent_up(); - f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl; + f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; f_types_ << indent() << "if err2 := oprot.WriteMessageEnd(ctx); " - << write_err << " == nil && err2 != nil {" << endl; + << write_err << " == nil && err2 != nil {" << '\n'; indent_up(); - f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl; + f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; f_types_ << indent() << "if err2 := oprot.Flush(ctx); " - << write_err << " == nil && err2 != nil {" << endl; + << write_err << " == nil && err2 != nil {" << '\n'; indent_up(); - f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl; + f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; - f_types_ << indent() << "if " << write_err << " != nil {" << endl; + f_types_ << indent() << "if " << write_err << " != nil {" << '\n'; indent_up(); - f_types_ << indent() << "return false, thrift.WrapTException(" << write_err << ")" << endl; + f_types_ << indent() << "return false, thrift.WrapTException(" << write_err << ")" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; // return success=true as long as writing to the wire was successful. - f_types_ << indent() << "return true, err" << endl; + f_types_ << indent() << "return true, err" << '\n'; } if (!x_fields.empty()) { indent_down(); - f_types_ << indent() << "}" << endl; // closes switch + f_types_ << indent() << "}" << '\n'; // closes switch } indent_down(); @@ -3002,63 +3002,63 @@ void t_go_generator::generate_process_function(t_service* tservice, t_function* if (!tfunction->is_oneway()) { if (!tfunction->get_returntype()->is_void()) { - f_types_ << " else {" << endl; // make sure we set Success retval only on success + f_types_ << " else {" << '\n'; // make sure we set Success retval only on success indent_up(); f_types_ << indent() << "result.Success = "; if (need_reference) { f_types_ << "&"; } - f_types_ << "retval" << endl; + f_types_ << "retval" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; } else { - f_types_ << endl; + f_types_ << '\n'; } - f_types_ << indent() << "tickerCancel()" << endl; + f_types_ << indent() << "tickerCancel()" << '\n'; f_types_ << indent() << "if err2 := oprot.WriteMessageBegin(ctx, \"" << escape_string(tfunction->get_name()) << "\", thrift.REPLY, seqId); err2 != nil {" - << endl; + << '\n'; indent_up(); - f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl; + f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; f_types_ << indent() << "if err2 := result." << write_method_name_ << "(ctx, oprot); " - << write_err << " == nil && err2 != nil {" << endl; + << write_err << " == nil && err2 != nil {" << '\n'; indent_up(); - f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl; + f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; f_types_ << indent() << "if err2 := oprot.WriteMessageEnd(ctx); " - << write_err << " == nil && err2 != nil {" << endl; + << write_err << " == nil && err2 != nil {" << '\n'; indent_up(); - f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl; + f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; - f_types_ << indent() << "if err2 := oprot.Flush(ctx); " << write_err << " == nil && err2 != nil {" << endl; + f_types_ << indent() << "if err2 := oprot.Flush(ctx); " << write_err << " == nil && err2 != nil {" << '\n'; indent_up(); - f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl; + f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; - f_types_ << indent() << "if " << write_err << " != nil {" << endl; + f_types_ << indent() << "if " << write_err << " != nil {" << '\n'; indent_up(); - f_types_ << indent() << "return false, thrift.WrapTException(" << write_err << ")" << endl; + f_types_ << indent() << "return false, thrift.WrapTException(" << write_err << ")" << '\n'; indent_down(); - f_types_ << indent() << "}" << endl; + f_types_ << indent() << "}" << '\n'; // return success=true as long as writing to the wire was successful. - f_types_ << indent() << "return true, err" << endl; + f_types_ << indent() << "return true, err" << '\n'; } else { - f_types_ << endl; - f_types_ << indent() << "tickerCancel()" << endl; - f_types_ << indent() << "return true, err" << endl; + f_types_ << '\n'; + f_types_ << indent() << "tickerCancel()" << '\n'; + f_types_ << indent() << "return true, err" << '\n'; } indent_down(); - f_types_ << indent() << "}" << endl << endl; + f_types_ << indent() << "}" << '\n' << '\n'; } /** @@ -3096,7 +3096,7 @@ void t_go_generator::generate_deserialize_field(ostream& out, string type_name = inkey ? type_to_go_key_type(tfield->get_type()) : type_to_go_type(tfield->get_type()); - out << "var " << tfield->get_name() << " " << type_name << endl; + out << "var " << tfield->get_name() << " " << type_name << '\n'; } indent(out) << "if v, err := iprot."; @@ -3153,11 +3153,11 @@ void t_go_generator::generate_deserialize_field(ostream& out, out << "ReadI32(ctx)"; } - out << "; err != nil {" << endl; + out << "; err != nil {" << '\n'; out << indent() << "return thrift.PrependError(\"error reading field " << tfield->get_key() - << ": \", err)" << endl; + << ": \", err)" << '\n'; - out << "} else {" << endl; + out << "} else {" << '\n'; string wrap; if (type->is_enum() || orig_type->is_typedef()) { @@ -3168,13 +3168,13 @@ void t_go_generator::generate_deserialize_field(ostream& out, string maybe_address = (is_pointer_field(tfield) ? "&" : ""); if (wrap == "") { - indent(out) << name << " = " << maybe_address << "v" << endl; + indent(out) << name << " = " << maybe_address << "v" << '\n'; } else { - indent(out) << "temp := " << wrap << "(v)" << endl; - indent(out) << name << " = " << maybe_address << "temp" << endl; + indent(out) << "temp := " << wrap << "(v)" << '\n'; + indent(out) << name << " = " << maybe_address << "temp" << '\n'; } - out << "}" << endl; + out << "}" << '\n'; } else { throw "INVALID TYPE IN generate_deserialize_field '" + type->get_name() + "' for field '" + tfield->get_name() + "'"; @@ -3193,10 +3193,10 @@ void t_go_generator::generate_deserialize_struct(ostream& out, out << indent() << prefix << eq << (pointer_field ? "&" : ""); generate_go_struct_initializer(out, tstruct); - out << indent() << "if err := " << prefix << "." << read_method_name_ << "(ctx, iprot); err != nil {" << endl; + out << indent() << "if err := " << prefix << "." << read_method_name_ << "(ctx, iprot); err != nil {" << '\n'; out << indent() << " return thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", " - << prefix << "), err)" << endl; - out << indent() << "}" << endl; + << prefix << "), err)" << '\n'; + out << indent() << "}" << '\n'; } /** @@ -3217,33 +3217,33 @@ void t_go_generator::generate_deserialize_container(ostream& out, // Declare variables, read header if (ttype->is_map()) { - out << indent() << "_, _, size, err := iprot.ReadMapBegin(ctx)" << endl; - out << indent() << "if err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"error reading map begin: \", err)" << endl; - out << indent() << "}" << endl; - out << indent() << "tMap := make(" << type_to_go_type(orig_type) << ", size)" << endl; - out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tMap" << endl; + out << indent() << "_, _, size, err := iprot.ReadMapBegin(ctx)" << '\n'; + out << indent() << "if err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"error reading map begin: \", err)" << '\n'; + out << indent() << "}" << '\n'; + out << indent() << "tMap := make(" << type_to_go_type(orig_type) << ", size)" << '\n'; + out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tMap" << '\n'; } else if (ttype->is_set()) { - out << indent() << "_, size, err := iprot.ReadSetBegin(ctx)" << endl; - out << indent() << "if err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"error reading set begin: \", err)" << endl; - out << indent() << "}" << endl; - out << indent() << "tSet := make(" << type_to_go_type(orig_type) << ", 0, size)" << endl; - out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSet" << endl; + out << indent() << "_, size, err := iprot.ReadSetBegin(ctx)" << '\n'; + out << indent() << "if err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"error reading set begin: \", err)" << '\n'; + out << indent() << "}" << '\n'; + out << indent() << "tSet := make(" << type_to_go_type(orig_type) << ", 0, size)" << '\n'; + out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSet" << '\n'; } else if (ttype->is_list()) { - out << indent() << "_, size, err := iprot.ReadListBegin(ctx)" << endl; - out << indent() << "if err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"error reading list begin: \", err)" << endl; - out << indent() << "}" << endl; - out << indent() << "tSlice := make(" << type_to_go_type(orig_type) << ", 0, size)" << endl; - out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSlice" << endl; + out << indent() << "_, size, err := iprot.ReadListBegin(ctx)" << '\n'; + out << indent() << "if err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"error reading list begin: \", err)" << '\n'; + out << indent() << "}" << '\n'; + out << indent() << "tSlice := make(" << type_to_go_type(orig_type) << ", 0, size)" << '\n'; + out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSlice" << '\n'; } else { throw "INVALID TYPE IN generate_deserialize_container '" + ttype->get_name() + "' for prefix '" + prefix + "'"; } // For loop iterates over elements - out << indent() << "for i := 0; i < size; i ++ {" << endl; + out << indent() << "for i := 0; i < size; i ++ {" << '\n'; indent_up(); if (pointer_field) { @@ -3258,21 +3258,21 @@ void t_go_generator::generate_deserialize_container(ostream& out, } indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; // Read container end if (ttype->is_map()) { - out << indent() << "if err := iprot.ReadMapEnd(ctx); err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"error reading map end: \", err)" << endl; - out << indent() << "}" << endl; + out << indent() << "if err := iprot.ReadMapEnd(ctx); err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"error reading map end: \", err)" << '\n'; + out << indent() << "}" << '\n'; } else if (ttype->is_set()) { - out << indent() << "if err := iprot.ReadSetEnd(ctx); err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"error reading set end: \", err)" << endl; - out << indent() << "}" << endl; + out << indent() << "if err := iprot.ReadSetEnd(ctx); err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"error reading set end: \", err)" << '\n'; + out << indent() << "}" << '\n'; } else if (ttype->is_list()) { - out << indent() << "if err := iprot.ReadListEnd(ctx); err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"error reading list end: \", err)" << endl; - out << indent() << "}" << endl; + out << indent() << "if err := iprot.ReadListEnd(ctx); err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"error reading list end: \", err)" << '\n'; + out << indent() << "}" << '\n'; } } @@ -3292,7 +3292,7 @@ void t_go_generator::generate_deserialize_map_element(ostream& out, fval.set_req(t_field::T_OPT_IN_REQ_OUT); generate_deserialize_field(out, &fkey, true, "", false, false, true); generate_deserialize_field(out, &fval, true, "", false, false, false, true); - indent(out) << prefix << "[" << key << "] = " << val << endl; + indent(out) << prefix << "[" << key << "] = " << val << '\n'; } /** @@ -3307,7 +3307,7 @@ void t_go_generator::generate_deserialize_set_element(ostream& out, t_field felem(tset->get_elem_type(), elem); felem.set_req(t_field::T_OPT_IN_REQ_OUT); generate_deserialize_field(out, &felem, true, "", false, false, false, true); - indent(out) << prefix << " = append(" << prefix << ", " << elem << ")" << endl; + indent(out) << prefix << " = append(" << prefix << ", " << elem << ")" << '\n'; } /** @@ -3322,7 +3322,7 @@ void t_go_generator::generate_deserialize_list_element(ostream& out, t_field felem(((t_list*)tlist)->get_elem_type(), elem); felem.set_req(t_field::T_OPT_IN_REQ_OUT); generate_deserialize_field(out, &felem, true, "", false, false, false, true); - indent(out) << prefix << " = append(" << prefix << ", " << elem << ")" << endl; + indent(out) << prefix << " = append(" << prefix << ", " << elem << ")" << '\n'; } /** @@ -3406,10 +3406,10 @@ void t_go_generator::generate_serialize_field(ostream& out, out << "WriteI32(ctx, int32(" << name << "))"; } - out << "; err != nil {" << endl; + out << "; err != nil {" << '\n'; out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T." << escape_string(tfield->get_name()) << " (" << tfield->get_key() - << ") field write error: \", p), err) }" << endl; + << ") field write error: \", p), err) }" << '\n'; } else { throw "compiler error: Invalid type in generate_serialize_field '" + type->get_name() + "' for field '" + name + "'"; @@ -3424,10 +3424,10 @@ void t_go_generator::generate_serialize_field(ostream& out, */ void t_go_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) { (void)tstruct; - out << indent() << "if err := " << prefix << "." << write_method_name_ << "(ctx, oprot); err != nil {" << endl; + out << indent() << "if err := " << prefix << "." << write_method_name_ << "(ctx, oprot); err != nil {" << '\n'; out << indent() << " return thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", " - << prefix << "), err)" << endl; - out << indent() << "}" << endl; + << prefix << "), err)" << '\n'; + out << indent() << "}" << '\n'; } void t_go_generator::generate_serialize_container(ostream& out, @@ -3441,21 +3441,21 @@ void t_go_generator::generate_serialize_container(ostream& out, out << indent() << "if err := oprot.WriteMapBegin(ctx, " << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " - << "len(" << prefix << ")); err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"error writing map begin: \", err)" << endl; - out << indent() << "}" << endl; + << "len(" << prefix << ")); err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"error writing map begin: \", err)" << '\n'; + out << indent() << "}" << '\n'; } else if (ttype->is_set()) { out << indent() << "if err := oprot.WriteSetBegin(ctx, " << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " - << "len(" << prefix << ")); err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"error writing set begin: \", err)" << endl; - out << indent() << "}" << endl; + << "len(" << prefix << ")); err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"error writing set begin: \", err)" << '\n'; + out << indent() << "}" << '\n'; } else if (ttype->is_list()) { out << indent() << "if err := oprot.WriteListBegin(ctx, " << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " - << "len(" << prefix << ")); err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"error writing list begin: \", err)" << endl; - out << indent() << "}" << endl; + << "len(" << prefix << ")); err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"error writing list begin: \", err)" << '\n'; + out << indent() << "}" << '\n'; } else { throw "compiler error: Invalid type in generate_serialize_container '" + ttype->get_name() + "' for prefix '" + prefix + "'"; @@ -3463,66 +3463,66 @@ void t_go_generator::generate_serialize_container(ostream& out, if (ttype->is_map()) { t_map* tmap = (t_map*)ttype; - out << indent() << "for k, v := range " << prefix << " {" << endl; + out << indent() << "for k, v := range " << prefix << " {" << '\n'; indent_up(); generate_serialize_map_element(out, tmap, "k", "v"); indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } else if (ttype->is_set()) { t_set* tset = (t_set*)ttype; - out << indent() << "for i := 0; iget_elem_type()); - out << indent() << "if func(tgt, src " << goType << ") bool {" << endl; + out << indent() << "if func(tgt, src " << goType << ") bool {" << '\n'; indent_up(); generate_go_equals(out, tset->get_elem_type(), "tgt", "src"); - out << indent() << "return true" << endl; + out << indent() << "return true" << '\n'; indent_down(); - out << indent() << "}(" << wrapped_prefix << "[i], " << wrapped_prefix << "[j]) {" << endl; + out << indent() << "}(" << wrapped_prefix << "[i], " << wrapped_prefix << "[j]) {" << '\n'; indent_up(); out << indent() << "return thrift.PrependError(\"\", fmt.Errorf(\"%T error writing set field: slice is not " "unique\", " - << wrapped_prefix << "))" << endl; + << wrapped_prefix << "))" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl; - out << indent() << "for _, v := range " << prefix << " {" << endl; + out << indent() << "}" << '\n'; + out << indent() << "for _, v := range " << prefix << " {" << '\n'; indent_up(); generate_serialize_set_element(out, tset, "v"); indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } else if (ttype->is_list()) { t_list* tlist = (t_list*)ttype; - out << indent() << "for _, v := range " << prefix << " {" << endl; + out << indent() << "for _, v := range " << prefix << " {" << '\n'; indent_up(); generate_serialize_list_element(out, tlist, "v"); indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } if (ttype->is_map()) { - out << indent() << "if err := oprot.WriteMapEnd(ctx); err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"error writing map end: \", err)" << endl; - out << indent() << "}" << endl; + out << indent() << "if err := oprot.WriteMapEnd(ctx); err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"error writing map end: \", err)" << '\n'; + out << indent() << "}" << '\n'; } else if (ttype->is_set()) { - out << indent() << "if err := oprot.WriteSetEnd(ctx); err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"error writing set end: \", err)" << endl; - out << indent() << "}" << endl; + out << indent() << "if err := oprot.WriteSetEnd(ctx); err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"error writing set end: \", err)" << '\n'; + out << indent() << "}" << '\n'; } else if (ttype->is_list()) { - out << indent() << "if err := oprot.WriteListEnd(ctx); err != nil {" << endl; - out << indent() << " return thrift.PrependError(\"error writing list end: \", err)" << endl; - out << indent() << "}" << endl; + out << indent() << "if err := oprot.WriteListEnd(ctx); err != nil {" << '\n'; + out << indent() << " return thrift.PrependError(\"error writing list end: \", err)" << '\n'; + out << indent() << "}" << '\n'; } } @@ -3609,7 +3609,7 @@ void t_go_generator::generate_go_equals(ostream& out, t_type* ori_type, string t out << tgt << " != " << src; } - out << " { return false }" << endl; + out << " { return false }" << '\n'; } else { throw "compiler error: Invalid type in generate_go_equals '" + ttype->get_name() + "' for '" + tgt + "'"; @@ -3625,7 +3625,7 @@ void t_go_generator::generate_go_equals_struct(ostream& out, string src) { (void)ttype; out << indent() << "if !" << tgt << "." << equals_method_name_ << "(" << src - << ") { return false }" << endl; + << ") { return false }" << '\n'; } /** @@ -3635,16 +3635,16 @@ void t_go_generator::generate_go_equals_container(ostream& out, t_type* ttype, string tgt, string src) { - out << indent() << "if len(" << tgt << ") != len(" << src << ") { return false }" << endl; + out << indent() << "if len(" << tgt << ") != len(" << src << ") { return false }" << '\n'; if (ttype->is_map()) { t_map* tmap = (t_map*)ttype; - out << indent() << "for k, _tgt := range " << tgt << " {" << endl; + out << indent() << "for k, _tgt := range " << tgt << " {" << '\n'; indent_up(); string element_source = tmp("_src"); - out << indent() << element_source << " := " << src << "[k]" << endl; + out << indent() << element_source << " := " << src << "[k]" << '\n'; generate_go_equals(out, tmap->get_val_type(), "_tgt", element_source); indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } else if (ttype->is_list() || ttype->is_set()) { t_type* elem; if (ttype->is_list()) { @@ -3654,13 +3654,13 @@ void t_go_generator::generate_go_equals_container(ostream& out, t_set* temp = (t_set*)ttype; elem = temp->get_elem_type(); } - out << indent() << "for i, _tgt := range " << tgt << " {" << endl; + out << indent() << "for i, _tgt := range " << tgt << " {" << '\n'; indent_up(); string element_source = tmp("_src"); - out << indent() << element_source << " := " << src << "[i]" << endl; + out << indent() << element_source << " := " << src << "[i]" << '\n'; generate_go_equals(out, elem, "_tgt", element_source); indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } else { throw "INVALID TYPE IN generate_go_equals_container '" + ttype->get_name(); } @@ -3699,7 +3699,7 @@ void t_go_generator::generate_go_docstring(ostream& out, if (fields.size() > 0) { if (has_doc) { - ss << endl; + ss << '\n'; } has_doc = true; @@ -3713,7 +3713,7 @@ void t_go_generator::generate_go_docstring(ostream& out, if (p->has_doc()) { ss << ": " << p->get_doc(); } else { - ss << endl; + ss << '\n'; } } } diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.h b/compiler/cpp/src/thrift/generate/t_go_generator.h index a67485c5506..55f544e19f8 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.h +++ b/compiler/cpp/src/thrift/generate/t_go_generator.h @@ -44,8 +44,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - const string DEFAULT_THRIFT_IMPORT = "github.com/apache/thrift/lib/go/thrift"; static std::string package_flag; diff --git a/compiler/cpp/src/thrift/generate/t_gv_generator.cc b/compiler/cpp/src/thrift/generate/t_gv_generator.cc index f8616ffb345..c91200b4916 100644 --- a/compiler/cpp/src/thrift/generate/t_gv_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_gv_generator.cc @@ -38,8 +38,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /** * Graphviz code generator */ @@ -110,10 +108,10 @@ void t_gv_generator::init_generator() { MKDIR(get_out_dir().c_str()); string fname = get_out_dir() + program_->get_name() + ".gv"; f_out_.open(fname.c_str()); - f_out_ << "digraph \"" << escape_string(program_name_) << "\" {" << endl; - f_out_ << "node [style=filled, shape=record];" << endl; - f_out_ << "edge [arrowsize=0.5];" << endl; - f_out_ << "rankdir=LR" << endl; + f_out_ << "digraph \"" << escape_string(program_name_) << "\" {" << '\n'; + f_out_ << "node [style=filled, shape=record];" << '\n'; + f_out_ << "edge [arrowsize=0.5];" << '\n'; + f_out_ << "rankdir=LR" << '\n'; } /** @@ -126,29 +124,29 @@ void t_gv_generator::close_generator() { // Print edges std::list::iterator iter = edges.begin(); for (; iter != edges.end(); iter++) { - f_out_ << (*iter) << endl; + f_out_ << (*iter) << '\n'; } // Print graph end } and close file - f_out_ << "}" << endl; + f_out_ << "}" << '\n'; f_out_.close(); } void t_gv_generator::generate_typedef(t_typedef* ttypedef) { string name = ttypedef->get_name(); - f_out_ << "node [fillcolor=azure];" << endl; + f_out_ << "node [fillcolor=azure];" << '\n'; f_out_ << name << " [label=\""; f_out_ << escape_string(name); f_out_ << " :: "; print_type(ttypedef->get_type(), name); - f_out_ << "\"];" << endl; + f_out_ << "\"];" << '\n'; } void t_gv_generator::generate_enum(t_enum* tenum) { string name = tenum->get_name(); - f_out_ << "node [fillcolor=white];" << endl; + f_out_ << "node [fillcolor=white];" << '\n'; f_out_ << name << " [label=\"enum " << escape_string(name); vector values = tenum->get_constants(); @@ -159,13 +157,13 @@ void t_gv_generator::generate_enum(t_enum* tenum) { f_out_ << (*val_iter)->get_value(); } - f_out_ << "\"];" << endl; + f_out_ << "\"];" << '\n'; } void t_gv_generator::generate_const(t_const* tconst) { string name = tconst->get_name(); - f_out_ << "node [fillcolor=aliceblue];" << endl; + f_out_ << "node [fillcolor=aliceblue];" << '\n'; f_out_ << "const_" << name << " [label=\""; f_out_ << escape_string(name); @@ -174,22 +172,22 @@ void t_gv_generator::generate_const(t_const* tconst) { f_out_ << " :: "; print_type(tconst->get_type(), "const_" + name); - f_out_ << "\"];" << endl; + f_out_ << "\"];" << '\n'; } void t_gv_generator::generate_struct(t_struct* tstruct) { string name = tstruct->get_name(); if (tstruct->is_xception()) { - f_out_ << "node [fillcolor=lightpink];" << endl; + f_out_ << "node [fillcolor=lightpink];" << '\n'; f_out_ << name << " [label=\""; f_out_ << "exception " << escape_string(name); } else if (tstruct->is_union()) { - f_out_ << "node [fillcolor=lightcyan];" << endl; + f_out_ << "node [fillcolor=lightcyan];" << '\n'; f_out_ << name << " [label=\""; f_out_ << "union " << escape_string(name); } else { - f_out_ << "node [fillcolor=beige];" << endl; + f_out_ << "node [fillcolor=beige];" << '\n'; f_out_ << name << " [label=\""; f_out_ << "struct " << escape_string(name); } @@ -208,7 +206,7 @@ void t_gv_generator::generate_struct(t_struct* tstruct) { print_type((*mem_iter)->get_type(), name + ":field_" + field_name); } - f_out_ << "\"];" << endl; + f_out_ << "\"];" << '\n'; } void t_gv_generator::print_type(t_type* ttype, string struct_field_ref) { @@ -296,10 +294,10 @@ void t_gv_generator::print_const_value(t_type* type, t_const_value* tvalue) { void t_gv_generator::generate_service(t_service* tservice) { string service_name = get_service_name(tservice); - f_out_ << "subgraph cluster_" << service_name << " {" << endl; - f_out_ << "node [fillcolor=bisque];" << endl; - f_out_ << "style=dashed;" << endl; - f_out_ << "label = \"" << escape_string(service_name) << " service\";" << endl; + f_out_ << "subgraph cluster_" << service_name << " {" << '\n'; + f_out_ << "node [fillcolor=bisque];" << '\n'; + f_out_ << "style=dashed;" << '\n'; + f_out_ << "label = \"" << escape_string(service_name) << " service\";" << '\n'; // TODO: service extends @@ -327,7 +325,7 @@ void t_gv_generator::generate_service(t_service* tservice) { "function_" + service_name + fn_name + ":param_" + (*arg_iter)->get_name()); } // end of node - f_out_ << "\"];" << endl; + f_out_ << "\"];" << '\n'; // Exception edges if (exception_arrows) { @@ -340,7 +338,7 @@ void t_gv_generator::generate_service(t_service* tservice) { } } - f_out_ << " }" << endl; + f_out_ << " }" << '\n'; } std::string t_gv_generator::display_name() const { diff --git a/compiler/cpp/src/thrift/generate/t_haxe_generator.cc b/compiler/cpp/src/thrift/generate/t_haxe_generator.cc index b236e0bc619..40d4ce2e027 100644 --- a/compiler/cpp/src/thrift/generate/t_haxe_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_haxe_generator.cc @@ -37,8 +37,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /** * Haxe code generator. * @@ -424,10 +422,10 @@ void t_haxe_generator::generate_enum(t_enum* tenum) { f_enum.open(f_enum_name.c_str()); // Comment and package it - f_enum << autogen_comment() << haxe_package() << ";" << endl << endl; + f_enum << autogen_comment() << haxe_package() << ";" << '\n' << '\n'; // Add haxe imports - f_enum << string() + "import org.apache.thrift.helper.*;" << endl << endl; + f_enum << string() + "import org.apache.thrift.helper.*;" << '\n' << '\n'; generate_rtti_decoration(f_enum); generate_macro_decoration(f_enum); @@ -439,11 +437,11 @@ void t_haxe_generator::generate_enum(t_enum* tenum) { for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { int value = (*c_iter)->get_value(); indent(f_enum) << "public static inline var " << (*c_iter)->get_name() << " : Int = " << value - << ";" << endl; + << ";" << '\n'; } // Create a static Set with all valid values for this enum - f_enum << endl; + f_enum << '\n'; indent(f_enum) << "public static var VALID_VALUES = { new IntSet( ["; indent_up(); @@ -454,19 +452,19 @@ void t_haxe_generator::generate_enum(t_enum* tenum) { firstValue = false; } indent_down(); - f_enum << "]); };" << endl; + f_enum << "]); };" << '\n'; indent(f_enum) << "public static var VALUES_TO_NAMES = { ["; indent_up(); firstValue = true; for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { - f_enum << (firstValue ? "" : ",") << endl; + f_enum << (firstValue ? "" : ",") << '\n'; indent(f_enum) << (*c_iter)->get_name() << " => \"" << (*c_iter)->get_name() << "\""; firstValue = false; } - f_enum << endl; + f_enum << '\n'; indent_down(); - indent(f_enum) << "]; };" << endl; + indent(f_enum) << "]; };" << '\n'; scope_down(f_enum); // end class @@ -486,15 +484,15 @@ void t_haxe_generator::generate_consts(std::vector consts) { f_consts.open(f_consts_name.c_str()); // Print header - f_consts << autogen_comment() << haxe_package() << ";" << endl << endl; + f_consts << autogen_comment() << haxe_package() << ";" << '\n' << '\n'; - f_consts << endl; + f_consts << '\n'; f_consts << haxe_type_imports(); generate_rtti_decoration(f_consts); generate_macro_decoration(f_consts); - indent(f_consts) << "class " << get_cap_name(program_name_) << "Constants {" << endl << endl; + indent(f_consts) << "class " << get_cap_name(program_name_) << "Constants {" << '\n' << '\n'; indent_up(); vector::iterator c_iter; for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { @@ -504,7 +502,7 @@ void t_haxe_generator::generate_consts(std::vector consts) { (*c_iter)->get_value()); } indent_down(); - indent(f_consts) << "}" << endl; + indent(f_consts) << "}" << '\n'; f_consts.close(); } @@ -527,7 +525,7 @@ void t_haxe_generator::print_const_value(std::ostream& out, } out << " : " << get_cap_name(type_name(type)) << " = "; render_const_value(out, type, value); - out << ";" << endl << endl; + out << ";" << '\n' << '\n'; } std::string t_haxe_generator::render_const_value_str( t_type* type, t_const_value* value) { @@ -594,9 +592,9 @@ void t_haxe_generator::render_const_value(std::ostream& out, void t_haxe_generator::render_struct_initializer(std::ostream& out, t_struct* type, t_const_value* value) { - out << "(function() : " << get_cap_name(type_name(type)) << " {" << endl; + out << "(function() : " << get_cap_name(type_name(type)) << " {" << '\n'; indent_up(); - indent(out) << "var tmp = new " << get_cap_name(type_name(type)) << "();" << endl; + indent(out) << "var tmp = new " << get_cap_name(type_name(type)) << "();" << '\n'; const vector& fields = ((t_struct*)type)->get_members(); vector::const_iterator f_iter; @@ -615,24 +613,24 @@ void t_haxe_generator::render_struct_initializer(std::ostream& out, } indent(out) << "tmp." << v_iter->first->get_string() << " = "; render_const_value(out, field_type, v_iter->second); - out << ";" << endl; + out << ";" << '\n'; } - indent(out) << "return tmp;" << endl; + indent(out) << "return tmp;" << '\n'; indent_down(); - indent(out) << "})()"; // no endl + indent(out) << "})()"; // no line break } void t_haxe_generator::render_map_initializer(std::ostream& out, t_map* type, t_const_value* value) { - out << "(function() : " << get_cap_name(type_name(type)) << " {" << endl; + out << "(function() : " << get_cap_name(type_name(type)) << " {" << '\n'; indent_up(); - indent(out) << "var tmp = new " << get_cap_name(type_name(type)) << "();" << endl; + indent(out) << "var tmp = new " << get_cap_name(type_name(type)) << "();" << '\n'; t_type* key_type = ((t_map*)type)->get_key_type(); t_type* val_type = ((t_map*)type)->get_val_type(); - + const map& values = value->get_map(); map::const_iterator v_iter; for (v_iter = values.begin(); v_iter != values.end(); ++v_iter) { @@ -640,56 +638,56 @@ void t_haxe_generator::render_map_initializer(std::ostream& out, render_const_value(out, key_type, v_iter->first); out << ", "; render_const_value(out, val_type, v_iter->second); - out << ");" << endl; + out << ");" << '\n'; } - - indent(out) << "return tmp;" << endl; + + indent(out) << "return tmp;" << '\n'; indent_down(); - indent(out) << "})()"; // no endl + indent(out) << "})()"; // no line break } void t_haxe_generator::render_list_initializer(std::ostream& out, t_list* type, t_const_value* value) { - out << "(function() : " << get_cap_name(type_name(type)) << " {" << endl; + out << "(function() : " << get_cap_name(type_name(type)) << " {" << '\n'; indent_up(); - indent(out) << "var tmp = new " << get_cap_name(type_name(type)) << "();" << endl; + indent(out) << "var tmp = new " << get_cap_name(type_name(type)) << "();" << '\n'; t_type* elm_type = type->get_elem_type(); - + const vector& values = value->get_list(); vector::const_iterator v_iter; for (v_iter = values.begin(); v_iter != values.end(); ++v_iter) { indent(out) << "tmp.add("; render_const_value(out, elm_type, *v_iter); - out << ");" << endl; + out << ");" << '\n'; } - - indent(out) << "return tmp;" << endl; + + indent(out) << "return tmp;" << '\n'; indent_down(); - indent(out) << "})()"; // no endl + indent(out) << "})()"; // no line break } void t_haxe_generator::render_set_initializer(std::ostream& out, t_set* type, t_const_value* value) { - out << "(function() : " << get_cap_name(type_name(type)) << " {" << endl; + out << "(function() : " << get_cap_name(type_name(type)) << " {" << '\n'; indent_up(); - indent(out) << "var tmp = new " << get_cap_name(type_name(type)) << "();" << endl; + indent(out) << "var tmp = new " << get_cap_name(type_name(type)) << "();" << '\n'; t_type* elm_type = type->get_elem_type(); - + const vector& values = value->get_list(); vector::const_iterator v_iter; for (v_iter = values.begin(); v_iter != values.end(); ++v_iter) { indent(out) << "tmp.add("; render_const_value(out, elm_type, *v_iter); - out << ");" << endl; + out << ");" << '\n'; } - - indent(out) << "return tmp;" << endl; + + indent(out) << "return tmp;" << '\n'; indent_down(); - indent(out) << "})()"; // no endl + indent(out) << "})()"; // no line break } @@ -723,14 +721,14 @@ void t_haxe_generator::generate_haxe_struct(t_struct* tstruct, bool is_exception ofstream_with_content_based_conditional_update f_struct; f_struct.open(f_struct_name.c_str()); - f_struct << autogen_comment() << haxe_package() << ";" << endl; + f_struct << autogen_comment() << haxe_package() << ";" << '\n'; - f_struct << endl; + f_struct << '\n'; string imports; f_struct << haxe_type_imports() << haxe_thrift_imports() - << haxe_thrift_gen_imports(tstruct, imports) << endl; + << haxe_thrift_gen_imports(tstruct, imports) << '\n'; generate_haxe_struct_definition(f_struct, tstruct, is_exception, is_result); @@ -762,11 +760,11 @@ void t_haxe_generator::generate_haxe_struct_definition(ostream& out, if (is_exception) { out << "extends TException "; } - out << "implements TBase {" << endl << endl; + out << "implements TBase {" << '\n' << '\n'; indent_up(); indent(out) << "static var STRUCT_DESC = { new TStruct(\"" << tstruct->get_name() << "\"); };" - << endl; + << '\n'; const vector& members = tstruct->get_members(); vector::const_iterator m_iter; @@ -775,69 +773,69 @@ void t_haxe_generator::generate_haxe_struct_definition(ostream& out, indent(out) << "static var " << constant_name((*m_iter)->get_name()) << "_FIELD_DESC = { new TField(\"" << (*m_iter)->get_name() << "\", " << type_to_enum((*m_iter)->get_type()) << ", " << (*m_iter)->get_key() << "); };" - << endl; + << '\n'; } - out << endl; + out << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { generate_haxe_doc(out, *m_iter); // indent(out) << "private var _" << (*m_iter)->get_name() + " : " + - // type_name((*m_iter)->get_type()) << ";" << endl; - indent(out) << "@:isVar" << endl; + // type_name((*m_iter)->get_type()) << ";" << '\n'; + indent(out) << "@:isVar" << '\n'; indent(out) << "public var " << (*m_iter)->get_name() + "(get,set) : " - + get_cap_name(type_name((*m_iter)->get_type())) << ";" << endl; + + get_cap_name(type_name((*m_iter)->get_type())) << ";" << '\n'; } - out << endl; + out << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { indent(out) << "inline static var " << upcase_string((*m_iter)->get_name()) - << "_FIELD_ID : Int = " << (*m_iter)->get_key() << ";" << endl; + << "_FIELD_ID : Int = " << (*m_iter)->get_key() << ";" << '\n'; } - out << endl; + out << '\n'; // Inner Isset class if (members.size() > 0) { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if (!type_can_be_null((*m_iter)->get_type())) { indent(out) << "private var __isset_" << (*m_iter)->get_name() << " : Bool = false;" - << endl; + << '\n'; } } } - out << endl; + out << '\n'; // Static initializer to populate global class to struct metadata map if (false) { // TODO: reactivate when needed generate_haxe_meta_data_map(out, tstruct); - indent(out) << "{" << endl; + indent(out) << "{" << '\n'; indent_up(); indent(out) << "FieldMetaData.addStructMetaDataMap(" << type_name(tstruct) << ", metaDataMap);" - << endl; + << '\n'; indent_down(); - indent(out) << "}" << endl; - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; + indent(out) << "}" << '\n'; } // Default constructor - indent(out) << "public function new() {" << endl; + indent(out) << "public function new() {" << '\n'; indent_up(); if (is_exception) { - indent(out) << "super();" << endl; + indent(out) << "super();" << '\n'; } for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_value() != nullptr) { indent(out) << "this." << (*m_iter)->get_name() << " = "; render_const_value( out, (*m_iter)->get_type(), (*m_iter)->get_value()); - out << ";" << endl; + out << ";" << '\n'; } } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; generate_property_getters_setters(out, tstruct); generate_generic_field_getters_setters(out, tstruct); @@ -852,7 +850,7 @@ void t_haxe_generator::generate_haxe_struct_definition(ostream& out, generate_haxe_struct_tostring(out, tstruct, is_exception); generate_haxe_validator(out, tstruct); scope_down(out); - out << endl; + out << '\n'; } /** @@ -861,123 +859,123 @@ void t_haxe_generator::generate_haxe_struct_definition(ostream& out, * @param tstruct The struct definition */ void t_haxe_generator::generate_haxe_struct_reader(ostream& out, t_struct* tstruct) { - out << indent() << "public function read( iprot : TProtocol) : Void {" << endl; + out << indent() << "public function read( iprot : TProtocol) : Void {" << '\n'; indent_up(); const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; - indent(out) << "iprot.IncrementRecursionDepth();" << endl; - indent(out) << "try" << endl; + indent(out) << "iprot.IncrementRecursionDepth();" << '\n'; + indent(out) << "try" << '\n'; scope_up(out); // Declare stack tmp variables and read struct header - out << indent() << "var field : TField;" << endl << indent() << "iprot.readStructBegin();" - << endl; + out << indent() << "var field : TField;" << '\n' << indent() << "iprot.readStructBegin();" + << '\n'; // Loop over reading in fields - indent(out) << "while (true)" << endl; + indent(out) << "while (true)" << '\n'; scope_up(out); // Read beginning field marker - indent(out) << "field = iprot.readFieldBegin();" << endl; + indent(out) << "field = iprot.readFieldBegin();" << '\n'; // Check for field STOP marker and break - indent(out) << "if (field.type == TType.STOP) { " << endl; + indent(out) << "if (field.type == TType.STOP) { " << '\n'; indent_up(); - indent(out) << "break;" << endl; + indent(out) << "break;" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; // Switch statement on the field we are reading - indent(out) << "switch (field.id)" << endl; + indent(out) << "switch (field.id)" << '\n'; scope_up(out); // Generate deserialization code for known cases for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - indent(out) << "case " << upcase_string((*f_iter)->get_name()) << "_FIELD_ID:" << endl; + indent(out) << "case " << upcase_string((*f_iter)->get_name()) << "_FIELD_ID:" << '\n'; indent_up(); - indent(out) << "if (field.type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl; + indent(out) << "if (field.type == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n'; indent_up(); generate_deserialize_field(out, *f_iter, "this."); generate_isset_set(out, *f_iter); indent_down(); - out << indent() << "} else { " << endl << indent() << " TProtocolUtil.skip(iprot, field.type);" - << endl << indent() << "}" << endl; + out << indent() << "} else { " << '\n' << indent() << " TProtocolUtil.skip(iprot, field.type);" + << '\n' << indent() << "}" << '\n'; indent_down(); } // In the default case we skip the field - out << indent() << "default:" << endl << indent() << " TProtocolUtil.skip(iprot, field.type);" - << endl; + out << indent() << "default:" << '\n' << indent() << " TProtocolUtil.skip(iprot, field.type);" + << '\n'; scope_down(out); // Read field end marker - indent(out) << "iprot.readFieldEnd();" << endl; + indent(out) << "iprot.readFieldEnd();" << '\n'; scope_down(out); - out << indent() << "iprot.readStructEnd();" << endl << endl; + out << indent() << "iprot.readStructEnd();" << '\n' << '\n'; - indent(out) << "iprot.DecrementRecursionDepth();" << endl; + indent(out) << "iprot.DecrementRecursionDepth();" << '\n'; scope_down(out); - indent(out) << "catch(e:Dynamic)" << endl; + indent(out) << "catch(e:Dynamic)" << '\n'; scope_up(out); - indent(out) << "iprot.DecrementRecursionDepth();" << endl; - indent(out) << "throw e;" << endl; + indent(out) << "iprot.DecrementRecursionDepth();" << '\n'; + indent(out) << "throw e;" << '\n'; scope_down(out); // check for required fields of primitive type // (which can be checked here but not in the general validate method) - out << endl << indent() << "// check for required fields of primitive type, which can't be " - "checked in the validate method" << endl; + out << '\n' << indent() << "// check for required fields of primitive type, which can't be " + "checked in the validate method" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED && !type_can_be_null((*f_iter)->get_type())) { - out << indent() << "if (!__isset_" << (*f_iter)->get_name() << ") {" << endl << indent() + out << indent() << "if (!__isset_" << (*f_iter)->get_name() << ") {" << '\n' << indent() << " throw new TProtocolException(TProtocolException.UNKNOWN, \"Required field '" << (*f_iter)->get_name() - << "' was not found in serialized data! Struct: \" + toString());" << endl << indent() - << "}" << endl; + << "' was not found in serialized data! Struct: \" + toString());" << '\n' << indent() + << "}" << '\n'; } } // performs various checks (e.g. check that all required fields are set) - indent(out) << "validate();" << endl; + indent(out) << "validate();" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } // generates haxe method to perform various checks // (e.g. check that all required fields are set) void t_haxe_generator::generate_haxe_validator(ostream& out, t_struct* tstruct) { - indent(out) << "public function validate() : Void {" << endl; + indent(out) << "public function validate() : Void {" << '\n'; indent_up(); const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; - out << indent() << "// check for required fields" << endl; + out << indent() << "// check for required fields" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) { if (type_can_be_null((*f_iter)->get_type())) { - indent(out) << "if (" << (*f_iter)->get_name() << " == null) {" << endl; + indent(out) << "if (" << (*f_iter)->get_name() << " == null) {" << '\n'; indent(out) << " throw new TProtocolException(TProtocolException.UNKNOWN, \"Required field '" - << (*f_iter)->get_name() << "' was not present! Struct: \" + toString());" << endl; - indent(out) << "}" << endl; + << (*f_iter)->get_name() << "' was not present! Struct: \" + toString());" << '\n'; + indent(out) << "}" << '\n'; } else { indent(out) << "// alas, we cannot check '" << (*f_iter)->get_name() - << "' because it's a primitive." << endl; + << "' because it's a primitive." << '\n'; } } } // check that fields of type enum have valid values - out << indent() << "// check that fields of type enum have valid values" << endl; + out << indent() << "// check that fields of type enum have valid values" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { t_field* field = (*f_iter); t_type* type = field->get_type(); @@ -985,18 +983,18 @@ void t_haxe_generator::generate_haxe_validator(ostream& out, t_struct* tstruct) if (type->is_enum()) { indent(out) << "if (" << generate_isset_check(field) << " && !" << get_cap_name(get_enum_class_name(type)) << ".VALID_VALUES.contains(" - << field->get_name() << ")){" << endl; + << field->get_name() << ")){" << '\n'; indent_up(); indent(out) << "throw new TProtocolException(TProtocolException.UNKNOWN, \"The field '" << field->get_name() << "' has been assigned the invalid value \" + " - << field->get_name() << ");" << endl; + << field->get_name() << ");" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -1005,7 +1003,7 @@ void t_haxe_generator::generate_haxe_validator(ostream& out, t_struct* tstruct) * @param tstruct The struct definition */ void t_haxe_generator::generate_haxe_struct_writer(ostream& out, t_struct* tstruct) { - out << indent() << "public function write(oprot:TProtocol) : Void {" << endl; + out << indent() << "public function write(oprot:TProtocol) : Void {" << '\n'; indent_up(); string name = tstruct->get_name(); @@ -1013,57 +1011,57 @@ void t_haxe_generator::generate_haxe_struct_writer(ostream& out, t_struct* tstru vector::const_iterator f_iter; // performs various checks (e.g. check that all required fields are set) - indent(out) << "validate();" << endl; - indent(out) << "oprot.IncrementRecursionDepth();" << endl; - indent(out) << "try" << endl; + indent(out) << "validate();" << '\n'; + indent(out) << "oprot.IncrementRecursionDepth();" << '\n'; + indent(out) << "try" << '\n'; scope_up(out); - indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << endl; + indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool could_be_unset = (*f_iter)->get_req() == t_field::T_OPTIONAL; if (could_be_unset) { - indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << endl; + indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << '\n'; indent_up(); } bool null_allowed = type_can_be_null((*f_iter)->get_type()); if (null_allowed) { - out << indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << endl; + out << indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << '\n'; indent_up(); } indent(out) << "oprot.writeFieldBegin(" << constant_name((*f_iter)->get_name()) - << "_FIELD_DESC);" << endl; + << "_FIELD_DESC);" << '\n'; // Write field contents generate_serialize_field(out, *f_iter, "this."); // Write field closer - indent(out) << "oprot.writeFieldEnd();" << endl; + indent(out) << "oprot.writeFieldEnd();" << '\n'; if (null_allowed) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } if (could_be_unset) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } - indent(out) << "oprot.writeFieldStop();" << endl; - indent(out) << "oprot.writeStructEnd();" << endl; + indent(out) << "oprot.writeFieldStop();" << '\n'; + indent(out) << "oprot.writeStructEnd();" << '\n'; - indent(out) << "oprot.DecrementRecursionDepth();" << endl; + indent(out) << "oprot.DecrementRecursionDepth();" << '\n'; scope_down(out); - indent(out) << "catch(e:Dynamic)" << endl; + indent(out) << "catch(e:Dynamic)" << '\n'; scope_up(out); - indent(out) << "oprot.DecrementRecursionDepth();" << endl; - indent(out) << "throw e;" << endl; + indent(out) << "oprot.DecrementRecursionDepth();" << '\n'; + indent(out) << "throw e;" << '\n'; scope_down(out); indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } /** @@ -1075,59 +1073,59 @@ void t_haxe_generator::generate_haxe_struct_writer(ostream& out, t_struct* tstru * @param tstruct The struct definition */ void t_haxe_generator::generate_haxe_struct_result_writer(ostream& out, t_struct* tstruct) { - out << indent() << "public function write(oprot:TProtocol) : Void {" << endl; + out << indent() << "public function write(oprot:TProtocol) : Void {" << '\n'; indent_up(); string name = tstruct->get_name(); const vector& fields = tstruct->get_sorted_members(); vector::const_iterator f_iter; - indent(out) << "oprot.IncrementRecursionDepth();" << endl; - indent(out) << "try" << endl; + indent(out) << "oprot.IncrementRecursionDepth();" << '\n'; + indent(out) << "try" << '\n'; scope_up(out); - indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << endl; + indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << '\n'; bool first = true; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if (first) { first = false; - out << endl << indent() << "if "; + out << '\n' << indent() << "if "; } else { out << " else if "; } - out << "(this." << generate_isset_check(*f_iter) << ") {" << endl; + out << "(this." << generate_isset_check(*f_iter) << ") {" << '\n'; indent_up(); indent(out) << "oprot.writeFieldBegin(" << constant_name((*f_iter)->get_name()) - << "_FIELD_DESC);" << endl; + << "_FIELD_DESC);" << '\n'; // Write field contents generate_serialize_field(out, *f_iter, "this."); // Write field closer - indent(out) << "oprot.writeFieldEnd();" << endl; + indent(out) << "oprot.writeFieldEnd();" << '\n'; indent_down(); indent(out) << "}"; } - indent(out) << endl; - indent(out) << "oprot.writeFieldStop();" << endl; - indent(out) << "oprot.writeStructEnd();" << endl; + indent(out) << '\n'; + indent(out) << "oprot.writeFieldStop();" << '\n'; + indent(out) << "oprot.writeStructEnd();" << '\n'; - indent(out) << "oprot.DecrementRecursionDepth();" << endl; + indent(out) << "oprot.DecrementRecursionDepth();" << '\n'; scope_down(out); - indent(out) << "catch(e:Dynamic)" << endl; + indent(out) << "catch(e:Dynamic)" << '\n'; scope_up(out); - indent(out) << "oprot.DecrementRecursionDepth();" << endl; - indent(out) << "throw e;" << endl; + indent(out) << "oprot.DecrementRecursionDepth();" << '\n'; + indent(out) << "throw e;" << '\n'; scope_down(out); indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } void t_haxe_generator::generate_reflection_getters(ostringstream& out, @@ -1136,9 +1134,9 @@ void t_haxe_generator::generate_reflection_getters(ostringstream& out, string cap_name) { (void)type; (void)cap_name; - indent(out) << "case " << upcase_string(field_name) << "_FIELD_ID:" << endl; + indent(out) << "case " << upcase_string(field_name) << "_FIELD_ID:" << '\n'; indent_up(); - indent(out) << "return this." << field_name << ";" << endl; + indent(out) << "return this." << field_name << ";" << '\n'; indent_down(); } @@ -1148,13 +1146,13 @@ void t_haxe_generator::generate_reflection_setters(ostringstream& out, string cap_name) { (void)type; (void)cap_name; - indent(out) << "case " << upcase_string(field_name) << "_FIELD_ID:" << endl; + indent(out) << "case " << upcase_string(field_name) << "_FIELD_ID:" << '\n'; indent_up(); - indent(out) << "if (value == null) {" << endl; - indent(out) << " unset" << get_cap_name(field_name) << "();" << endl; - indent(out) << "} else {" << endl; - indent(out) << " this." << field_name << " = value;" << endl; - indent(out) << "}" << endl << endl; + indent(out) << "if (value == null) {" << '\n'; + indent(out) << " unset" << get_cap_name(field_name) << "();" << '\n'; + indent(out) << "} else {" << '\n'; + indent(out) << " this." << field_name << " = value;" << '\n'; + indent(out) << "}" << '\n' << '\n'; indent_down(); } @@ -1181,39 +1179,39 @@ void t_haxe_generator::generate_generic_field_getters_setters(std::ostream& out, } // create the setter - indent(out) << "public function setFieldValue(fieldID : Int, value : Dynamic) : Void {" << endl; + indent(out) << "public function setFieldValue(fieldID : Int, value : Dynamic) : Void {" << '\n'; indent_up(); if (fields.size() > 0) { - indent(out) << "switch (fieldID) {" << endl; + indent(out) << "switch (fieldID) {" << '\n'; out << setter_stream.str(); - indent(out) << "default:" << endl; - indent(out) << " throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << endl; - indent(out) << "}" << endl; + indent(out) << "default:" << '\n'; + indent(out) << " throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << '\n'; + indent(out) << "}" << '\n'; } else { - indent(out) << "throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << endl; + indent(out) << "throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; // create the getter - indent(out) << "public function getFieldValue(fieldID : Int) : Dynamic {" << endl; + indent(out) << "public function getFieldValue(fieldID : Int) : Dynamic {" << '\n'; indent_up(); if (fields.size() > 0) { - indent(out) << "switch (fieldID) {" << endl; + indent(out) << "switch (fieldID) {" << '\n'; out << getter_stream.str(); - indent(out) << "default:" << endl; - indent(out) << " throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << endl; - indent(out) << "}" << endl; + indent(out) << "default:" << '\n'; + indent(out) << " throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << '\n'; + indent(out) << "}" << '\n'; } else { - indent(out) << "throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << endl; + indent(out) << "throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } // Creates a generic isSet method that takes the field number as argument @@ -1223,29 +1221,29 @@ void t_haxe_generator::generate_generic_isset_method(std::ostream& out, t_struct // create the isSet method indent(out) << "// Returns true if field corresponding to fieldID is set (has been assigned a " - "value) and false otherwise" << endl; - indent(out) << "public function isSet(fieldID : Int) : Bool {" << endl; + "value) and false otherwise" << '\n'; + indent(out) << "public function isSet(fieldID : Int) : Bool {" << '\n'; indent_up(); if (fields.size() > 0) { - indent(out) << "switch (fieldID) {" << endl; + indent(out) << "switch (fieldID) {" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { t_field* field = *f_iter; - indent(out) << "case " << upcase_string(field->get_name()) << "_FIELD_ID:" << endl; + indent(out) << "case " << upcase_string(field->get_name()) << "_FIELD_ID:" << '\n'; indent_up(); - indent(out) << "return " << generate_isset_check(field) << ";" << endl; + indent(out) << "return " << generate_isset_check(field) << ";" << '\n'; indent_down(); } - indent(out) << "default:" << endl; - indent(out) << " throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << endl; - indent(out) << "}" << endl; + indent(out) << "default:" << '\n'; + indent(out) << " throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << '\n'; + indent(out) << "}" << '\n'; } else { - indent(out) << "throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << endl; + indent(out) << "throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -1265,48 +1263,48 @@ void t_haxe_generator::generate_property_getters_setters(ostream& out, t_struct* // Simple getter generate_haxe_doc(out, field); indent(out) << "public function get_" << field_name << "() : " << get_cap_name(type_name(type)) - << " {" << endl; + << " {" << '\n'; indent_up(); - indent(out) << "return this." << field_name << ";" << endl; + indent(out) << "return this." << field_name << ";" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; // Simple setter generate_haxe_doc(out, field); indent(out) << "public function set_" << field_name << "(" << field_name << ":" << get_cap_name(type_name(type)) << ") : " << get_cap_name(type_name(type)) << " {" - << endl; + << '\n'; indent_up(); - indent(out) << "this." << field_name << " = " << field_name << ";" << endl; + indent(out) << "this." << field_name << " = " << field_name << ";" << '\n'; generate_isset_set(out, field); - indent(out) << "return this." << field_name << ";" << endl; + indent(out) << "return this." << field_name << ";" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; // Unsetter - indent(out) << "public function unset" << cap_name << "() : Void {" << endl; + indent(out) << "public function unset" << cap_name << "() : Void {" << '\n'; indent_up(); if (type_can_be_null(type)) { - indent(out) << "this." << field_name << " = null;" << endl; + indent(out) << "this." << field_name << " = null;" << '\n'; } else { - indent(out) << "this.__isset_" << field_name << " = false;" << endl; + indent(out) << "this.__isset_" << field_name << " = false;" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; // isSet method indent(out) << "// Returns true if field " << field_name - << " is set (has been assigned a value) and false otherwise" << endl; - indent(out) << "public function is" << get_cap_name("set") << cap_name << "() : Bool {" << endl; + << " is set (has been assigned a value) and false otherwise" << '\n'; + indent(out) << "public function is" << get_cap_name("set") << cap_name << "() : Bool {" << '\n'; indent_up(); if (type_can_be_null(type)) { - indent(out) << "return this." << field_name << " != null;" << endl; + indent(out) << "return this." << field_name << " != null;" << '\n'; } else { - indent(out) << "return this.__isset_" << field_name << ";" << endl; + indent(out) << "return this.__isset_" << field_name << ";" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } } @@ -1320,11 +1318,11 @@ void t_haxe_generator::generate_haxe_struct_tostring(ostream& out, t_struct* tst if( is_override) { out << "override "; } - out << "function toString() : String {" << endl; + out << "function toString() : String {" << '\n'; indent_up(); - out << indent() << "var ret : String = \"" << tstruct->get_name() << "(\";" << endl; - out << indent() << "var first : Bool = true;" << endl << endl; + out << indent() << "var ret : String = \"" << tstruct->get_name() << "(\";" << '\n'; + out << indent() << "var first : Bool = true;" << '\n' << '\n'; const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; @@ -1332,58 +1330,58 @@ void t_haxe_generator::generate_haxe_struct_tostring(ostream& out, t_struct* tst for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool could_be_unset = (*f_iter)->get_req() == t_field::T_OPTIONAL; if (could_be_unset) { - indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << endl; + indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << '\n'; indent_up(); } t_field* field = (*f_iter); if (!first) { - indent(out) << "if (!first) ret += \", \";" << endl; + indent(out) << "if (!first) ret += \", \";" << '\n'; } - indent(out) << "ret += \"" << (*f_iter)->get_name() << ":\";" << endl; + indent(out) << "ret += \"" << (*f_iter)->get_name() << ":\";" << '\n'; bool can_be_null = type_can_be_null(field->get_type()); if (can_be_null) { - indent(out) << "if (this." << (*f_iter)->get_name() << " == null) {" << endl; - indent(out) << " ret += \"null\";" << endl; - indent(out) << "} else {" << endl; + indent(out) << "if (this." << (*f_iter)->get_name() << " == null) {" << '\n'; + indent(out) << " ret += \"null\";" << '\n'; + indent(out) << "} else {" << '\n'; indent_up(); } if (field->get_type()->is_binary()) { - indent(out) << " ret += \"BINARY\";" << endl; + indent(out) << " ret += \"BINARY\";" << '\n'; } else if (field->get_type()->is_enum()) { indent(out) << "var " << field->get_name() << "_name : String = " << get_cap_name(get_enum_class_name(field->get_type())) - << ".VALUES_TO_NAMES[this." << (*f_iter)->get_name() << "];" << endl; - indent(out) << "if (" << field->get_name() << "_name != null) {" << endl; - indent(out) << " ret += " << field->get_name() << "_name;" << endl; - indent(out) << " ret += \" (\";" << endl; - indent(out) << "}" << endl; - indent(out) << "ret += this." << field->get_name() << ";" << endl; - indent(out) << "if (" << field->get_name() << "_name != null) {" << endl; - indent(out) << " ret += \")\";" << endl; - indent(out) << "}" << endl; + << ".VALUES_TO_NAMES[this." << (*f_iter)->get_name() << "];" << '\n'; + indent(out) << "if (" << field->get_name() << "_name != null) {" << '\n'; + indent(out) << " ret += " << field->get_name() << "_name;" << '\n'; + indent(out) << " ret += \" (\";" << '\n'; + indent(out) << "}" << '\n'; + indent(out) << "ret += this." << field->get_name() << ";" << '\n'; + indent(out) << "if (" << field->get_name() << "_name != null) {" << '\n'; + indent(out) << " ret += \")\";" << '\n'; + indent(out) << "}" << '\n'; } else { - indent(out) << "ret += this." << (*f_iter)->get_name() << ";" << endl; + indent(out) << "ret += this." << (*f_iter)->get_name() << ";" << '\n'; } if (can_be_null) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } - indent(out) << "first = false;" << endl; + indent(out) << "first = false;" << '\n'; if (could_be_unset) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } first = false; } - out << indent() << "ret += \")\";" << endl << indent() << "return ret;" << endl; + out << indent() << "ret += \")\";" << '\n' << indent() << "return ret;" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -1397,7 +1395,7 @@ void t_haxe_generator::generate_haxe_meta_data_map(ostream& out, t_struct* tstru vector::const_iterator f_iter; // Static Map with fieldID -> FieldMetaData mappings - indent(out) << "inline static var metaDataMap : IntMap = new IntMap();" << endl; + indent(out) << "inline static var metaDataMap : IntMap = new IntMap();" << '\n'; if (fields.size() > 0) { // Populate map @@ -1419,7 +1417,7 @@ void t_haxe_generator::generate_haxe_meta_data_map(ostream& out, t_struct* tstru // Create value meta data generate_field_value_meta_data(out, field->get_type()); - out << ");" << endl; + out << ");" << '\n'; } scope_down(out); } @@ -1484,7 +1482,7 @@ std::string t_haxe_generator::get_haxe_type_string(t_type* type) { } void t_haxe_generator::generate_field_value_meta_data(std::ostream& out, t_type* type) { - out << endl; + out << '\n'; indent_up(); indent_up(); if (type->is_struct()) { @@ -1527,20 +1525,20 @@ void t_haxe_generator::generate_service(t_service* tservice) { string f_service_name = package_dir_ + "/" + get_cap_name(service_name_) + "_service.hx"; f_service_.open(f_service_name.c_str()); - f_service_ << autogen_comment() << haxe_package() << ";" << endl; + f_service_ << autogen_comment() << haxe_package() << ";" << '\n'; - f_service_ << endl << haxe_type_imports() << haxe_thrift_imports() + f_service_ << '\n' << haxe_type_imports() << haxe_thrift_imports() << haxe_thrift_gen_imports(tservice); if (tservice->get_extends() != nullptr) { t_type* parent = tservice->get_extends(); string parent_namespace = make_package_name( parent->get_program()->get_namespace("haxe")); if (!parent_namespace.empty() && parent_namespace != package_name_) { - f_service_ << "import " << get_cap_name(type_name(parent)) << "_service;" << endl; + f_service_ << "import " << get_cap_name(type_name(parent)) << "_service;" << '\n'; } } - f_service_ << endl; + f_service_ << '\n'; generate_service_interface(tservice,false); f_service_.close(); @@ -1549,20 +1547,20 @@ void t_haxe_generator::generate_service(t_service* tservice) { f_service_name = package_dir_ + "/" + get_cap_name(service_name_) + ".hx"; f_service_.open(f_service_name.c_str()); - f_service_ << autogen_comment() << haxe_package() << ";" << endl; + f_service_ << autogen_comment() << haxe_package() << ";" << '\n'; - f_service_ << endl << haxe_type_imports() << haxe_thrift_imports() + f_service_ << '\n' << haxe_type_imports() << haxe_thrift_imports() << haxe_thrift_gen_imports(tservice); if (tservice->get_extends() != nullptr) { t_type* parent = tservice->get_extends(); string parent_namespace = make_package_name( parent->get_program()->get_namespace("haxe")); if (!parent_namespace.empty() && parent_namespace != package_name_) { - f_service_ << "import " << get_cap_name(type_name(parent)) << ";" << endl; + f_service_ << "import " << get_cap_name(type_name(parent)) << ";" << '\n'; } } - f_service_ << endl; + f_service_ << '\n'; generate_service_interface(tservice,true); f_service_.close(); @@ -1571,18 +1569,18 @@ void t_haxe_generator::generate_service(t_service* tservice) { f_service_name = package_dir_ + "/" + get_cap_name(service_name_) + "Impl.hx"; f_service_.open(f_service_name.c_str()); - f_service_ << autogen_comment() << haxe_package() << ";" << endl << endl << haxe_type_imports() - << haxe_thrift_imports() << haxe_thrift_gen_imports(tservice) << endl; + f_service_ << autogen_comment() << haxe_package() << ";" << '\n' << '\n' << haxe_type_imports() + << haxe_thrift_imports() << haxe_thrift_gen_imports(tservice) << '\n'; if (tservice->get_extends() != nullptr) { t_type* parent = tservice->get_extends(); string parent_namespace = make_package_name( parent->get_program()->get_namespace("haxe")); if (!parent_namespace.empty() && parent_namespace != package_name_) { - f_service_ << "import " << get_cap_name(type_name(parent)) << "Impl;" << endl; + f_service_ << "import " << get_cap_name(type_name(parent)) << "Impl;" << '\n'; } } - f_service_ << endl; + f_service_ << '\n'; generate_service_client(tservice); f_service_.close(); @@ -1594,17 +1592,17 @@ void t_haxe_generator::generate_service(t_service* tservice) { f_service_name = package_dir_ + "/" + get_cap_name(service_name_) + "Processor.hx"; f_service_.open(f_service_name.c_str()); - f_service_ << autogen_comment() << haxe_package() << ";" << endl - << endl + f_service_ << autogen_comment() << haxe_package() << ";" << '\n' + << '\n' << haxe_type_imports() - << haxe_thrift_imports() - << haxe_thrift_gen_imports(tservice) - << endl; + << haxe_thrift_imports() + << haxe_thrift_gen_imports(tservice) + << '\n'; if (!package_name_.empty()) { - f_service_ << "import " << package_name_ << ".*;" << endl; - f_service_ << "import " << package_name_ << "." << get_cap_name(service_name_).c_str() << "Impl;" << endl; - f_service_ << endl; + f_service_ << "import " << package_name_ << ".*;" << '\n'; + f_service_ << "import " << package_name_ << "." << get_cap_name(service_name_).c_str() << "Impl;" << '\n'; + f_service_ << '\n'; } generate_service_server(tservice); @@ -1668,9 +1666,9 @@ void t_haxe_generator::generate_service_method_signature_normal(t_function* tfun bool is_interface) { if (is_interface) { generate_deprecation_attribute(f_service_, tfunction, true); - indent(f_service_) << function_signature_normal(tfunction) << ";" << endl << endl; + indent(f_service_) << function_signature_normal(tfunction) << ";" << '\n' << '\n'; } else { - indent(f_service_) << "public " << function_signature_normal(tfunction) << " {" << endl; + indent(f_service_) << "public " << function_signature_normal(tfunction) << " {" << '\n'; } } @@ -1683,15 +1681,15 @@ void t_haxe_generator::generate_service_method_signature_combined(t_function* tf bool is_interface) { if (!tfunction->is_oneway()) { std::string on_success_impl = generate_service_method_onsuccess(tfunction, false, false); - indent(f_service_) << "// function onError(Dynamic) : Void;" << endl; - indent(f_service_) << "// function " << on_success_impl.c_str() << ";" << endl; + indent(f_service_) << "// function onError(Dynamic) : Void;" << '\n'; + indent(f_service_) << "// function " << on_success_impl.c_str() << ";" << '\n'; } if (is_interface) { generate_deprecation_attribute(f_service_, tfunction, false); - indent(f_service_) << function_signature_combined(tfunction) << ";" << endl << endl; + indent(f_service_) << function_signature_combined(tfunction) << ";" << '\n' << '\n'; } else { - indent(f_service_) << "public " << function_signature_combined(tfunction) << " {" << endl; + indent(f_service_) << "public " << function_signature_combined(tfunction) << " {" << '\n'; } } @@ -1738,7 +1736,7 @@ void t_haxe_generator::generate_deprecation_attribute(ostream& out, t_function* } } - out << endl; + out << '\n'; } } @@ -1762,14 +1760,14 @@ void t_haxe_generator::generate_service_interface(t_service* tservice, bool comb generate_rtti_decoration(f_service_); generate_macro_decoration(f_service_); f_service_ << indent() << "interface " << get_cap_name(service_name_) << cbk_postfix << extends_iface << " {" - << endl << endl; + << '\n' << '\n'; indent_up(); for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_haxe_doc(f_service_, *f_iter); generate_service_method_signature(*f_iter, true, combined); } indent_down(); - f_service_ << indent() << "}" << endl << endl; + f_service_ << indent() << "}" << '\n' << '\n'; } /** @@ -1778,7 +1776,7 @@ void t_haxe_generator::generate_service_interface(t_service* tservice, bool comb * @param tservice The service */ void t_haxe_generator::generate_service_helpers(t_service* tservice) { - f_service_ << endl << endl; + f_service_ << '\n' << '\n'; vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -1804,44 +1802,44 @@ void t_haxe_generator::generate_service_client(t_service* tservice) { generate_rtti_decoration(f_service_); // build macro is inherited from interface indent(f_service_) << "class " << get_cap_name(service_name_) << "Impl" << extends_client - << " implements " << get_cap_name(service_name_) << " {" << endl << endl; + << " implements " << get_cap_name(service_name_) << " {" << '\n' << '\n'; indent_up(); - indent(f_service_) << "public function new( iprot : TProtocol, oprot : TProtocol = null)" << endl; + indent(f_service_) << "public function new( iprot : TProtocol, oprot : TProtocol = null)" << '\n'; scope_up(f_service_); if (extends.empty()) { - f_service_ << indent() << "iprot_ = iprot;" << endl; - f_service_ << indent() << "if (oprot == null) {" << endl; + f_service_ << indent() << "iprot_ = iprot;" << '\n'; + f_service_ << indent() << "if (oprot == null) {" << '\n'; indent_up(); - f_service_ << indent() << "oprot_ = iprot;" << endl; + f_service_ << indent() << "oprot_ = iprot;" << '\n'; indent_down(); - f_service_ << indent() << "} else {" << endl; + f_service_ << indent() << "} else {" << '\n'; indent_up(); - f_service_ << indent() << "oprot_ = oprot;" << endl; + f_service_ << indent() << "oprot_ = oprot;" << '\n'; indent_down(); - f_service_ << indent() << "}" << endl; + f_service_ << indent() << "}" << '\n'; } else { - f_service_ << indent() << "super(iprot, oprot);" << endl; + f_service_ << indent() << "super(iprot, oprot);" << '\n'; } scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; if (extends.empty()) { - f_service_ << indent() << "private var iprot_ : TProtocol;" << endl << indent() - << "private var oprot_ : TProtocol;" << endl << indent() - << "private var seqid_ : Int;" << endl << endl; + f_service_ << indent() << "private var iprot_ : TProtocol;" << '\n' << indent() + << "private var oprot_ : TProtocol;" << '\n' << indent() + << "private var seqid_ : Int;" << '\n' << '\n'; - indent(f_service_) << "public function getInputProtocol() : TProtocol" << endl; + indent(f_service_) << "public function getInputProtocol() : TProtocol" << '\n'; scope_up(f_service_); - indent(f_service_) << "return this.iprot_;" << endl; + indent(f_service_) << "return this.iprot_;" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; - indent(f_service_) << "public function getOutputProtocol() : TProtocol" << endl; + indent(f_service_) << "public function getOutputProtocol() : TProtocol" << '\n'; scope_up(f_service_); - indent(f_service_) << "return this.oprot_;" << endl; + indent(f_service_) << "return this.oprot_;" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; } // Generate client method implementations @@ -1866,140 +1864,140 @@ void t_haxe_generator::generate_service_client(t_service* tservice) { string args = tmp("args"); string calltype = (*f_iter)->is_oneway() ? "ONEWAY" : "CALL"; f_service_ << indent() << "oprot_.writeMessageBegin(new TMessage(\"" << funname - << "\", TMessageType." << calltype << ", seqid_));" << endl << indent() - << "var " << args << " : " << argsname << " = new " << argsname << "();" << endl; + << "\", TMessageType." << calltype << ", seqid_));" << '\n' << indent() + << "var " << args << " : " << argsname << " = new " << argsname << "();" << '\n'; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { f_service_ << indent() << args << "." << (*fld_iter)->get_name() << " = " - << (*fld_iter)->get_name() << ";" << endl; + << (*fld_iter)->get_name() << ";" << '\n'; } - f_service_ << indent() << args << ".write(oprot_);" << endl << indent() - << "oprot_.writeMessageEnd();" << endl; + f_service_ << indent() << args << ".write(oprot_);" << '\n' << indent() + << "oprot_.writeMessageEnd();" << '\n'; string retval = tmp("retval"); if (!((*f_iter)->is_oneway() || (*f_iter)->get_returntype()->is_void())) { f_service_ << indent() << "var " << retval << " : " << type_name((*f_iter)->get_returntype()) - << " = " << render_default_value_for_type((*f_iter)->get_returntype(),true) - << ";" << endl; + << " = " << render_default_value_for_type((*f_iter)->get_returntype(),true) + << ";" << '\n'; } if ((*f_iter)->is_oneway()) { - f_service_ << indent() << "oprot_.getTransport().flush();" << endl; + f_service_ << indent() << "oprot_.getTransport().flush();" << '\n'; } else { - indent(f_service_) << "oprot_.getTransport().flush(function(error:Dynamic) : Void {" << endl; + indent(f_service_) << "oprot_.getTransport().flush(function(error:Dynamic) : Void {" << '\n'; indent_up(); - indent(f_service_) << "try {" << endl; + indent(f_service_) << "try {" << '\n'; indent_up(); string appex = tmp("appex"); - indent(f_service_) << "var " << appex << " : TApplicationException;" << endl; + indent(f_service_) << "var " << appex << " : TApplicationException;" << '\n'; string resultname = get_cap_name((*f_iter)->get_name() + "_result"); - indent(f_service_) << "if (error != null) {" << endl; + indent(f_service_) << "if (error != null) {" << '\n'; indent_up(); - indent(f_service_) << "if (onError == null)" << endl; + indent(f_service_) << "if (onError == null)" << '\n'; indent_up(); - indent(f_service_) << "throw error;" << endl; + indent(f_service_) << "throw error;" << '\n'; indent_down(); - indent(f_service_) << "onError(error);" << endl; - indent(f_service_) << "return;" << endl; + indent(f_service_) << "onError(error);" << '\n'; + indent(f_service_) << "return;" << '\n'; indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; string msg = tmp("msg"); - indent(f_service_) << "var " << msg << " : TMessage = iprot_.readMessageBegin();" << endl; - indent(f_service_) << "if (" << msg << ".type == TMessageType.EXCEPTION) {" << endl; + indent(f_service_) << "var " << msg << " : TMessage = iprot_.readMessageBegin();" << '\n'; + indent(f_service_) << "if (" << msg << ".type == TMessageType.EXCEPTION) {" << '\n'; indent_up(); - indent(f_service_) << appex << " = TApplicationException.read(iprot_);" << endl; - indent(f_service_) << "iprot_.readMessageEnd();" << endl; - indent(f_service_) << "if (onError == null)" << endl; + indent(f_service_) << appex << " = TApplicationException.read(iprot_);" << '\n'; + indent(f_service_) << "iprot_.readMessageEnd();" << '\n'; + indent(f_service_) << "if (onError == null)" << '\n'; indent_up(); - indent(f_service_) << "throw " << appex << ";" << endl; + indent(f_service_) << "throw " << appex << ";" << '\n'; indent_down(); - indent(f_service_) << "onError(" << appex << ");" << endl; - indent(f_service_) << "return;" << endl; + indent(f_service_) << "onError(" << appex << ");" << '\n'; + indent(f_service_) << "return;" << '\n'; indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; string result = tmp("result"); - indent(f_service_) << "var " << result << " : " << resultname << " = new " << resultname << "();" << endl; - indent(f_service_) << "" << result << ".read(iprot_);" << endl; - indent(f_service_) << "iprot_.readMessageEnd();" << endl; + indent(f_service_) << "var " << result << " : " << resultname << " = new " << resultname << "();" << '\n'; + indent(f_service_) << "" << result << ".read(iprot_);" << '\n'; + indent(f_service_) << "iprot_.readMessageEnd();" << '\n'; // Careful, only return _result if not a void function if (!(*f_iter)->get_returntype()->is_void()) { - indent(f_service_) << "if (" << result << "." << generate_isset_check("success") << ") {" << endl; + indent(f_service_) << "if (" << result << "." << generate_isset_check("success") << ") {" << '\n'; indent_up(); - indent(f_service_) << "if (onSuccess != null)" << endl; + indent(f_service_) << "if (onSuccess != null)" << '\n'; indent_up(); - indent(f_service_) << "onSuccess(" << result << ".success);" << endl; + indent(f_service_) << "onSuccess(" << result << ".success);" << '\n'; indent_down(); - indent(f_service_) << retval << " = " << result << ".success;" << endl; - indent(f_service_) << "return;" << endl; + indent(f_service_) << retval << " = " << result << ".success;" << '\n'; + indent(f_service_) << "return;" << '\n'; indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; } t_struct* xs = (*f_iter)->get_xceptions(); const std::vector& xceptions = xs->get_members(); vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { - indent(f_service_) << "if (" << result << "." << (*x_iter)->get_name() << " != null) {" << endl; + indent(f_service_) << "if (" << result << "." << (*x_iter)->get_name() << " != null) {" << '\n'; indent_up(); - indent(f_service_) << "if (onError == null)" << endl; + indent(f_service_) << "if (onError == null)" << '\n'; indent_up(); - indent(f_service_) << "throw " << result << "." << (*x_iter)->get_name() << ";" << endl; + indent(f_service_) << "throw " << result << "." << (*x_iter)->get_name() << ";" << '\n'; indent_down(); - indent(f_service_) << "onError(" << result << "." << (*x_iter)->get_name() << ");" << endl; - indent(f_service_) << "return;" << endl; + indent(f_service_) << "onError(" << result << "." << (*x_iter)->get_name() << ");" << '\n'; + indent(f_service_) << "return;" << '\n'; indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; } // If you get here it's an exception, unless a void function if ((*f_iter)->get_returntype()->is_void()) { - indent(f_service_) << "if (onSuccess != null)" << endl; + indent(f_service_) << "if (onSuccess != null)" << '\n'; indent_up(); - indent(f_service_) << "onSuccess();" << endl; + indent(f_service_) << "onSuccess();" << '\n'; indent_down(); - indent(f_service_) << "return;" << endl; + indent(f_service_) << "return;" << '\n'; } else { indent(f_service_) << appex << " = new TApplicationException(" << "TApplicationException.MISSING_RESULT," - << "\"" << (*f_iter)->get_name() << " failed: unknown result\");" << endl; - indent(f_service_) << "if (onError == null)" << endl; + << "\"" << (*f_iter)->get_name() << " failed: unknown result\");" << '\n'; + indent(f_service_) << "if (onError == null)" << '\n'; indent_up(); - indent(f_service_) << "throw " << appex << ";" << endl; + indent(f_service_) << "throw " << appex << ";" << '\n'; indent_down(); - indent(f_service_) << "onError(" << appex << ");" << endl; - indent(f_service_) << "return;" << endl; + indent(f_service_) << "onError(" << appex << ");" << '\n'; + indent(f_service_) << "return;" << '\n'; } indent_down(); - indent(f_service_) << endl; - indent(f_service_) << "} catch( e : TException) {" << endl; + indent(f_service_) << '\n'; + indent(f_service_) << "} catch( e : TException) {" << '\n'; indent_up(); - indent(f_service_) << "if (onError == null)" << endl; + indent(f_service_) << "if (onError == null)" << '\n'; indent_up(); - indent(f_service_) << "throw e;" << endl; + indent(f_service_) << "throw e;" << '\n'; indent_down(); - indent(f_service_) << "onError(e);" << endl; - indent(f_service_) << "return;" << endl; + indent(f_service_) << "onError(e);" << '\n'; + indent(f_service_) << "return;" << '\n'; indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; indent_down(); - indent(f_service_) << "});" << endl << endl; + indent(f_service_) << "});" << '\n' << '\n'; } if (!((*f_iter)->is_oneway() || (*f_iter)->get_returntype()->is_void())) { - f_service_ << indent() << "return " << retval << ";" << endl; + f_service_ << indent() << "return " << retval << ";" << '\n'; } // Close function scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; } indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } /** @@ -2024,35 +2022,35 @@ void t_haxe_generator::generate_service_server(t_service* tservice) { generate_rtti_decoration(f_service_); generate_macro_decoration(f_service_); indent(f_service_) << "class " << get_cap_name(service_name_) << "Processor" << extends_processor - << " implements TProcessor {" << endl << endl; + << " implements TProcessor {" << '\n' << '\n'; indent_up(); f_service_ << indent() << "private var " << get_cap_name(service_name_) - << "_iface_ : " << get_cap_name(service_name_) << "_service;" << endl; + << "_iface_ : " << get_cap_name(service_name_) << "_service;" << '\n'; if (extends.empty()) { f_service_ << indent() << "private var PROCESS_MAP = new StringMap< Int->TProtocol->TProtocol->Void >();" - << endl; + << '\n'; } - f_service_ << endl; + f_service_ << '\n'; indent(f_service_) << "public function new( iface : " << get_cap_name(service_name_) << "_service)" - << endl; + << '\n'; scope_up(f_service_); if (!extends.empty()) { - f_service_ << indent() << "super(iface);" << endl; + f_service_ << indent() << "super(iface);" << '\n'; } - f_service_ << indent() << get_cap_name(service_name_) << "_iface_ = iface;" << endl; + f_service_ << indent() << get_cap_name(service_name_) << "_iface_ = iface;" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { f_service_ << indent() << "PROCESS_MAP.set(\"" << (*f_iter)->get_name() << "\", " - << (*f_iter)->get_name() << "());" << endl; + << (*f_iter)->get_name() << "());" << '\n'; } scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Generate the server implementation string override = ""; @@ -2061,31 +2059,31 @@ void t_haxe_generator::generate_service_server(t_service* tservice) { } indent(f_service_) << override << "public function process( iprot : TProtocol, oprot : TProtocol) : Bool" - << endl; + << '\n'; scope_up(f_service_); - f_service_ << indent() << "var msg : TMessage = iprot.readMessageBegin();" << endl; + f_service_ << indent() << "var msg : TMessage = iprot.readMessageBegin();" << '\n'; // TODO(mcslee): validate message, was the seqid etc. legit? f_service_ - << indent() << "var fn = PROCESS_MAP.get(msg.name);" << endl - << indent() << "if (fn == null) {" << endl - << indent() << " TProtocolUtil.skip(iprot, TType.STRUCT);" << endl - << indent() << " iprot.readMessageEnd();" << endl + << indent() << "var fn = PROCESS_MAP.get(msg.name);" << '\n' + << indent() << "if (fn == null) {" << '\n' + << indent() << " TProtocolUtil.skip(iprot, TType.STRUCT);" << '\n' + << indent() << " iprot.readMessageEnd();" << '\n' << indent() << " var appex = new TApplicationException(TApplicationException.UNKNOWN_METHOD, " - << "\"Invalid method name: '\"+msg.name+\"'\");" << endl - << indent() << " oprot.writeMessageBegin(new TMessage(msg.name, TMessageType.EXCEPTION, msg.seqid));" << endl - << indent() << " appex.write(oprot);" << endl << indent() << " oprot.writeMessageEnd();" << endl - << indent() << " oprot.getTransport().flush();" << endl - << indent() << " return true;" << endl << indent() << "}" << endl - << indent() << "fn( msg.seqid, iprot, oprot);" << endl + << "\"Invalid method name: '\"+msg.name+\"'\");" << '\n' + << indent() << " oprot.writeMessageBegin(new TMessage(msg.name, TMessageType.EXCEPTION, msg.seqid));" << '\n' + << indent() << " appex.write(oprot);" << '\n' << indent() << " oprot.writeMessageEnd();" << '\n' + << indent() << " oprot.getTransport().flush();" << '\n' + << indent() << " return true;" << '\n' << indent() << "}" << '\n' + << indent() << "fn( msg.seqid, iprot, oprot);" << '\n' ; - f_service_ << indent() << "return true;" << endl; + f_service_ << indent() << "return true;" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Generate the process subfunctions for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -2093,7 +2091,7 @@ void t_haxe_generator::generate_service_server(t_service* tservice) { } indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; } /** @@ -2132,20 +2130,20 @@ void t_haxe_generator::generate_process_function(t_service* tservice, t_function (void)tservice; // Open class indent(f_service_) << "private function " << tfunction->get_name() - << "() : Int->TProtocol->TProtocol->Void {" << endl; + << "() : Int->TProtocol->TProtocol->Void {" << '\n'; indent_up(); // Open function indent(f_service_) << "return function( seqid : Int, iprot : TProtocol, oprot : TProtocol) : Void" - << endl; + << '\n'; scope_up(f_service_); string argsname = get_cap_name(tfunction->get_name() + "_args"); string resultname = get_cap_name(tfunction->get_name() + "_result"); - f_service_ << indent() << "var args : " << argsname << " = new " << argsname << "();" << endl - << indent() << "args.read(iprot);" << endl << indent() << "iprot.readMessageEnd();" - << endl; + f_service_ << indent() << "var args : " << argsname << " = new " << argsname << "();" << '\n' + << indent() << "args.read(iprot);" << '\n' << indent() << "iprot.readMessageEnd();" + << '\n'; t_struct* xs = tfunction->get_xceptions(); const std::vector& xceptions = xs->get_members(); @@ -2153,11 +2151,11 @@ void t_haxe_generator::generate_process_function(t_service* tservice, t_function // Declare result for non oneway function if (!tfunction->is_oneway()) { - f_service_ << indent() << "var result : " << resultname << " = new " << resultname << "();" << endl; + f_service_ << indent() << "var result : " << resultname << " = new " << resultname << "();" << '\n'; } // Try block for any function to catch (defined or undefined) exceptions - f_service_ << indent() << "try {" << endl; + f_service_ << indent() << "try {" << '\n'; indent_up(); @@ -2182,7 +2180,7 @@ void t_haxe_generator::generate_process_function(t_service* tservice, t_function } f_service_ << "args." << (*f_iter)->get_name(); } - f_service_ << ");" << endl; + f_service_ << ");" << '\n'; indent_down(); f_service_ << indent() << "}"; @@ -2190,11 +2188,11 @@ void t_haxe_generator::generate_process_function(t_service* tservice, t_function // catch exceptions defined in the IDL for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { f_service_ << " catch (" << (*x_iter)->get_name() << ":" - << get_cap_name(type_name((*x_iter)->get_type(), false, false)) << ") {" << endl; + << get_cap_name(type_name((*x_iter)->get_type(), false, false)) << ") {" << '\n'; if (!tfunction->is_oneway()) { indent_up(); f_service_ << indent() << "result." << (*x_iter)->get_name() << " = " - << (*x_iter)->get_name() << ";" << endl; + << (*x_iter)->get_name() << ";" << '\n'; indent_down(); f_service_ << indent() << "}"; } else { @@ -2205,45 +2203,45 @@ void t_haxe_generator::generate_process_function(t_service* tservice, t_function // always catch all exceptions to prevent from service denial string appex = tmp("appex"); - f_service_ << " catch (th : Dynamic) {" << endl; + f_service_ << " catch (th : Dynamic) {" << '\n'; indent_up(); - indent(f_service_) << "trace(\"Internal error processing " << tfunction->get_name() << "\", th);" << endl; + indent(f_service_) << "trace(\"Internal error processing " << tfunction->get_name() << "\", th);" << '\n'; if (!tfunction->is_oneway()) { indent(f_service_) << "var appex = new TApplicationException(TApplicationException.INTERNAL_ERROR, " - "\"Internal error processing " << tfunction->get_name() << "\");" << endl; + "\"Internal error processing " << tfunction->get_name() << "\");" << '\n'; indent(f_service_) << "oprot.writeMessageBegin(new TMessage(\"" << tfunction->get_name() - << "\", TMessageType.EXCEPTION, seqid));" << endl; - indent(f_service_) << "appex.write(oprot);" << endl; - indent(f_service_) << "oprot.writeMessageEnd();" << endl; - indent(f_service_) << "oprot.getTransport().flush();" << endl; + << "\", TMessageType.EXCEPTION, seqid));" << '\n'; + indent(f_service_) << "appex.write(oprot);" << '\n'; + indent(f_service_) << "oprot.writeMessageEnd();" << '\n'; + indent(f_service_) << "oprot.getTransport().flush();" << '\n'; } - indent(f_service_) << "return;" << endl; + indent(f_service_) << "return;" << '\n'; indent_down(); - f_service_ << indent() << "}" << endl; + f_service_ << indent() << "}" << '\n'; // Shortcut out here for oneway functions if (tfunction->is_oneway()) { - f_service_ << indent() << "return;" << endl; + f_service_ << indent() << "return;" << '\n'; scope_down(f_service_); // Close class indent_down(); - f_service_ << indent() << "}" << endl << endl; + f_service_ << indent() << "}" << '\n' << '\n'; return; } f_service_ << indent() << "oprot.writeMessageBegin(new TMessage(\"" << tfunction->get_name() - << "\", TMessageType.REPLY, seqid));" << endl << indent() << "result.write(oprot);" - << endl << indent() << "oprot.writeMessageEnd();" << endl << indent() - << "oprot.getTransport().flush();" << endl; + << "\", TMessageType.REPLY, seqid));" << '\n' << indent() << "result.write(oprot);" + << '\n' << indent() << "oprot.writeMessageEnd();" << '\n' << indent() + << "oprot.getTransport().flush();" << '\n'; // Close function scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Close class indent_down(); - f_service_ << indent() << "}" << endl << endl; + f_service_ << indent() << "}" << '\n' << '\n'; } /** @@ -2309,7 +2307,7 @@ void t_haxe_generator::generate_deserialize_field(ostream& out, t_field* tfield, } else if (type->is_enum()) { out << "readI32();"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", tfield->get_name().c_str(), @@ -2323,8 +2321,8 @@ void t_haxe_generator::generate_deserialize_field(ostream& out, t_field* tfield, void t_haxe_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) { - out << indent() << prefix << " = new " << get_cap_name(type_name(tstruct)) << "();" << endl - << indent() << prefix << ".read(iprot);" << endl; + out << indent() << prefix << " = new " << get_cap_name(type_name(tstruct)) << "();" << '\n' + << indent() << prefix << ".read(iprot);" << '\n'; } /** @@ -2345,21 +2343,21 @@ void t_haxe_generator::generate_deserialize_container(ostream& out, t_type* ttyp // Declare variables, read header if (ttype->is_map()) { - indent(out) << "var " << obj << " = iprot.readMapBegin();" << endl; + indent(out) << "var " << obj << " = iprot.readMapBegin();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "var " << obj << " = iprot.readSetBegin();" << endl; + indent(out) << "var " << obj << " = iprot.readSetBegin();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "var " << obj << " = iprot.readListBegin();" << endl; + indent(out) << "var " << obj << " = iprot.readListBegin();" << '\n'; } indent(out) << prefix << " = new " << type_name(ttype, false, true) // size the collection correctly << "(" - << ");" << endl; + << ");" << '\n'; // For loop iterates over elements string i = tmp("_i"); - indent(out) << "for( " << i << " in 0 ... " << obj << ".size)" << endl; + indent(out) << "for( " << i << " in 0 ... " << obj << ".size)" << '\n'; scope_up(out); @@ -2375,11 +2373,11 @@ void t_haxe_generator::generate_deserialize_container(ostream& out, t_type* ttyp // Read container end if (ttype->is_map()) { - indent(out) << "iprot.readMapEnd();" << endl; + indent(out) << "iprot.readMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "iprot.readSetEnd();" << endl; + indent(out) << "iprot.readSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "iprot.readListEnd();" << endl; + indent(out) << "iprot.readListEnd();" << '\n'; } scope_down(out); @@ -2394,13 +2392,13 @@ void t_haxe_generator::generate_deserialize_map_element(ostream& out, t_map* tma t_field fkey(tmap->get_key_type(), key); t_field fval(tmap->get_val_type(), val); - indent(out) << declare_field(&fkey) << endl; - indent(out) << declare_field(&fval) << endl; + indent(out) << declare_field(&fkey) << '\n'; + indent(out) << declare_field(&fval) << '\n'; generate_deserialize_field(out, &fkey); generate_deserialize_field(out, &fval); - indent(out) << prefix << ".set( " << key << ", " << val << ");" << endl; + indent(out) << prefix << ".set( " << key << ", " << val << ");" << '\n'; } /** @@ -2410,11 +2408,11 @@ void t_haxe_generator::generate_deserialize_set_element(ostream& out, t_set* tse string elem = tmp("_elem"); t_field felem(tset->get_elem_type(), elem); - indent(out) << declare_field(&felem) << endl; + indent(out) << declare_field(&felem) << '\n'; generate_deserialize_field(out, &felem); - indent(out) << prefix << ".add(" << elem << ");" << endl; + indent(out) << prefix << ".add(" << elem << ");" << '\n'; } /** @@ -2426,11 +2424,11 @@ void t_haxe_generator::generate_deserialize_list_element(ostream& out, string elem = tmp("_elem"); t_field felem(tlist->get_elem_type(), elem); - indent(out) << declare_field(&felem) << endl; + indent(out) << declare_field(&felem) << '\n'; generate_deserialize_field(out, &felem); - indent(out) << prefix << ".add(" << elem << ");" << endl; + indent(out) << prefix << ".add(" << elem << ");" << '\n'; } /** @@ -2496,7 +2494,7 @@ void t_haxe_generator::generate_serialize_field(ostream& out, t_field* tfield, s } else if (type->is_enum()) { out << "writeI32(" << name << ");"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n", prefix.c_str(), @@ -2513,7 +2511,7 @@ void t_haxe_generator::generate_serialize_field(ostream& out, t_field* tfield, s */ void t_haxe_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) { (void)tstruct; - out << indent() << prefix << ".write(oprot);" << endl; + out << indent() << prefix << ".write(oprot);" << '\n'; } /** @@ -2527,30 +2525,30 @@ void t_haxe_generator::generate_serialize_container(ostream& out, t_type* ttype, if (ttype->is_map()) { string iter = tmp("_key"); string counter = tmp("_sizeCounter"); - indent(out) << "var " << counter << " : Int = 0;" << endl; - indent(out) << "for( " << iter << " in " << prefix << ") {" << endl; - indent(out) << " " << counter << +"++;" << endl; - indent(out) << "}" << endl; + indent(out) << "var " << counter << " : Int = 0;" << '\n'; + indent(out) << "for( " << iter << " in " << prefix << ") {" << '\n'; + indent(out) << " " << counter << +"++;" << '\n'; + indent(out) << "}" << '\n'; indent(out) << "oprot.writeMapBegin(new TMap(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << counter << "));" - << endl; + << '\n'; } else if (ttype->is_set()) { indent(out) << "oprot.writeSetBegin(new TSet(" << type_to_enum(((t_set*)ttype)->get_elem_type()) - << ", " << prefix << ".size));" << endl; + << ", " << prefix << ".size));" << '\n'; } else if (ttype->is_list()) { indent(out) << "oprot.writeListBegin(new TList(" << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << prefix << ".length));" - << endl; + << '\n'; } string iter = tmp("elem"); if (ttype->is_map()) { - indent(out) << "for( " << iter << " in " << prefix << ".keys())" << endl; + indent(out) << "for( " << iter << " in " << prefix << ".keys())" << '\n'; } else if (ttype->is_set()) { - indent(out) << "for( " << iter << " in " << prefix << ".toArray())" << endl; + indent(out) << "for( " << iter << " in " << prefix << ".toArray())" << '\n'; } else if (ttype->is_list()) { - indent(out) << "for( " << iter << " in " << prefix << ")" << endl; + indent(out) << "for( " << iter << " in " << prefix << ")" << '\n'; } scope_up(out); @@ -2566,11 +2564,11 @@ void t_haxe_generator::generate_serialize_container(ostream& out, t_type* ttype, scope_down(out); if (ttype->is_map()) { - indent(out) << "oprot.writeMapEnd();" << endl; + indent(out) << "oprot.writeMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "oprot.writeSetEnd();" << endl; + indent(out) << "oprot.writeSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "oprot.writeListEnd();" << endl; + indent(out) << "oprot.writeListEnd();" << '\n'; } } @@ -3006,7 +3004,7 @@ string t_haxe_generator::constant_name(string name) { */ void t_haxe_generator::generate_rtti_decoration(ostream& out) { if (rtti_) { - out << "@:rtti" << endl; + out << "@:rtti" << '\n'; } } @@ -3015,10 +3013,10 @@ void t_haxe_generator::generate_rtti_decoration(ostream& out) { */ void t_haxe_generator::generate_macro_decoration(ostream& out) { if (!buildmacro_.empty()) { - out << "#if ! macro" << endl; - out << "@:build( " << buildmacro_ << ")" << endl; // current class/interface - out << "@:autoBuild( " << buildmacro_ << ")" << endl; // inherited classes/interfaces - out << "#end" << endl; + out << "#if ! macro" << '\n'; + out << "@:build( " << buildmacro_ << ")" << '\n'; // current class/interface + out << "@:autoBuild( " << buildmacro_ << ")" << '\n'; // inherited classes/interfaces + out << "#end" << '\n'; } } @@ -3061,7 +3059,7 @@ std::string t_haxe_generator::generate_isset_check(std::string field_name) { void t_haxe_generator::generate_isset_set(ostream& out, t_field* field) { if (!type_can_be_null(field->get_type())) { - indent(out) << "this.__isset_" << field->get_name() << " = true;" << endl; + indent(out) << "this.__isset_" << field->get_name() << " = true;" << '\n'; } } diff --git a/compiler/cpp/src/thrift/generate/t_html_generator.cc b/compiler/cpp/src/thrift/generate/t_html_generator.cc index 15a0401d596..637cd885eff 100644 --- a/compiler/cpp/src/thrift/generate/t_html_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_html_generator.cc @@ -38,8 +38,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - enum input_type { INPUT_UNKNOWN, INPUT_UTF8, INPUT_PLAIN }; /** @@ -129,9 +127,9 @@ class t_html_generator : public t_generator { void t_html_generator::generate_program_toc() { f_out_ << "" - << "" << endl; + << "" << '\n'; generate_program_toc_row(program_); - f_out_ << "
ModuleServicesData typesConstants
Data typesConstants
" << endl; + f_out_ << "" << '\n'; } /** @@ -159,15 +157,15 @@ void t_html_generator::generate_program_toc_rows(t_program* tprog, */ void t_html_generator::generate_program_toc_row(t_program* tprog) { string fname = tprog->get_name() + ".html"; - f_out_ << "" << endl << "" << tprog->get_name() << ""; + f_out_ << "" << '\n' << "" << tprog->get_name() << ""; if (!tprog->get_services().empty()) { vector services = tprog->get_services(); vector::iterator sv_iter; for (sv_iter = services.begin(); sv_iter != services.end(); ++sv_iter) { string name = get_service_name(*sv_iter); f_out_ << "" << name - << "
" << endl; - f_out_ << "
    " << endl; + << "
    " << '\n'; + f_out_ << "
      " << '\n'; map fn_html; vector functions = (*sv_iter)->get_functions(); vector::iterator fn_iter; @@ -178,12 +176,12 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) { fn_html.insert(pair(fn_name, html)); } for (auto & html_iter : fn_html) { - f_out_ << html_iter.second << endl; + f_out_ << html_iter.second << '\n'; } - f_out_ << "
    " << endl; + f_out_ << "
" << '\n'; } } - f_out_ << "" << endl << ""; + f_out_ << "" << '\n' << ""; map data_types; if (!tprog->get_enums().empty()) { vector enums = tprog->get_enums(); @@ -191,7 +189,7 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) { for (en_iter = enums.begin(); en_iter != enums.end(); ++en_iter) { string name = (*en_iter)->get_name(); // f_out_ << "" << name - // << "
" << endl; + // << "
" << '\n'; string html = "" + name + ""; data_types.insert(pair(name, html)); } @@ -202,7 +200,7 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) { for (td_iter = typedefs.begin(); td_iter != typedefs.end(); ++td_iter) { string name = (*td_iter)->get_symbolic(); // f_out_ << "" << name - // << "
" << endl; + // << "
" << '\n'; string html = "" + name + ""; data_types.insert(pair(name, html)); @@ -214,16 +212,16 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) { for (o_iter = objects.begin(); o_iter != objects.end(); ++o_iter) { string name = (*o_iter)->get_name(); // f_out_ << "" << name - //<< "
" << endl; + //<< "
" << '\n'; string html = "" + name + ""; data_types.insert(pair(name, html)); } } for (auto & data_type : data_types) { - f_out_ << data_type.second << "
" << endl; + f_out_ << data_type.second << "
" << '\n'; } - f_out_ << "" << endl << ""; + f_out_ << "" << '\n' << ""; if (!tprog->get_consts().empty()) { map const_html; vector consts = tprog->get_consts(); @@ -235,10 +233,10 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) { const_html.insert(pair(name, html)); } for (auto & con_iter : const_html) { - f_out_ << con_iter.second << "
" << endl; + f_out_ << con_iter.second << "
" << '\n'; } } - f_out_ << "" << endl << ""; + f_out_ << "" << '\n' << ""; } /** @@ -251,30 +249,30 @@ void t_html_generator::generate_program() { current_file_ = program_->get_name() + ".html"; string fname = get_out_dir() + current_file_; f_out_.open(fname.c_str()); - f_out_ << "" << endl; - f_out_ << "" << endl; - f_out_ << "" << endl; - f_out_ << "" << endl; + f_out_ << "" << '\n'; + f_out_ << "" << '\n'; + f_out_ << "" << '\n'; + f_out_ << "" << '\n'; generate_style_tag(); - f_out_ << "Thrift module: " << program_->get_name() << "" << endl - << "
" << endl - << "

Thrift module: " << program_->get_name() << "

" << endl; + f_out_ << "Thrift module: " << program_->get_name() << "" << '\n' + << "
" << '\n' + << "

Thrift module: " << program_->get_name() << "

" << '\n'; print_doc(program_); generate_program_toc(); if (!program_->get_consts().empty()) { - f_out_ << "

Constants

" << endl; + f_out_ << "

Constants

" << '\n'; vector consts = program_->get_consts(); f_out_ << ""; - f_out_ << "" << endl; + f_out_ << "" << '\n'; generate_consts(consts); f_out_ << "
ConstantTypeValue
ConstantTypeValue
"; } if (!program_->get_enums().empty()) { - f_out_ << "

Enumerations

" << endl; + f_out_ << "

Enumerations

" << '\n'; // Generate enums vector enums = program_->get_enums(); vector::iterator en_iter; @@ -284,7 +282,7 @@ void t_html_generator::generate_program() { } if (!program_->get_typedefs().empty()) { - f_out_ << "

Type declarations

" << endl; + f_out_ << "

Type declarations

" << '\n'; // Generate typedefs vector typedefs = program_->get_typedefs(); vector::iterator td_iter; @@ -294,7 +292,7 @@ void t_html_generator::generate_program() { } if (!program_->get_objects().empty()) { - f_out_ << "

Data structures

" << endl; + f_out_ << "

Data structures

" << '\n'; // Generate structs and exceptions in declared order vector objects = program_->get_objects(); vector::iterator o_iter; @@ -308,7 +306,7 @@ void t_html_generator::generate_program() { } if (!program_->get_services().empty()) { - f_out_ << "

Services

" << endl; + f_out_ << "

Services

" << '\n'; // Generate services vector services = program_->get_services(); vector::iterator sv_iter; @@ -318,7 +316,7 @@ void t_html_generator::generate_program() { } } - f_out_ << "
" << endl; + f_out_ << "
" << '\n'; f_out_.close(); generate_index(); @@ -332,17 +330,17 @@ void t_html_generator::generate_index() { current_file_ = "index.html"; string index_fname = get_out_dir() + current_file_; f_out_.open(index_fname.c_str()); - f_out_ << "" << endl << "" << endl; + f_out_ << "" << '\n' << "" << '\n'; generate_style_tag(); - f_out_ << "All Thrift declarations" << endl - << "
" << endl << "

All Thrift declarations

" << endl; + f_out_ << "All Thrift declarations" << '\n' + << "
" << '\n' << "

All Thrift declarations

" << '\n'; f_out_ << "" - << "" << endl; + << "" << '\n'; vector programs; generate_program_toc_rows(program_, programs); - f_out_ << "
ModuleServicesData typesConstants
Constants
" << endl; - f_out_ << "
" << endl; + f_out_ << "" << '\n'; + f_out_ << "
" << '\n'; f_out_.close(); } @@ -357,17 +355,17 @@ void t_html_generator::generate_css() { } void t_html_generator::generate_css_content(std::ostream& f_target) { - f_target << BOOTSTRAP_CSS() << endl; - f_target << "/* Auto-generated CSS for generated Thrift docs */" << endl; - f_target << "h3, h4 { margin-bottom: 6px; }" << endl; + f_target << BOOTSTRAP_CSS() << '\n'; + f_target << "/* Auto-generated CSS for generated Thrift docs */" << '\n'; + f_target << "h3, h4 { margin-bottom: 6px; }" << '\n'; f_target << "div.definition { border: 1px solid #CCC; margin-bottom: 10px; padding: 10px; }" - << endl; - f_target << "div.extends { margin: -0.5em 0 1em 5em }" << endl; - f_target << "td { vertical-align: top; }" << endl; - f_target << "table { empty-cells: show; }" << endl; - f_target << "code { line-height: 20px; }" << endl; + << '\n'; + f_target << "div.extends { margin: -0.5em 0 1em 5em }" << '\n'; + f_target << "td { vertical-align: top; }" << '\n'; + f_target << "table { empty-cells: show; }" << '\n'; + f_target << "code { line-height: 20px; }" << '\n'; f_target << ".table-bordered th, .table-bordered td { border-bottom: 1px solid #DDDDDD; }" - << endl; + << '\n'; } /** @@ -377,11 +375,11 @@ void t_html_generator::generate_css_content(std::ostream& f_target) { */ void t_html_generator::generate_style_tag() { if (!standalone_) { - f_out_ << "" << endl; + f_out_ << "" << '\n'; } else { - f_out_ << "" << endl; + f_out_ << "-->" << '\n'; } } @@ -856,14 +854,14 @@ void t_html_generator::print_fn_args_doc(t_function* tfunction) { if (has_docs) { arg_iter = args.begin(); f_out_ << "

get_name() - << "\">Parameters

" << endl; + << "\">Parameters" << '\n'; f_out_ << ""; f_out_ << ""; for (; arg_iter != args.end(); arg_iter++) { f_out_ << "" << endl; + f_out_ << "" << '\n'; } f_out_ << "
NameDescription
" << (*arg_iter)->get_name(); f_out_ << ""; f_out_ << escape_html((*arg_iter)->get_doc()); - f_out_ << "
"; } @@ -880,14 +878,14 @@ void t_html_generator::print_fn_args_doc(t_function* tfunction) { if (has_docs) { ex_iter = excepts.begin(); f_out_ << "

get_name() - << "\">Exceptions

" << endl; + << "\">Exceptions" << '\n'; f_out_ << ""; f_out_ << ""; for (; ex_iter != excepts.end(); ex_iter++) { f_out_ << "" << endl; + f_out_ << "" << '\n'; } f_out_ << "
TypeDescription
" << (*ex_iter)->get_type()->get_name(); f_out_ << ""; f_out_ << escape_html((*ex_iter)->get_doc()); - f_out_ << "
"; } @@ -902,12 +900,12 @@ void t_html_generator::print_fn_args_doc(t_function* tfunction) { void t_html_generator::generate_typedef(t_typedef* ttypedef) { string name = ttypedef->get_name(); f_out_ << "
"; - f_out_ << "

Typedef: " << name << "

" << endl; + f_out_ << "

Typedef: " << name << "

" << '\n'; f_out_ << "

Base type: "; print_type(ttypedef->get_type()); - f_out_ << "

" << endl; + f_out_ << "

" << '\n'; print_doc(ttypedef); - f_out_ << "
" << endl; + f_out_ << "" << '\n'; } /** @@ -918,21 +916,21 @@ void t_html_generator::generate_typedef(t_typedef* ttypedef) { void t_html_generator::generate_enum(t_enum* tenum) { string name = tenum->get_name(); f_out_ << "
"; - f_out_ << "

Enumeration: " << name << "

" << endl; + f_out_ << "

Enumeration: " << name << "

" << '\n'; print_doc(tenum); vector values = tenum->get_constants(); vector::iterator val_iter; - f_out_ << "
" << endl; + f_out_ << "
" << '\n'; for (val_iter = values.begin(); val_iter != values.end(); ++val_iter) { f_out_ << "" << endl; + f_out_ << "" << '\n'; } - f_out_ << "
"; f_out_ << (*val_iter)->get_name(); f_out_ << ""; f_out_ << (*val_iter)->get_value(); - f_out_ << "" << endl; + f_out_ << "" << '\n'; print_doc((*val_iter)); - f_out_ << "
" << endl; + f_out_ << "" << '\n'; } /** @@ -968,12 +966,12 @@ void t_html_generator::generate_struct(t_struct* tstruct) { } else { f_out_ << "Struct: "; } - f_out_ << name << "" << endl; + f_out_ << name << "" << '\n'; vector members = tstruct->get_members(); vector::iterator mem_iter = members.begin(); f_out_ << ""; f_out_ << "" << endl; + "th>" << '\n'; for (; mem_iter != members.end(); mem_iter++) { f_out_ << "" << endl; + f_out_ << "" << '\n'; } f_out_ << "
KeyFieldTypeDescriptionRequirednessDefault value
Default value
" << (*mem_iter)->get_key() << ""; f_out_ << (*mem_iter)->get_name(); @@ -996,7 +994,7 @@ void t_html_generator::generate_struct(t_struct* tstruct) { print_const_value((*mem_iter)->get_type(), default_val); f_out_ << ""; } - f_out_ << "

"; print_doc(tstruct); @@ -1018,7 +1016,7 @@ void t_html_generator::generate_xception(t_struct* txception) { * @param tservice The service definition */ void t_html_generator::generate_service(t_service* tservice) { - f_out_ << "

Service: " << service_name_ << "

" << endl; + f_out_ << "

Service: " << service_name_ << "

" << '\n'; if (tservice->get_extends()) { f_out_ << "
extends "; @@ -1032,7 +1030,7 @@ void t_html_generator::generate_service(t_service* tservice) { string fn_name = (*fn_iter)->get_name(); f_out_ << "
"; f_out_ << "

Function: " << service_name_ - << "." << fn_name << "

" << endl; + << "." << fn_name << "" << '\n'; f_out_ << "
";
     std::string::size_type offset = print_type((*fn_iter)->get_returntype());
     bool first = true;
@@ -1042,7 +1040,7 @@ void t_html_generator::generate_service(t_service* tservice) {
     vector::iterator arg_iter = args.begin();
     for (; arg_iter != args.end(); arg_iter++) {
       if (!first) {
-        f_out_ << "," << endl;
+        f_out_ << "," << '\n';
         for (std::string::size_type i = 0; i < offset; ++i) {
           f_out_ << " ";
         }
@@ -1055,7 +1053,7 @@ void t_html_generator::generate_service(t_service* tservice) {
         print_const_value((*arg_iter)->get_type(), (*arg_iter)->get_value());
       }
     }
-    f_out_ << ")" << endl;
+    f_out_ << ")" << '\n';
     first = true;
     vector excepts = (*fn_iter)->get_xceptions()->get_members();
     vector::iterator ex_iter = excepts.begin();
@@ -1068,7 +1066,7 @@ void t_html_generator::generate_service(t_service* tservice) {
         first = false;
         print_type((*ex_iter)->get_type());
       }
-      f_out_ << endl;
+      f_out_ << '\n';
     }
     f_out_ << "
"; print_doc(*fn_iter); diff --git a/compiler/cpp/src/thrift/generate/t_java_generator.cc b/compiler/cpp/src/thrift/generate/t_java_generator.cc index 1985a3d8494..e81744e07b0 100644 --- a/compiler/cpp/src/thrift/generate/t_java_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_java_generator.cc @@ -45,8 +45,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - static const string thrift_option_class = "org.apache.thrift.Option"; static const string jdk_option_class = "java.util.Optional"; @@ -511,8 +509,7 @@ string t_java_generator::java_package() { } string t_java_generator::java_suppressions() { - return "@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})" - + endl; + return "@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})\n"; } string t_java_generator::java_nullable_annotation() { @@ -567,7 +564,7 @@ void t_java_generator::generate_enum(t_enum* tenum) { f_enum.open(f_enum_name.c_str()); // Comment and package it - f_enum << autogen_comment() << java_package() << endl; + f_enum << autogen_comment() << java_package() << '\n'; generate_java_doc(f_enum, tenum); @@ -576,7 +573,7 @@ void t_java_generator::generate_enum(t_enum* tenum) { } if (is_deprecated) { - indent(f_enum) << "@Deprecated" << endl; + indent(f_enum) << "@Deprecated" << '\n'; } indent(f_enum) << "public enum " << tenum->get_name() << " implements org.apache.thrift.TEnum "; scope_up(f_enum); @@ -590,62 +587,62 @@ void t_java_generator::generate_enum(t_enum* tenum) { if (first) { first = false; } else { - f_enum << "," << endl; + f_enum << "," << '\n'; } generate_java_doc(f_enum, *c_iter); if (this->is_deprecated((*c_iter)->annotations_)) { - indent(f_enum) << "@Deprecated" << endl; + indent(f_enum) << "@Deprecated" << '\n'; } indent(f_enum) << (*c_iter)->get_name() << "(" << value << ")"; } - f_enum << ";" << endl << endl; + f_enum << ";" << '\n' << '\n'; // Field for thriftCode - indent(f_enum) << "private final int value;" << endl << endl; + indent(f_enum) << "private final int value;" << '\n' << '\n'; - indent(f_enum) << "private " << tenum->get_name() << "(int value) {" << endl; - indent(f_enum) << " this.value = value;" << endl; - indent(f_enum) << "}" << endl << endl; + indent(f_enum) << "private " << tenum->get_name() << "(int value) {" << '\n'; + indent(f_enum) << " this.value = value;" << '\n'; + indent(f_enum) << "}" << '\n' << '\n'; - indent(f_enum) << "/**" << endl; + indent(f_enum) << "/**" << '\n'; indent(f_enum) << " * Get the integer value of this enum value, as defined in the Thrift IDL." - << endl; - indent(f_enum) << " */" << endl; - indent(f_enum) << java_override_annotation() << endl; - indent(f_enum) << "public int getValue() {" << endl; - indent(f_enum) << " return value;" << endl; - indent(f_enum) << "}" << endl << endl; - - indent(f_enum) << "/**" << endl; + << '\n'; + indent(f_enum) << " */" << '\n'; + indent(f_enum) << java_override_annotation() << '\n'; + indent(f_enum) << "public int getValue() {" << '\n'; + indent(f_enum) << " return value;" << '\n'; + indent(f_enum) << "}" << '\n' << '\n'; + + indent(f_enum) << "/**" << '\n'; indent(f_enum) << " * Find a the enum type by its integer value, as defined in the Thrift IDL." - << endl; - indent(f_enum) << " * @return null if the value is not found." << endl; - indent(f_enum) << " */" << endl; - indent(f_enum) << java_nullable_annotation() << endl; - indent(f_enum) << "public static " + tenum->get_name() + " findByValue(int value) { " << endl; + << '\n'; + indent(f_enum) << " * @return null if the value is not found." << '\n'; + indent(f_enum) << " */" << '\n'; + indent(f_enum) << java_nullable_annotation() << '\n'; + indent(f_enum) << "public static " + tenum->get_name() + " findByValue(int value) { " << '\n'; indent_up(); - indent(f_enum) << "switch (value) {" << endl; + indent(f_enum) << "switch (value) {" << '\n'; indent_up(); for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { int value = (*c_iter)->get_value(); - indent(f_enum) << "case " << value << ":" << endl; - indent(f_enum) << " return " << (*c_iter)->get_name() << ";" << endl; + indent(f_enum) << "case " << value << ":" << '\n'; + indent(f_enum) << " return " << (*c_iter)->get_name() << ";" << '\n'; } - indent(f_enum) << "default:" << endl; - indent(f_enum) << " return null;" << endl; + indent(f_enum) << "default:" << '\n'; + indent(f_enum) << " return null;" << '\n'; indent_down(); - indent(f_enum) << "}" << endl; + indent(f_enum) << "}" << '\n'; indent_down(); - indent(f_enum) << "}" << endl; + indent(f_enum) << "}" << '\n'; scope_down(f_enum); @@ -667,8 +664,8 @@ void t_java_generator::generate_consts(std::vector consts) { // Print header f_consts << autogen_comment() << java_package() << java_suppressions(); - f_consts << "public class " << make_valid_java_identifier(program_name_) << "Constants {" << endl - << endl; + f_consts << "public class " << make_valid_java_identifier(program_name_) << "Constants {" << '\n' + << '\n'; indent_up(); vector::iterator c_iter; for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { @@ -677,7 +674,7 @@ void t_java_generator::generate_consts(std::vector consts) { (*c_iter)->get_value(), false); } indent_down(); - indent(f_consts) << "}" << endl; + indent(f_consts) << "}" << '\n'; f_consts.close(); } @@ -700,9 +697,9 @@ void t_java_generator::print_const_value(std::ostream& out, } if (type->is_base_type()) { string v2 = render_const_value(out, type, value); - out << name << " = " << v2 << ";" << endl << endl; + out << name << " = " << v2 << ";" << '\n' << '\n'; } else if (type->is_enum()) { - out << name << " = " << render_const_value(out, type, value) << ";" << endl << endl; + out << name << " = " << render_const_value(out, type, value) << ";" << '\n' << '\n'; } else if (type->is_struct() || type->is_xception()) { const vector& unsorted_fields = ((t_struct*)type)->get_members(); vector fields = unsorted_fields; @@ -710,9 +707,9 @@ void t_java_generator::print_const_value(std::ostream& out, vector::const_iterator f_iter; const map& val = value->get_map(); map::const_iterator v_iter; - out << name << " = new " << type_name(type, false, true) << "();" << endl; + out << name << " = new " << type_name(type, false, true) << "();" << '\n'; if (!in_static) { - indent(out) << "static {" << endl; + indent(out) << "static {" << '\n'; indent_up(); } for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { @@ -728,22 +725,22 @@ void t_java_generator::print_const_value(std::ostream& out, string val = render_const_value(out, field_type, v_iter->second); indent(out) << name << "."; std::string cap_name = get_cap_name(v_iter->first->get_string()); - out << "set" << cap_name << "(" << val << ");" << endl; + out << "set" << cap_name << "(" << val << ");" << '\n'; } if (!in_static) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } - out << endl; + out << '\n'; } else if (type->is_map()) { std::string constructor_args; if (is_enum_map(type)) { constructor_args = inner_enum_type_name(type); } out << name << " = new " << type_name(type, false, true) << "(" << constructor_args << ");" - << endl; + << '\n'; if (!in_static) { - indent(out) << "static {" << endl; + indent(out) << "static {" << '\n'; indent_up(); } t_type* ktype = ((t_map*)type)->get_key_type(); @@ -753,22 +750,22 @@ void t_java_generator::print_const_value(std::ostream& out, for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string key = render_const_value(out, ktype, v_iter->first); string val = render_const_value(out, vtype, v_iter->second); - indent(out) << name << ".put(" << key << ", " << val << ");" << endl; + indent(out) << name << ".put(" << key << ", " << val << ");" << '\n'; } if (!in_static) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } - out << endl; + out << '\n'; } else if (type->is_list() || type->is_set()) { if (is_enum_set(type)) { out << name << " = " << type_name(type, false, true, true) << ".noneOf(" - << inner_enum_type_name(type) << ");" << endl; + << inner_enum_type_name(type) << ");" << '\n'; } else { - out << name << " = new " << type_name(type, false, true) << "();" << endl; + out << name << " = new " << type_name(type, false, true) << "();" << '\n'; } if (!in_static) { - indent(out) << "static {" << endl; + indent(out) << "static {" << '\n'; indent_up(); } t_type* etype; @@ -781,13 +778,13 @@ void t_java_generator::print_const_value(std::ostream& out, vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string val = render_const_value(out, etype, *v_iter); - indent(out) << name << ".add(" << val << ");" << endl; + indent(out) << name << ".add(" << val << ");" << '\n'; } if (!in_static) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } - out << endl; + out << '\n'; } else { throw "compiler error: no const of type " + type->get_name(); } @@ -916,7 +913,7 @@ void t_java_generator::generate_java_union(t_struct* tstruct) { } if (is_deprecated) { - indent(f_struct) << "@Deprecated" << endl; + indent(f_struct) << "@Deprecated" << '\n'; } indent(f_struct) << "public " << (is_final ? "final " : "") << "class " << make_valid_java_identifier(tstruct->get_name()) << " extends org.apache.thrift.TUnion<" << make_valid_java_identifier(tstruct->get_name()) << ", " @@ -927,49 +924,49 @@ void t_java_generator::generate_java_union(t_struct* tstruct) { generate_struct_desc(f_struct, tstruct); generate_field_descs(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_field_name_constants(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_java_meta_data_map(f_struct, tstruct); generate_union_constructor(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_union_abstract_methods(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_java_struct_field_by_id(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_union_getters_and_setters(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_union_is_set_methods(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_union_comparisons(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_union_hashcode(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_java_struct_write_object(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_java_struct_read_object(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; scope_down(f_struct); @@ -980,63 +977,63 @@ void t_java_generator::generate_union_constructor(ostream& out, t_struct* tstruc const vector& members = tstruct->get_members(); vector::const_iterator m_iter; - indent(out) << "public " << type_name(tstruct) << "() {" << endl; + indent(out) << "public " << type_name(tstruct) << "() {" << '\n'; indent_up(); bool default_value = false; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_type* type = get_true_type((*m_iter)->get_type()); if ((*m_iter)->get_value() != nullptr) { indent(out) << "super(_Fields." << constant_name((*m_iter)->get_name()) << ", " - << render_const_value(out, type, (*m_iter)->get_value()) << ");" << endl; + << render_const_value(out, type, (*m_iter)->get_value()) << ");" << '\n'; default_value = true; break; } } if (default_value == false) { - indent(out) << "super();" << endl; + indent(out) << "super();" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; indent(out) << "public " << type_name(tstruct) << "(_Fields setField, java.lang.Object value) {" - << endl; - indent(out) << " super(setField, value);" << endl; - indent(out) << "}" << endl << endl; + << '\n'; + indent(out) << " super(setField, value);" << '\n'; + indent(out) << "}" << '\n' << '\n'; indent(out) << "public " << type_name(tstruct) << "(" << type_name(tstruct) << " other) {" - << endl; - indent(out) << " super(other);" << endl; - indent(out) << "}" << endl; + << '\n'; + indent(out) << " super(other);" << '\n'; + indent(out) << "}" << '\n'; - indent(out) << java_override_annotation() << endl; - indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << " deepCopy() {" << endl; - indent(out) << " return new " << tstruct->get_name() << "(this);" << endl; - indent(out) << "}" << endl << endl; + indent(out) << java_override_annotation() << '\n'; + indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << " deepCopy() {" << '\n'; + indent(out) << " return new " << tstruct->get_name() << "(this);" << '\n'; + indent(out) << "}" << '\n' << '\n'; // generate "constructors" for each field for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_type* type = (*m_iter)->get_type(); indent(out) << "public static " << type_name(tstruct) << " " << (*m_iter)->get_name() << "(" - << type_name(type) << " value) {" << endl; - indent(out) << " " << type_name(tstruct) << " x = new " << type_name(tstruct) << "();" << endl; - indent(out) << " x.set" << get_cap_name((*m_iter)->get_name()) << "(value);" << endl; - indent(out) << " return x;" << endl; - indent(out) << "}" << endl << endl; + << type_name(type) << " value) {" << '\n'; + indent(out) << " " << type_name(tstruct) << " x = new " << type_name(tstruct) << "();" << '\n'; + indent(out) << " x.set" << get_cap_name((*m_iter)->get_name()) << "(value);" << '\n'; + indent(out) << " return x;" << '\n'; + indent(out) << "}" << '\n' << '\n'; if (type->is_binary()) { indent(out) << "public static " << type_name(tstruct) << " " << (*m_iter)->get_name() - << "(byte[] value) {" << endl; + << "(byte[] value) {" << '\n'; indent(out) << " " << type_name(tstruct) << " x = new " << type_name(tstruct) << "();" - << endl; + << '\n'; indent(out) << " x.set" << get_cap_name((*m_iter)->get_name()); if (unsafe_binaries_) { - indent(out) << "(java.nio.ByteBuffer.wrap(value));" << endl; + indent(out) << "(java.nio.ByteBuffer.wrap(value));" << '\n'; } else { - indent(out) << "(java.nio.ByteBuffer.wrap(value.clone()));" << endl; + indent(out) << "(java.nio.ByteBuffer.wrap(value.clone()));" << '\n'; } - indent(out) << " return x;" << endl; - indent(out) << "}" << endl << endl; + indent(out) << " return x;" << '\n'; + indent(out) << "}" << '\n' << '\n'; } } } @@ -1050,7 +1047,7 @@ void t_java_generator::generate_union_getters_and_setters(ostream& out, t_struct if (first) { first = false; } else { - out << endl; + out << '\n'; } t_field* field = (*m_iter); @@ -1061,95 +1058,95 @@ void t_java_generator::generate_union_getters_and_setters(ostream& out, t_struct generate_java_doc(out, field); if (type->is_binary()) { if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } - indent(out) << "public byte[] get" << cap_name << "() {" << endl; + indent(out) << "public byte[] get" << cap_name << "() {" << '\n'; indent(out) << " set" << cap_name << "(org.apache.thrift.TBaseHelper.rightSize(buffer" - << get_cap_name("for") << cap_name << "()));" << endl; + << get_cap_name("for") << cap_name << "()));" << '\n'; indent(out) << " java.nio.ByteBuffer b = buffer" << get_cap_name("for") << cap_name << "();" - << endl; - indent(out) << " return b == null ? null : b.array();" << endl; - indent(out) << "}" << endl; + << '\n'; + indent(out) << " return b == null ? null : b.array();" << '\n'; + indent(out) << "}" << '\n'; - out << endl; + out << '\n'; indent(out) << "public java.nio.ByteBuffer buffer" << get_cap_name("for") - << get_cap_name(field->get_name()) << "() {" << endl; + << get_cap_name(field->get_name()) << "() {" << '\n'; indent(out) << " if (getSetField() == _Fields." << constant_name(field->get_name()) << ") {" - << endl; + << '\n'; if (unsafe_binaries_) { - indent(out) << " return (java.nio.ByteBuffer)getFieldValue();" << endl; + indent(out) << " return (java.nio.ByteBuffer)getFieldValue();" << '\n'; } else { indent(out) << " return " "org.apache.thrift.TBaseHelper.copyBinary((java.nio.ByteBuffer)getFieldValue());" - << endl; + << '\n'; } - indent(out) << " } else {" << endl; + indent(out) << " } else {" << '\n'; indent(out) << " throw new java.lang.RuntimeException(\"Cannot get field '" << field->get_name() << "' because union is currently set to \" + getFieldDesc(getSetField()).name);" - << endl; - indent(out) << " }" << endl; - indent(out) << "}" << endl; + << '\n'; + indent(out) << " }" << '\n'; + indent(out) << "}" << '\n'; } else { if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } indent(out) << "public " << type_name(field->get_type()) << " get" - << get_cap_name(field->get_name()) << "() {" << endl; + << get_cap_name(field->get_name()) << "() {" << '\n'; indent(out) << " if (getSetField() == _Fields." << constant_name(field->get_name()) << ") {" - << endl; + << '\n'; indent(out) << " return (" << type_name(field->get_type(), true) << ")getFieldValue();" - << endl; - indent(out) << " } else {" << endl; + << '\n'; + indent(out) << " } else {" << '\n'; indent(out) << " throw new java.lang.RuntimeException(\"Cannot get field '" << field->get_name() << "' because union is currently set to \" + getFieldDesc(getSetField()).name);" - << endl; - indent(out) << " }" << endl; - indent(out) << "}" << endl; + << '\n'; + indent(out) << " }" << '\n'; + indent(out) << "}" << '\n'; } - out << endl; + out << '\n'; generate_java_doc(out, field); if (type->is_binary()) { if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } indent(out) << "public void set" << get_cap_name(field->get_name()) << "(byte[] value) {" - << endl; + << '\n'; indent(out) << " set" << get_cap_name(field->get_name()); if (unsafe_binaries_) { - indent(out) << "(java.nio.ByteBuffer.wrap(value));" << endl; + indent(out) << "(java.nio.ByteBuffer.wrap(value));" << '\n'; } else { - indent(out) << "(java.nio.ByteBuffer.wrap(value.clone()));" << endl; + indent(out) << "(java.nio.ByteBuffer.wrap(value.clone()));" << '\n'; } - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; - out << endl; + out << '\n'; } if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } indent(out) << "public void set" << get_cap_name(field->get_name()) << "(" - << type_name(field->get_type()) << " value) {" << endl; + << type_name(field->get_type()) << " value) {" << '\n'; - indent(out) << " setField_ = _Fields." << constant_name(field->get_name()) << ";" << endl; + indent(out) << " setField_ = _Fields." << constant_name(field->get_name()) << ";" << '\n'; if (type_can_be_null(field->get_type())) { indent(out) << " value_ = java.util.Objects.requireNonNull(value,\"" - << "_Fields." << constant_name(field->get_name()) << "\");" << endl; + << "_Fields." << constant_name(field->get_name()) << "\");" << '\n'; } else { - indent(out) << " value_ = value;" << endl; + indent(out) << " value_ = value;" << '\n'; } - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } @@ -1162,49 +1159,49 @@ void t_java_generator::generate_union_is_set_methods(ostream& out, t_struct* tst if (first) { first = false; } else { - out << endl; + out << '\n'; } std::string field_name = (*m_iter)->get_name(); indent(out) << "public boolean is" << get_cap_name("set") << get_cap_name(field_name) << "() {" - << endl; + << '\n'; indent_up(); - indent(out) << "return setField_ == _Fields." << constant_name(field_name) << ";" << endl; + indent(out) << "return setField_ == _Fields." << constant_name(field_name) << ";" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } } void t_java_generator::generate_union_abstract_methods(ostream& out, t_struct* tstruct) { generate_check_type(out, tstruct); - out << endl; + out << '\n'; generate_standard_scheme_read_value(out, tstruct); - out << endl; + out << '\n'; generate_standard_scheme_write_value(out, tstruct); - out << endl; + out << '\n'; generate_tuple_scheme_read_value(out, tstruct); - out << endl; + out << '\n'; generate_tuple_scheme_write_value(out, tstruct); - out << endl; + out << '\n'; generate_get_field_desc(out, tstruct); - out << endl; + out << '\n'; generate_get_struct_desc(out, tstruct); - out << endl; - indent(out) << java_override_annotation() << endl; - indent(out) << "protected _Fields enumForId(short id) {" << endl; - indent(out) << " return _Fields.findByThriftIdOrThrow(id);" << endl; - indent(out) << "}" << endl; + out << '\n'; + indent(out) << java_override_annotation() << '\n'; + indent(out) << "protected _Fields enumForId(short id) {" << '\n'; + indent(out) << " return _Fields.findByThriftIdOrThrow(id);" << '\n'; + indent(out) << "}" << '\n'; } void t_java_generator::generate_check_type(ostream& out, t_struct* tstruct) { - indent(out) << java_override_annotation() << endl; + indent(out) << java_override_annotation() << '\n'; indent(out) << "protected void checkType(_Fields setField, java.lang.Object value) throws " "java.lang.ClassCastException {" - << endl; + << '\n'; indent_up(); - indent(out) << "switch (setField) {" << endl; + indent(out) << "switch (setField) {" << '\n'; indent_up(); const vector& members = tstruct->get_members(); @@ -1213,42 +1210,42 @@ void t_java_generator::generate_check_type(ostream& out, t_struct* tstruct) { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* field = (*m_iter); - indent(out) << "case " << constant_name(field->get_name()) << ":" << endl; + indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n'; indent(out) << " if (value instanceof " << type_name(field->get_type(), true, false, true) - << ") {" << endl; - indent(out) << " break;" << endl; - indent(out) << " }" << endl; + << ") {" << '\n'; + indent(out) << " break;" << '\n'; + indent(out) << " }" << '\n'; indent(out) << " throw new java.lang.ClassCastException(\"Was expecting value of type " << type_name(field->get_type(), true, false) << " for field '" << field->get_name() - << "', but got \" + value.getClass().getSimpleName());" << endl; + << "', but got \" + value.getClass().getSimpleName());" << '\n'; // do the real check here } - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent(out) << " throw new java.lang.IllegalArgumentException(\"Unknown field id \" + setField);" - << endl; + << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_java_generator::generate_standard_scheme_read_value(ostream& out, t_struct* tstruct) { - indent(out) << java_override_annotation() << endl; + indent(out) << java_override_annotation() << '\n'; indent(out) << "protected java.lang.Object standardSchemeReadValue(org.apache.thrift.protocol.TProtocol " "iprot, org.apache.thrift.protocol.TField field) throws " "org.apache.thrift.TException {" - << endl; + << '\n'; indent_up(); - indent(out) << "_Fields setField = _Fields.findByThriftId(field.id);" << endl; - indent(out) << "if (setField != null) {" << endl; + indent(out) << "_Fields setField = _Fields.findByThriftId(field.id);" << '\n'; + indent(out) << "if (setField != null) {" << '\n'; indent_up(); - indent(out) << "switch (setField) {" << endl; + indent(out) << "switch (setField) {" << '\n'; indent_up(); const vector& members = tstruct->get_members(); @@ -1257,53 +1254,53 @@ void t_java_generator::generate_standard_scheme_read_value(ostream& out, t_struc for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* field = (*m_iter); - indent(out) << "case " << constant_name(field->get_name()) << ":" << endl; + indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n'; indent_up(); indent(out) << "if (field.type == " << constant_name(field->get_name()) << "_FIELD_DESC.type) {" - << endl; + << '\n'; indent_up(); indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << ";" - << endl; + << '\n'; generate_deserialize_field(out, field, ""); - indent(out) << "return " << field->get_name() << ";" << endl; + indent(out) << "return " << field->get_name() << ";" << '\n'; indent_down(); - indent(out) << "} else {" << endl; - indent(out) << " org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);" << endl; - indent(out) << " return null;" << endl; - indent(out) << "}" << endl; + indent(out) << "} else {" << '\n'; + indent(out) << " org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);" << '\n'; + indent(out) << " return null;" << '\n'; + indent(out) << "}" << '\n'; indent_down(); } - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent(out) << " throw new java.lang.IllegalStateException(\"setField wasn't null, but didn't match any " "of the case statements!\");" - << endl; + << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "} else {" << endl; + indent(out) << "} else {" << '\n'; indent_up(); - indent(out) << "org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);" << endl; - indent(out) << "return null;" << endl; + indent(out) << "org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);" << '\n'; + indent(out) << "return null;" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_java_generator::generate_standard_scheme_write_value(ostream& out, t_struct* tstruct) { - indent(out) << java_override_annotation() << endl; + indent(out) << java_override_annotation() << '\n'; indent(out) << "protected void standardSchemeWriteValue(org.apache.thrift.protocol.TProtocol " "oprot) throws org.apache.thrift.TException {" - << endl; + << '\n'; indent_up(); - indent(out) << "switch (setField_) {" << endl; + indent(out) << "switch (setField_) {" << '\n'; indent_up(); const vector& members = tstruct->get_members(); @@ -1312,42 +1309,42 @@ void t_java_generator::generate_standard_scheme_write_value(ostream& out, t_stru for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* field = (*m_iter); - indent(out) << "case " << constant_name(field->get_name()) << ":" << endl; + indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n'; indent_up(); indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << " = (" - << type_name(field->get_type(), true, false) << ")value_;" << endl; + << type_name(field->get_type(), true, false) << ")value_;" << '\n'; generate_serialize_field(out, field); - indent(out) << "return;" << endl; + indent(out) << "return;" << '\n'; indent_down(); } - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent(out) << " throw new java.lang.IllegalStateException(\"Cannot write union with unknown field \" + " "setField_);" - << endl; + << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_java_generator::generate_tuple_scheme_read_value(ostream& out, t_struct* tstruct) { - indent(out) << java_override_annotation() << endl; + indent(out) << java_override_annotation() << '\n'; indent(out) << "protected java.lang.Object tupleSchemeReadValue(org.apache.thrift.protocol.TProtocol " "iprot, short fieldID) throws org.apache.thrift.TException {" - << endl; + << '\n'; indent_up(); - indent(out) << "_Fields setField = _Fields.findByThriftId(fieldID);" << endl; - indent(out) << "if (setField != null) {" << endl; + indent(out) << "_Fields setField = _Fields.findByThriftId(fieldID);" << '\n'; + indent(out) << "if (setField != null) {" << '\n'; indent_up(); - indent(out) << "switch (setField) {" << endl; + indent(out) << "switch (setField) {" << '\n'; indent_up(); const vector& members = tstruct->get_members(); @@ -1356,45 +1353,45 @@ void t_java_generator::generate_tuple_scheme_read_value(ostream& out, t_struct* for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* field = (*m_iter); - indent(out) << "case " << constant_name(field->get_name()) << ":" << endl; + indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n'; indent_up(); indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << ";" - << endl; + << '\n'; generate_deserialize_field(out, field, ""); - indent(out) << "return " << field->get_name() << ";" << endl; + indent(out) << "return " << field->get_name() << ";" << '\n'; indent_down(); } - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent(out) << " throw new java.lang.IllegalStateException(\"setField wasn't null, but didn't match any " "of the case statements!\");" - << endl; + << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "} else {" << endl; + indent(out) << "} else {" << '\n'; indent_up(); indent(out) << "throw new org.apache.thrift.protocol.TProtocolException(\"Couldn't find a field " "with field id \" + fieldID);" - << endl; + << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_java_generator::generate_tuple_scheme_write_value(ostream& out, t_struct* tstruct) { - indent(out) << java_override_annotation() << endl; + indent(out) << java_override_annotation() << '\n'; indent(out) << "protected void tupleSchemeWriteValue(org.apache.thrift.protocol.TProtocol oprot) " "throws org.apache.thrift.TException {" - << endl; + << '\n'; indent_up(); - indent(out) << "switch (setField_) {" << endl; + indent(out) << "switch (setField_) {" << '\n'; indent_up(); const vector& members = tstruct->get_members(); @@ -1403,119 +1400,119 @@ void t_java_generator::generate_tuple_scheme_write_value(ostream& out, t_struct* for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* field = (*m_iter); - indent(out) << "case " << constant_name(field->get_name()) << ":" << endl; + indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n'; indent_up(); indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << " = (" - << type_name(field->get_type(), true, false) << ")value_;" << endl; + << type_name(field->get_type(), true, false) << ")value_;" << '\n'; generate_serialize_field(out, field); - indent(out) << "return;" << endl; + indent(out) << "return;" << '\n'; indent_down(); } - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent(out) << " throw new java.lang.IllegalStateException(\"Cannot write union with unknown field \" + " "setField_);" - << endl; + << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_java_generator::generate_get_field_desc(ostream& out, t_struct* tstruct) { - indent(out) << java_override_annotation() << endl; + indent(out) << java_override_annotation() << '\n'; indent(out) << "protected org.apache.thrift.protocol.TField getFieldDesc(_Fields setField) {" - << endl; + << '\n'; indent_up(); const vector& members = tstruct->get_members(); vector::const_iterator m_iter; - indent(out) << "switch (setField) {" << endl; + indent(out) << "switch (setField) {" << '\n'; indent_up(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* field = (*m_iter); - indent(out) << "case " << constant_name(field->get_name()) << ":" << endl; - indent(out) << " return " << constant_name(field->get_name()) << "_FIELD_DESC;" << endl; + indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n'; + indent(out) << " return " << constant_name(field->get_name()) << "_FIELD_DESC;" << '\n'; } - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent(out) << " throw new java.lang.IllegalArgumentException(\"Unknown field id \" + setField);" - << endl; + << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_java_generator::generate_get_struct_desc(ostream& out, t_struct* tstruct) { (void)tstruct; - indent(out) << java_override_annotation() << endl; - indent(out) << "protected org.apache.thrift.protocol.TStruct getStructDesc() {" << endl; - indent(out) << " return STRUCT_DESC;" << endl; - indent(out) << "}" << endl; + indent(out) << java_override_annotation() << '\n'; + indent(out) << "protected org.apache.thrift.protocol.TStruct getStructDesc() {" << '\n'; + indent(out) << " return STRUCT_DESC;" << '\n'; + indent(out) << "}" << '\n'; } void t_java_generator::generate_union_comparisons(ostream& out, t_struct* tstruct) { // equality - indent(out) << "public boolean equals(java.lang.Object other) {" << endl; - indent(out) << " if (other instanceof " << make_valid_java_identifier(tstruct->get_name()) << ") {" << endl; - indent(out) << " return equals((" << make_valid_java_identifier(tstruct->get_name()) << ")other);" << endl; - indent(out) << " } else {" << endl; - indent(out) << " return false;" << endl; - indent(out) << " }" << endl; - indent(out) << "}" << endl; + indent(out) << "public boolean equals(java.lang.Object other) {" << '\n'; + indent(out) << " if (other instanceof " << make_valid_java_identifier(tstruct->get_name()) << ") {" << '\n'; + indent(out) << " return equals((" << make_valid_java_identifier(tstruct->get_name()) << ")other);" << '\n'; + indent(out) << " } else {" << '\n'; + indent(out) << " return false;" << '\n'; + indent(out) << " }" << '\n'; + indent(out) << "}" << '\n'; - out << endl; + out << '\n'; - indent(out) << "public boolean equals(" << make_valid_java_identifier(tstruct->get_name()) << " other) {" << endl; + indent(out) << "public boolean equals(" << make_valid_java_identifier(tstruct->get_name()) << " other) {" << '\n'; indent(out) << " return other != null && getSetField() == other.getSetField() && " "getFieldValue().equals(other.getFieldValue());" - << endl; - indent(out) << "}" << endl; - out << endl; + << '\n'; + indent(out) << "}" << '\n'; + out << '\n'; - indent(out) << java_override_annotation() << endl; - indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << endl; + indent(out) << java_override_annotation() << '\n'; + indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << '\n'; indent(out) << " int lastComparison = org.apache.thrift.TBaseHelper.compareTo(getSetField(), " "other.getSetField());" - << endl; - indent(out) << " if (lastComparison == 0) {" << endl; + << '\n'; + indent(out) << " if (lastComparison == 0) {" << '\n'; indent(out) << " return org.apache.thrift.TBaseHelper.compareTo(getFieldValue(), " "other.getFieldValue());" - << endl; - indent(out) << " }" << endl; - indent(out) << " return lastComparison;" << endl; - indent(out) << "}" << endl; - out << endl; + << '\n'; + indent(out) << " }" << '\n'; + indent(out) << " return lastComparison;" << '\n'; + indent(out) << "}" << '\n'; + out << '\n'; } void t_java_generator::generate_union_hashcode(ostream& out, t_struct* tstruct) { (void)tstruct; - indent(out) << java_override_annotation() << endl; - indent(out) << "public int hashCode() {" << endl; + indent(out) << java_override_annotation() << '\n'; + indent(out) << "public int hashCode() {" << '\n'; indent(out) << " java.util.List list = new java.util.ArrayList();" - << endl; - indent(out) << " list.add(this.getClass().getName());" << endl; - indent(out) << " org.apache.thrift.TFieldIdEnum setField = getSetField();" << endl; - indent(out) << " if (setField != null) {" << endl; - indent(out) << " list.add(setField.getThriftFieldId());" << endl; - indent(out) << " java.lang.Object value = getFieldValue();" << endl; - indent(out) << " if (value instanceof org.apache.thrift.TEnum) {" << endl; - indent(out) << " list.add(((org.apache.thrift.TEnum)getFieldValue()).getValue());" << endl; - indent(out) << " } else {" << endl; - indent(out) << " list.add(value);" << endl; - indent(out) << " }" << endl; - indent(out) << " }" << endl; - indent(out) << " return list.hashCode();" << endl; + << '\n'; + indent(out) << " list.add(this.getClass().getName());" << '\n'; + indent(out) << " org.apache.thrift.TFieldIdEnum setField = getSetField();" << '\n'; + indent(out) << " if (setField != null) {" << '\n'; + indent(out) << " list.add(setField.getThriftFieldId());" << '\n'; + indent(out) << " java.lang.Object value = getFieldValue();" << '\n'; + indent(out) << " if (value instanceof org.apache.thrift.TEnum) {" << '\n'; + indent(out) << " list.add(((org.apache.thrift.TEnum)getFieldValue()).getValue());" << '\n'; + indent(out) << " } else {" << '\n'; + indent(out) << " list.add(value);" << '\n'; + indent(out) << " }" << '\n'; + indent(out) << " }" << '\n'; + indent(out) << " return list.hashCode();" << '\n'; indent(out) << "}"; } @@ -1545,7 +1542,7 @@ void t_java_generator::generate_java_struct_definition(ostream& out, } if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } indent(out) << "public " << (is_final ? "final " : "") << (in_class ? "static " : "") << "class " << make_valid_java_identifier(tstruct->get_name()) << " "; @@ -1571,15 +1568,15 @@ void t_java_generator::generate_java_struct_definition(ostream& out, const vector& members = tstruct->get_members(); vector::const_iterator m_iter; - out << endl; + out << '\n'; generate_field_descs(out, tstruct); - out << endl; + out << '\n'; generate_scheme_map(out, tstruct); - out << endl; + out << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if (bean_style_ || private_members_) { @@ -1588,10 +1585,10 @@ void t_java_generator::generate_java_struct_definition(ostream& out, generate_java_doc(out, *m_iter); indent(out) << "public "; } - out << declare_field(*m_iter, false, true) << endl; + out << declare_field(*m_iter, false, true) << '\n'; } - out << endl; + out << '\n'; if (android_style_) { generate_java_struct_parcelable(out, tstruct); @@ -1601,9 +1598,9 @@ void t_java_generator::generate_java_struct_definition(ostream& out, // isset data if (members.size() > 0) { - out << endl; + out << '\n'; - indent(out) << "// isset id assignments" << endl; + indent(out) << "// isset id assignments" << '\n'; int i = 0; int optionals = 0; @@ -1613,7 +1610,7 @@ void t_java_generator::generate_java_struct_definition(ostream& out, } if (!type_can_be_null((*m_iter)->get_type())) { indent(out) << "private static final int " << isset_field_id(*m_iter) << " = " << i << ";" - << endl; + << '\n'; i++; } } @@ -1623,11 +1620,11 @@ void t_java_generator::generate_java_struct_definition(ostream& out, case ISSET_NONE: break; case ISSET_PRIMITIVE: - indent(out) << "private " << primitiveType << " __isset_bitfield = 0;" << endl; + indent(out) << "private " << primitiveType << " __isset_bitfield = 0;" << '\n'; break; case ISSET_BITSET: indent(out) << "private java.util.BitSet __isset_bit_vector = new java.util.BitSet(" << i - << ");" << endl; + << ");" << '\n'; break; } @@ -1638,7 +1635,7 @@ void t_java_generator::generate_java_struct_definition(ostream& out, output_string = output_string + "_Fields." + constant_name((*m_iter)->get_name()) + ","; } } - indent(out) << output_string.substr(0, output_string.length() - 1) << "};" << endl; + indent(out) << output_string.substr(0, output_string.length() - 1) << "};" << '\n'; } } @@ -1647,7 +1644,7 @@ void t_java_generator::generate_java_struct_definition(ostream& out, bool all_optional_members = true; // Default constructor - indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << "() {" << endl; + indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << "() {" << '\n'; indent_up(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_type* t = get_true_type((*m_iter)->get_type()); @@ -1660,27 +1657,27 @@ void t_java_generator::generate_java_struct_definition(ostream& out, } } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; if (!members.empty() && !all_optional_members) { // Full constructor for all fields - indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << "(" << endl; + indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << "(" << '\n'; indent_up(); bool first = true; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() != t_field::T_OPTIONAL) { if (!first) { - out << "," << endl; + out << "," << '\n'; } first = false; indent(out) << type_name((*m_iter)->get_type()) << " " << make_valid_java_identifier((*m_iter)->get_name()); } } - out << ")" << endl; + out << ")" << '\n'; indent_down(); - indent(out) << "{" << endl; + indent(out) << "{" << '\n'; indent_up(); - indent(out) << "this();" << endl; + indent(out) << "this();" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() != t_field::T_OPTIONAL) { t_type* type = get_true_type((*m_iter)->get_type()); @@ -1688,44 +1685,44 @@ void t_java_generator::generate_java_struct_definition(ostream& out, if (unsafe_binaries_) { indent(out) << "this." << make_valid_java_identifier((*m_iter)->get_name()) << " = " << make_valid_java_identifier((*m_iter)->get_name()) << ";" - << endl; + << '\n'; } else { indent(out) << "this." << make_valid_java_identifier((*m_iter)->get_name()) << " = org.apache.thrift.TBaseHelper.copyBinary(" << make_valid_java_identifier((*m_iter)->get_name()) - << ");" << endl; + << ");" << '\n'; } } else { indent(out) << "this." << make_valid_java_identifier((*m_iter)->get_name()) << " = " << make_valid_java_identifier((*m_iter)->get_name()) << ";" - << endl; + << '\n'; } generate_isset_set(out, (*m_iter), ""); } } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } // copy constructor - indent(out) << "/**" << endl; - indent(out) << " * Performs a deep copy on other." << endl; - indent(out) << " */" << endl; + indent(out) << "/**" << '\n'; + indent(out) << " * Performs a deep copy on other." << '\n'; + indent(out) << " */" << '\n'; indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << "(" << make_valid_java_identifier(tstruct->get_name()) << " other) {" - << endl; + << '\n'; indent_up(); switch (needs_isset(tstruct)) { case ISSET_NONE: break; case ISSET_PRIMITIVE: - indent(out) << "__isset_bitfield = other.__isset_bitfield;" << endl; + indent(out) << "__isset_bitfield = other.__isset_bitfield;" << '\n'; break; case ISSET_BITSET: - indent(out) << "__isset_bit_vector.clear();" << endl; - indent(out) << "__isset_bit_vector.or(other.__isset_bit_vector);" << endl; + indent(out) << "__isset_bit_vector.clear();" << '\n'; + indent(out) << "__isset_bit_vector.or(other.__isset_bit_vector);" << '\n'; break; } @@ -1736,33 +1733,33 @@ void t_java_generator::generate_java_struct_definition(ostream& out, bool can_be_null = type_can_be_null(type); if (can_be_null) { - indent(out) << "if (other." << generate_isset_check(field) << ") {" << endl; + indent(out) << "if (other." << generate_isset_check(field) << ") {" << '\n'; indent_up(); } if (type->is_container()) { generate_deep_copy_container(out, "other", field_name, "__this__" + field_name, type); - indent(out) << "this." << make_valid_java_identifier(field_name) << " = __this__" << field_name << ";" << endl; + indent(out) << "this." << make_valid_java_identifier(field_name) << " = __this__" << field_name << ";" << '\n'; } else { indent(out) << "this." << make_valid_java_identifier(field_name) << " = "; generate_deep_copy_non_container(out, "other." + make_valid_java_identifier(field_name), field_name, type); - out << ";" << endl; + out << ";" << '\n'; } if (can_be_null) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; // clone method, so that you can deep copy an object when you don't know its class. - indent(out) << java_override_annotation() << endl; - indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << " deepCopy() {" << endl; - indent(out) << " return new " << make_valid_java_identifier(tstruct->get_name()) << "(this);" << endl; - indent(out) << "}" << endl << endl; + indent(out) << java_override_annotation() << '\n'; + indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << " deepCopy() {" << '\n'; + indent(out) << " return new " << make_valid_java_identifier(tstruct->get_name()) << "(this);" << '\n'; + indent(out) << "}" << '\n' << '\n'; generate_java_struct_clear(out, tstruct); @@ -1791,7 +1788,7 @@ void t_java_generator::generate_java_struct_definition(ostream& out, generate_java_scheme_lookup(out); scope_down(out); - out << endl; + out << '\n'; } /** @@ -1803,30 +1800,30 @@ void t_java_generator::generate_java_struct_parcelable(ostream& out, t_struct* t const vector& members = tstruct->get_members(); vector::const_iterator m_iter; - out << indent() << java_override_annotation() << endl - << indent() << "public void writeToParcel(android.os.Parcel out, int flags) {" << endl; + out << indent() << java_override_annotation() << '\n' + << indent() << "public void writeToParcel(android.os.Parcel out, int flags) {" << '\n'; indent_up(); string bitsetPrimitiveType = ""; switch (needs_isset(tstruct, &bitsetPrimitiveType)) { case ISSET_NONE: break; case ISSET_PRIMITIVE: - indent(out) << "//primitive bitfield of type: " << bitsetPrimitiveType << endl; + indent(out) << "//primitive bitfield of type: " << bitsetPrimitiveType << '\n'; if (bitsetPrimitiveType == "byte") { - indent(out) << "out.writeByte(__isset_bitfield);" << endl; + indent(out) << "out.writeByte(__isset_bitfield);" << '\n'; } else if (bitsetPrimitiveType == "short") { - indent(out) << "out.writeInt(new Short(__isset_bitfield).intValue());" << endl; + indent(out) << "out.writeInt(new Short(__isset_bitfield).intValue());" << '\n'; } else if (bitsetPrimitiveType == "int") { - indent(out) << "out.writeInt(__isset_bitfield);" << endl; + indent(out) << "out.writeInt(__isset_bitfield);" << '\n'; } else if (bitsetPrimitiveType == "long") { - indent(out) << "out.writeLong(__isset_bitfield);" << endl; + indent(out) << "out.writeLong(__isset_bitfield);" << '\n'; } - out << endl; + out << '\n'; break; case ISSET_BITSET: - indent(out) << "//BitSet" << endl; - indent(out) << "out.writeSerializable(__isset_bit_vector);" << endl; - out << endl; + indent(out) << "//BitSet" << '\n'; + indent(out) << "out.writeSerializable(__isset_bit_vector);" << '\n'; + out << '\n'; break; } for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -1834,54 +1831,54 @@ void t_java_generator::generate_java_struct_parcelable(ostream& out, t_struct* t string name = (*m_iter)->get_name(); if (t->is_struct()) { - indent(out) << "out.writeParcelable(" << name << ", flags);" << endl; + indent(out) << "out.writeParcelable(" << name << ", flags);" << '\n'; } else if (type_name(t) == "float") { - indent(out) << "out.writeFloat(" << name << ");" << endl; + indent(out) << "out.writeFloat(" << name << ");" << '\n'; } else if (t->is_enum()) { indent(out) << "out.writeInt(" << name << " != null ? " << name << ".getValue() : -1);" - << endl; + << '\n'; } else if (t->is_list()) { if (((t_list*)t)->get_elem_type()->get_true_type()->is_struct()) { - indent(out) << "out.writeTypedList(" << name << ");" << endl; + indent(out) << "out.writeTypedList(" << name << ");" << '\n'; } else { - indent(out) << "out.writeList(" << name << ");" << endl; + indent(out) << "out.writeList(" << name << ");" << '\n'; } } else if (t->is_map()) { - indent(out) << "out.writeMap(" << name << ");" << endl; + indent(out) << "out.writeMap(" << name << ");" << '\n'; } else if (t->is_base_type()) { if (t->is_binary()) { - indent(out) << "out.writeInt(" << name << "!=null ? 1 : 0);" << endl; - indent(out) << "if(" << name << " != null) { " << endl; + indent(out) << "out.writeInt(" << name << "!=null ? 1 : 0);" << '\n'; + indent(out) << "if(" << name << " != null) { " << '\n'; indent_up(); indent(out) << "out.writeByteArray(" << name << ".array(), " << name << ".position() + " << name << ".arrayOffset(), " << name << ".limit() - " << name - << ".position() );" << endl; + << ".position() );" << '\n'; scope_down(out); } else { switch (((t_base_type*)t)->get_base()) { case t_base_type::TYPE_I16: - indent(out) << "out.writeInt(new Short(" << name << ").intValue());" << endl; + indent(out) << "out.writeInt(new Short(" << name << ").intValue());" << '\n'; break; case t_base_type::TYPE_UUID: - indent(out) << "out.writeUuid(" << name << ");" << endl; + indent(out) << "out.writeUuid(" << name << ");" << '\n'; break; case t_base_type::TYPE_I32: - indent(out) << "out.writeInt(" << name << ");" << endl; + indent(out) << "out.writeInt(" << name << ");" << '\n'; break; case t_base_type::TYPE_I64: - indent(out) << "out.writeLong(" << name << ");" << endl; + indent(out) << "out.writeLong(" << name << ");" << '\n'; break; case t_base_type::TYPE_BOOL: - indent(out) << "out.writeInt(" << name << " ? 1 : 0);" << endl; + indent(out) << "out.writeInt(" << name << " ? 1 : 0);" << '\n'; break; case t_base_type::TYPE_I8: - indent(out) << "out.writeByte(" << name << ");" << endl; + indent(out) << "out.writeByte(" << name << ");" << '\n'; break; case t_base_type::TYPE_DOUBLE: - indent(out) << "out.writeDouble(" << name << ");" << endl; + indent(out) << "out.writeDouble(" << name << ");" << '\n'; break; case t_base_type::TYPE_STRING: - indent(out) << "out.writeString(" << name << ");" << endl; + indent(out) << "out.writeString(" << name << ");" << '\n'; break; case t_base_type::TYPE_VOID: break; @@ -1892,38 +1889,38 @@ void t_java_generator::generate_java_struct_parcelable(ostream& out, t_struct* t } } scope_down(out); - out << endl; + out << '\n'; - out << indent() << java_override_annotation() << endl - << indent() << "public int describeContents() {" << endl; + out << indent() << java_override_annotation() << '\n' + << indent() << "public int describeContents() {" << '\n'; indent_up(); - out << indent() << "return 0;" << endl; + out << indent() << "return 0;" << '\n'; scope_down(out); - out << endl; + out << '\n'; - indent(out) << "public " << tname << "(android.os.Parcel in) {" << endl; + indent(out) << "public " << tname << "(android.os.Parcel in) {" << '\n'; indent_up(); // read in the required bitfield switch (needs_isset(tstruct, &bitsetPrimitiveType)) { case ISSET_NONE: break; case ISSET_PRIMITIVE: - indent(out) << "//primitive bitfield of type: " << bitsetPrimitiveType << endl; + indent(out) << "//primitive bitfield of type: " << bitsetPrimitiveType << '\n'; if (bitsetPrimitiveType == "byte") { - indent(out) << "__isset_bitfield = in.readByte();" << endl; + indent(out) << "__isset_bitfield = in.readByte();" << '\n'; } else if (bitsetPrimitiveType == "short") { - indent(out) << "__isset_bitfield = (short) in.readInt();" << endl; + indent(out) << "__isset_bitfield = (short) in.readInt();" << '\n'; } else if (bitsetPrimitiveType == "int") { - indent(out) << "__isset_bitfield = in.readInt();" << endl; + indent(out) << "__isset_bitfield = in.readInt();" << '\n'; } else if (bitsetPrimitiveType == "long") { - indent(out) << "__isset_bitfield = in.readLong();" << endl; + indent(out) << "__isset_bitfield = in.readLong();" << '\n'; } - out << endl; + out << '\n'; break; case ISSET_BITSET: - indent(out) << "//BitSet" << endl; - indent(out) << "__isset_bit_vector = (java.util.BitSet) in.readSerializable();" << endl; - out << endl; + indent(out) << "//BitSet" << '\n'; + indent(out) << "__isset_bit_vector = (java.util.BitSet) in.readSerializable();" << '\n'; + out << '\n'; break; } // read all the fields @@ -1934,57 +1931,57 @@ void t_java_generator::generate_java_struct_parcelable(ostream& out, t_struct* t if (t->is_struct()) { indent(out) << prefix << "= in.readParcelable(" << tname << ".class.getClassLoader());" - << endl; + << '\n'; } else if (t->is_enum()) { - indent(out) << prefix << " = " << type_name(t) << ".findByValue(in.readInt());" << endl; + indent(out) << prefix << " = " << type_name(t) << ".findByValue(in.readInt());" << '\n'; } else if (t->is_list()) { t_list* list = (t_list*)t; - indent(out) << prefix << " = new " << type_name(t, false, true) << "();" << endl; + indent(out) << prefix << " = new " << type_name(t, false, true) << "();" << '\n'; if (list->get_elem_type()->get_true_type()->is_struct()) { indent(out) << "in.readTypedList(" << prefix << ", " << type_name(list->get_elem_type()) - << ".CREATOR);" << endl; + << ".CREATOR);" << '\n'; } else { indent(out) << "in.readList(" << prefix << ", " << tname << ".class.getClassLoader());" - << endl; + << '\n'; } } else if (t->is_map()) { - indent(out) << prefix << " = new " << type_name(t, false, true) << "();" << endl; + indent(out) << prefix << " = new " << type_name(t, false, true) << "();" << '\n'; indent(out) << " in.readMap(" << prefix << ", " << tname << ".class.getClassLoader());" - << endl; + << '\n'; } else if (type_name(t) == "float") { - indent(out) << prefix << " = in.readFloat();" << endl; + indent(out) << prefix << " = in.readFloat();" << '\n'; } else if (t->is_base_type()) { t_base_type* bt = (t_base_type*)t; if (bt->is_binary()) { - indent(out) << "if(in.readInt()==1) {" << endl; + indent(out) << "if(in.readInt()==1) {" << '\n'; indent_up(); - indent(out) << prefix << " = java.nio.ByteBuffer.wrap(in.createByteArray());" << endl; + indent(out) << prefix << " = java.nio.ByteBuffer.wrap(in.createByteArray());" << '\n'; scope_down(out); } else { switch (bt->get_base()) { case t_base_type::TYPE_I8: - indent(out) << prefix << " = in.readByte();" << endl; + indent(out) << prefix << " = in.readByte();" << '\n'; break; case t_base_type::TYPE_I16: - indent(out) << prefix << " = (short) in.readInt();" << endl; + indent(out) << prefix << " = (short) in.readInt();" << '\n'; break; case t_base_type::TYPE_I32: - indent(out) << prefix << " = in.readInt();" << endl; + indent(out) << prefix << " = in.readInt();" << '\n'; break; case t_base_type::TYPE_I64: - indent(out) << prefix << " = in.readLong();" << endl; + indent(out) << prefix << " = in.readLong();" << '\n'; break; case t_base_type::TYPE_UUID: - indent(out) << prefix << " = in.readUuid();" << endl; + indent(out) << prefix << " = in.readUuid();" << '\n'; break; case t_base_type::TYPE_BOOL: - indent(out) << prefix << " = (in.readInt()==1);" << endl; + indent(out) << prefix << " = (in.readInt()==1);" << '\n'; break; case t_base_type::TYPE_DOUBLE: - indent(out) << prefix << " = in.readDouble();" << endl; + indent(out) << prefix << " = in.readDouble();" << '\n'; break; case t_base_type::TYPE_STRING: - indent(out) << prefix << "= in.readString();" << endl; + indent(out) << prefix << "= in.readString();" << '\n'; break; case t_base_type::TYPE_VOID: break; @@ -1996,29 +1993,29 @@ void t_java_generator::generate_java_struct_parcelable(ostream& out, t_struct* t } scope_down(out); - out << endl; + out << '\n'; indent(out) << "public static final android.os.Parcelable.Creator<" << tname - << "> CREATOR = new android.os.Parcelable.Creator<" << tname << ">() {" << endl; + << "> CREATOR = new android.os.Parcelable.Creator<" << tname << ">() {" << '\n'; indent_up(); - indent(out) << java_override_annotation() << endl - << indent() << "public " << tname << "[] newArray(int size) {" << endl; + indent(out) << java_override_annotation() << '\n' + << indent() << "public " << tname << "[] newArray(int size) {" << '\n'; indent_up(); - indent(out) << "return new " << tname << "[size];" << endl; + indent(out) << "return new " << tname << "[size];" << '\n'; scope_down(out); - out << endl; + out << '\n'; - indent(out) << java_override_annotation() << endl + indent(out) << java_override_annotation() << '\n' << indent() << "public " << tname << " createFromParcel(android.os.Parcel in) {" - << endl; + << '\n'; indent_up(); - indent(out) << "return new " << tname << "(in);" << endl; + indent(out) << "return new " << tname << "(in);" << '\n'; scope_down(out); indent_down(); - indent(out) << "};" << endl; - out << endl; + indent(out) << "};" << '\n'; + out << '\n'; } /** @@ -2027,26 +2024,26 @@ void t_java_generator::generate_java_struct_parcelable(ostream& out, t_struct* t * @param tstruct The struct definition */ void t_java_generator::generate_java_struct_equality(ostream& out, t_struct* tstruct) { - out << indent() << java_override_annotation() << endl - << indent() << "public boolean equals(java.lang.Object that) {" << endl; + out << indent() << java_override_annotation() << '\n' + << indent() << "public boolean equals(java.lang.Object that) {" << '\n'; indent_up(); - out << indent() << "if (that instanceof " << make_valid_java_identifier(tstruct->get_name()) << ")" << endl - << indent() << " return this.equals((" << make_valid_java_identifier(tstruct->get_name()) << ")that);" << endl - << indent() << "return false;" << endl; + out << indent() << "if (that instanceof " << make_valid_java_identifier(tstruct->get_name()) << ")" << '\n' + << indent() << " return this.equals((" << make_valid_java_identifier(tstruct->get_name()) << ")that);" << '\n' + << indent() << "return false;" << '\n'; scope_down(out); - out << endl; + out << '\n'; - out << indent() << "public boolean equals(" << make_valid_java_identifier(tstruct->get_name()) << " that) {" << endl; + out << indent() << "public boolean equals(" << make_valid_java_identifier(tstruct->get_name()) << " that) {" << '\n'; indent_up(); - out << indent() << "if (that == null)" << endl - << indent() << " return false;" << endl - << indent() << "if (this == that)" << endl - << indent() << " return true;" << endl; + out << indent() << "if (that == null)" << '\n' + << indent() << " return false;" << '\n' + << indent() << "if (this == that)" << '\n' + << indent() << " return true;" << '\n'; const vector& members = tstruct->get_members(); vector::const_iterator m_iter; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - out << endl; + out << '\n'; t_type* t = get_true_type((*m_iter)->get_type()); // Most existing Thrift code does not use isset or optional/required, @@ -2064,14 +2061,14 @@ void t_java_generator::generate_java_struct_equality(ostream& out, t_struct* tst that_present += " && that." + generate_isset_check(*m_iter); } - out << indent() << "boolean this_present_" << name << " = " << this_present << ";" << endl - << indent() << "boolean that_present_" << name << " = " << that_present << ";" << endl + out << indent() << "boolean this_present_" << name << " = " << this_present << ";" << '\n' + << indent() << "boolean that_present_" << name << " = " << that_present << ";" << '\n' << indent() << "if (" - << "this_present_" << name << " || that_present_" << name << ") {" << endl; + << "this_present_" << name << " || that_present_" << name << ") {" << '\n'; indent_up(); out << indent() << "if (!(" - << "this_present_" << name << " && that_present_" << name << "))" << endl - << indent() << " return false;" << endl; + << "this_present_" << name << " && that_present_" << name << "))" << '\n' + << indent() << " return false;" << '\n'; if (t->is_binary()) { unequal = "!this." + make_valid_java_identifier(name) + ".equals(that." + make_valid_java_identifier(name) + ")"; @@ -2081,25 +2078,25 @@ void t_java_generator::generate_java_struct_equality(ostream& out, t_struct* tst unequal = "this." + make_valid_java_identifier(name) + " != that." + make_valid_java_identifier(name); } - out << indent() << "if (" << unequal << ")" << endl << indent() << " return false;" << endl; + out << indent() << "if (" << unequal << ")" << '\n' << indent() << " return false;" << '\n'; scope_down(out); } - out << endl; - indent(out) << "return true;" << endl; + out << '\n'; + indent(out) << "return true;" << '\n'; scope_down(out); - out << endl; + out << '\n'; const int MUL = 8191; // HashCode multiplier const int B_YES = 131071; const int B_NO = 524287; - out << indent() << java_override_annotation() << endl - << indent() << "public int hashCode() {" << endl; + out << indent() << java_override_annotation() << '\n' + << indent() << "public int hashCode() {" << '\n'; indent_up(); - indent(out) << "int hashCode = 1;" << endl; + indent(out) << "int hashCode = 1;" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - out << endl; + out << '\n'; t_type* t = get_true_type((*m_iter)->get_type()); bool is_optional = (*m_iter)->get_req() == t_field::T_OPTIONAL; @@ -2108,37 +2105,37 @@ void t_java_generator::generate_java_struct_equality(ostream& out, t_struct* tst if (is_optional || can_be_null) { indent(out) << "hashCode = hashCode * " << MUL << " + ((" << generate_isset_check(*m_iter) - << ") ? " << B_YES << " : " << B_NO << ");" << endl; + << ") ? " << B_YES << " : " << B_NO << ");" << '\n'; } if (is_optional || can_be_null) { - indent(out) << "if (" + generate_isset_check(*m_iter) + ")" << endl; + indent(out) << "if (" + generate_isset_check(*m_iter) + ")" << '\n'; indent_up(); } if (t->is_enum()) { - indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ".getValue();" << endl; + indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ".getValue();" << '\n'; } else if (t->is_base_type()) { switch (((t_base_type*)t)->get_base()) { case t_base_type::TYPE_STRING: case t_base_type::TYPE_UUID: - indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ".hashCode();" << endl; + indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ".hashCode();" << '\n'; break; case t_base_type::TYPE_BOOL: indent(out) << "hashCode = hashCode * " << MUL << " + ((" << name << ") ? " << B_YES - << " : " << B_NO << ");" << endl; + << " : " << B_NO << ");" << '\n'; break; case t_base_type::TYPE_I8: - indent(out) << "hashCode = hashCode * " << MUL << " + (int) (" << name << ");" << endl; + indent(out) << "hashCode = hashCode * " << MUL << " + (int) (" << name << ");" << '\n'; break; case t_base_type::TYPE_I16: case t_base_type::TYPE_I32: - indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ";" << endl; + indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ";" << '\n'; break; case t_base_type::TYPE_I64: case t_base_type::TYPE_DOUBLE: indent(out) << "hashCode = hashCode * " << MUL - << " + org.apache.thrift.TBaseHelper.hashCode(" << name << ");" << endl; + << " + org.apache.thrift.TBaseHelper.hashCode(" << name << ");" << '\n'; break; case t_base_type::TYPE_VOID: throw std::logic_error("compiler error: a struct field cannot be void"); @@ -2147,7 +2144,7 @@ void t_java_generator::generate_java_struct_equality(ostream& out, t_struct* tst + t_base_type::t_base_name(((t_base_type*)t)->get_base())); } } else { - indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ".hashCode();" << endl; + indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ".hashCode();" << '\n'; } if (is_optional || can_be_null) { @@ -2155,49 +2152,49 @@ void t_java_generator::generate_java_struct_equality(ostream& out, t_struct* tst } } - out << endl; - indent(out) << "return hashCode;" << endl; + out << '\n'; + indent(out) << "return hashCode;" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } void t_java_generator::generate_java_struct_compare_to(ostream& out, t_struct* tstruct) { - indent(out) << java_override_annotation() << endl; - indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << endl; + indent(out) << java_override_annotation() << '\n'; + indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << '\n'; indent_up(); - indent(out) << "if (!getClass().equals(other.getClass())) {" << endl; - indent(out) << " return getClass().getName().compareTo(other.getClass().getName());" << endl; - indent(out) << "}" << endl; - out << endl; + indent(out) << "if (!getClass().equals(other.getClass())) {" << '\n'; + indent(out) << " return getClass().getName().compareTo(other.getClass().getName());" << '\n'; + indent(out) << "}" << '\n'; + out << '\n'; - indent(out) << "int lastComparison = 0;" << endl; - out << endl; + indent(out) << "int lastComparison = 0;" << '\n'; + out << '\n'; const vector& members = tstruct->get_members(); vector::const_iterator m_iter; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* field = *m_iter; indent(out) << "lastComparison = java.lang.Boolean.compare(" << generate_isset_check(field) - << ", other." << generate_isset_check(field) << ");" << endl; - indent(out) << "if (lastComparison != 0) {" << endl; - indent(out) << " return lastComparison;" << endl; - indent(out) << "}" << endl; + << ", other." << generate_isset_check(field) << ");" << '\n'; + indent(out) << "if (lastComparison != 0) {" << '\n'; + indent(out) << " return lastComparison;" << '\n'; + indent(out) << "}" << '\n'; - indent(out) << "if (" << generate_isset_check(field) << ") {" << endl; + indent(out) << "if (" << generate_isset_check(field) << ") {" << '\n'; indent(out) << " lastComparison = org.apache.thrift.TBaseHelper.compareTo(this." << make_valid_java_identifier(field->get_name()) - << ", other." << make_valid_java_identifier(field->get_name()) << ");" << endl; - indent(out) << " if (lastComparison != 0) {" << endl; - indent(out) << " return lastComparison;" << endl; - indent(out) << " }" << endl; - indent(out) << "}" << endl; + << ", other." << make_valid_java_identifier(field->get_name()) << ");" << '\n'; + indent(out) << " if (lastComparison != 0) {" << '\n'; + indent(out) << " return lastComparison;" << '\n'; + indent(out) << " }" << '\n'; + indent(out) << "}" << '\n'; } - indent(out) << "return 0;" << endl; + indent(out) << "return 0;" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -2206,63 +2203,63 @@ void t_java_generator::generate_java_struct_compare_to(ostream& out, t_struct* t * @param tstruct The struct definition */ void t_java_generator::generate_java_struct_reader(ostream& out, t_struct* /*tstruct*/) { - indent(out) << java_override_annotation() << endl; + indent(out) << java_override_annotation() << '\n'; indent(out) << "public void read(org.apache.thrift.protocol.TProtocol iprot) throws " "org.apache.thrift.TException {" - << endl; + << '\n'; indent_up(); - indent(out) << "scheme(iprot).read(iprot, this);" << endl; + indent(out) << "scheme(iprot).read(iprot, this);" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } // generates java method to perform various checks // (e.g. check that all required fields are set) void t_java_generator::generate_java_validator(ostream& out, t_struct* tstruct) { - indent(out) << "public void validate() throws org.apache.thrift.TException {" << endl; + indent(out) << "public void validate() throws org.apache.thrift.TException {" << '\n'; indent_up(); const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; - out << indent() << "// check for required fields" << endl; + out << indent() << "// check for required fields" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) { if (bean_style_) { - out << indent() << "if (!" << generate_isset_check(*f_iter) << ") {" << endl + out << indent() << "if (!" << generate_isset_check(*f_iter) << ") {" << '\n' << indent() << " throw new org.apache.thrift.protocol.TProtocolException(\"Required field '" - << (*f_iter)->get_name() << "' is unset! Struct:\" + toString());" << endl - << indent() << "}" << endl - << endl; + << (*f_iter)->get_name() << "' is unset! Struct:\" + toString());" << '\n' + << indent() << "}" << '\n' + << '\n'; } else { if (type_can_be_null((*f_iter)->get_type())) { - indent(out) << "if (" << (*f_iter)->get_name() << " == null) {" << endl; + indent(out) << "if (" << (*f_iter)->get_name() << " == null) {" << '\n'; indent(out) << " throw new org.apache.thrift.protocol.TProtocolException(\"Required field '" - << (*f_iter)->get_name() << "' was not present! Struct: \" + toString());" << endl; - indent(out) << "}" << endl; + << (*f_iter)->get_name() << "' was not present! Struct: \" + toString());" << '\n'; + indent(out) << "}" << '\n'; } else { indent(out) << "// alas, we cannot check '" << (*f_iter)->get_name() << "' because it's a primitive and you chose the non-beans generator." - << endl; + << '\n'; } } } } - out << indent() << "// check for sub-struct validity" << endl; + out << indent() << "// check for sub-struct validity" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { t_type* type = get_true_type((*f_iter)->get_type()); if (type->is_struct() && !((t_struct*)type)->is_union()) { - out << indent() << "if (" << make_valid_java_identifier((*f_iter)->get_name()) << " != null) {" << endl; - out << indent() << " " << make_valid_java_identifier((*f_iter)->get_name()) << ".validate();" << endl; - out << indent() << "}" << endl; + out << indent() << "if (" << make_valid_java_identifier((*f_iter)->get_name()) << " != null) {" << '\n'; + out << indent() << " " << make_valid_java_identifier((*f_iter)->get_name()) << ".validate();" << '\n'; + out << indent() << "}" << '\n'; } } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -2271,15 +2268,15 @@ void t_java_generator::generate_java_validator(ostream& out, t_struct* tstruct) * @param tstruct The struct definition */ void t_java_generator::generate_java_struct_writer(ostream& out, t_struct* /*tstruct*/) { - indent(out) << java_override_annotation() << endl; + indent(out) << java_override_annotation() << '\n'; indent(out) << "public void write(org.apache.thrift.protocol.TProtocol oprot) throws " "org.apache.thrift.TException {" - << endl; + << '\n'; indent_up(); - indent(out) << "scheme(oprot).write(oprot, this);" << endl; + indent(out) << "scheme(oprot).write(oprot, this);" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -2294,30 +2291,30 @@ void t_java_generator::generate_java_struct_result_writer(ostream& out, t_struct (void)tstruct; indent(out) << "public void write(org.apache.thrift.protocol.TProtocol oprot) throws " "org.apache.thrift.TException {" - << endl; + << '\n'; indent_up(); - indent(out) << "scheme(oprot).write(oprot, this);" << endl; + indent(out) << "scheme(oprot).write(oprot, this);" << '\n'; indent_down(); - indent(out) << " }" << endl << endl; + indent(out) << " }" << '\n' << '\n'; } void t_java_generator::generate_java_struct_field_by_id(ostream& out, t_struct* tstruct) { (void)tstruct; - indent(out) << java_nullable_annotation() << endl; - indent(out) << java_override_annotation() << endl; - indent(out) << "public _Fields fieldForId(int fieldId) {" << endl; - indent(out) << " return _Fields.findByThriftId(fieldId);" << endl; - indent(out) << "}" << endl << endl; + indent(out) << java_nullable_annotation() << '\n'; + indent(out) << java_override_annotation() << '\n'; + indent(out) << "public _Fields fieldForId(int fieldId) {" << '\n'; + indent(out) << " return _Fields.findByThriftId(fieldId);" << '\n'; + indent(out) << "}" << '\n' << '\n'; } void t_java_generator::generate_reflection_getters(ostringstream& out, t_type* type, string field_name, string cap_name) { - indent(out) << "case " << constant_name(field_name) << ":" << endl; + indent(out) << "case " << constant_name(field_name) << ":" << '\n'; indent_up(); - indent(out) << "return " << (type->is_bool() ? "is" : "get") << cap_name << "();" << endl << endl; + indent(out) << "return " << (type->is_bool() ? "is" : "get") << cap_name << "();" << '\n' << '\n'; indent_down(); } @@ -2326,24 +2323,24 @@ void t_java_generator::generate_reflection_setters(ostringstream& out, string field_name, string cap_name) { const bool is_binary = type->is_binary(); - indent(out) << "case " << constant_name(field_name) << ":" << endl; + indent(out) << "case " << constant_name(field_name) << ":" << '\n'; indent_up(); - indent(out) << "if (value == null) {" << endl; - indent(out) << " unset" << get_cap_name(field_name) << "();" << endl; - indent(out) << "} else {" << endl; + indent(out) << "if (value == null) {" << '\n'; + indent(out) << " unset" << get_cap_name(field_name) << "();" << '\n'; + indent(out) << "} else {" << '\n'; if (is_binary) { indent_up(); - indent(out) << "if (value instanceof byte[]) {" << endl; - indent(out) << " set" << cap_name << "((byte[])value);" << endl; - indent(out) << "} else {" << endl; + indent(out) << "if (value instanceof byte[]) {" << '\n'; + indent(out) << " set" << cap_name << "((byte[])value);" << '\n'; + indent(out) << "} else {" << '\n'; } - indent(out) << " set" << cap_name << "((" << type_name(type, true, false) << ")value);" << endl; + indent(out) << " set" << cap_name << "((" << type_name(type, true, false) << ")value);" << '\n'; if (is_binary) { - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); } - indent(out) << "}" << endl; - indent(out) << "break;" << endl << endl; + indent(out) << "}" << '\n'; + indent(out) << "break;" << '\n' << '\n'; indent_down(); } @@ -2370,25 +2367,25 @@ void t_java_generator::generate_generic_field_getters_setters(std::ostream& out, // create the setter - indent(out) << java_override_annotation() << endl; + indent(out) << java_override_annotation() << '\n'; indent(out) << "public void setFieldValue(_Fields field, " << java_nullable_annotation() - << " java.lang.Object value) {" << endl; - indent(out) << " switch (field) {" << endl; + << " java.lang.Object value) {" << '\n'; + indent(out) << " switch (field) {" << '\n'; out << setter_stream.str(); - indent(out) << " }" << endl; - indent(out) << "}" << endl << endl; + indent(out) << " }" << '\n'; + indent(out) << "}" << '\n' << '\n'; // create the getter - indent(out) << java_nullable_annotation() << endl; - indent(out) << java_override_annotation() << endl; - indent(out) << "public java.lang.Object getFieldValue(_Fields field) {" << endl; + indent(out) << java_nullable_annotation() << '\n'; + indent(out) << java_override_annotation() << '\n'; + indent(out) << "public java.lang.Object getFieldValue(_Fields field) {" << '\n'; indent_up(); - indent(out) << "switch (field) {" << endl; + indent(out) << "switch (field) {" << '\n'; out << getter_stream.str(); - indent(out) << "}" << endl; - indent(out) << "throw new java.lang.IllegalStateException();" << endl; + indent(out) << "}" << '\n'; + indent(out) << "throw new java.lang.IllegalStateException();" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } // Creates a generic isSet method that takes the field number as argument @@ -2399,28 +2396,28 @@ void t_java_generator::generate_generic_isset_method(std::ostream& out, t_struct // create the isSet method indent(out) << "/** Returns true if field corresponding to fieldID is set (has been assigned a " "value) and false otherwise */" - << endl; - indent(out) << java_override_annotation() << endl; - indent(out) << "public boolean isSet(_Fields field) {" << endl; + << '\n'; + indent(out) << java_override_annotation() << '\n'; + indent(out) << "public boolean isSet(_Fields field) {" << '\n'; indent_up(); - indent(out) << "if (field == null) {" << endl; - indent(out) << " throw new java.lang.IllegalArgumentException();" << endl; - indent(out) << "}" << endl << endl; + indent(out) << "if (field == null) {" << '\n'; + indent(out) << " throw new java.lang.IllegalArgumentException();" << '\n'; + indent(out) << "}" << '\n' << '\n'; - indent(out) << "switch (field) {" << endl; + indent(out) << "switch (field) {" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { t_field* field = *f_iter; - indent(out) << "case " << constant_name(field->get_name()) << ":" << endl; + indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n'; indent_up(); - indent(out) << "return " << generate_isset_check(field) << ";" << endl; + indent(out) << "return " << generate_isset_check(field) << ";" << '\n'; indent_down(); } - indent(out) << "}" << endl; - indent(out) << "throw new java.lang.IllegalStateException();" << endl; + indent(out) << "}" << '\n'; + indent(out) << "throw new java.lang.IllegalStateException();" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -2445,7 +2442,7 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts // Method to return the size of the collection if (optional) { if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } if (use_jdk8_option_type_) { @@ -2454,20 +2451,20 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts indent(out) << "public " << thrift_option_class << " get" << cap_name; } - out << get_cap_name("size() {") << endl; + out << get_cap_name("size() {") << '\n'; indent_up(); - indent(out) << "if (this." << field_name << " == null) {" << endl; + indent(out) << "if (this." << field_name << " == null) {" << '\n'; indent_up(); if (use_jdk8_option_type_) { - indent(out) << "return " << jdk_option_class << ".empty();" << endl; + indent(out) << "return " << jdk_option_class << ".empty();" << '\n'; } else { - indent(out) << "return " << thrift_option_class << ".none();" << endl; + indent(out) << "return " << thrift_option_class << ".none();" << '\n'; } indent_down(); - indent(out) << "} else {" << endl; + indent(out) << "} else {" << '\n'; indent_up(); if (use_jdk8_option_type_) { @@ -2475,24 +2472,24 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts } else { indent(out) << "return " << thrift_option_class << ".some(this."; } - out << field_name << ".size());" << endl; + out << field_name << ".size());" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } else { if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } indent(out) << "public int get" << cap_name; - out << get_cap_name("size() {") << endl; + out << get_cap_name("size() {") << '\n'; indent_up(); indent(out) << "return (this." << field_name << " == null) ? 0 : " - << "this." << field_name << ".size();" << endl; + << "this." << field_name << ".size();" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } } @@ -2507,7 +2504,7 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts // Iterator getter for sets and lists if (optional) { if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } if (use_jdk8_option_type_) { @@ -2518,20 +2515,20 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts out << "java.util.Iterator<" << type_name(element_type, true, false) << ">> get" << cap_name; - out << get_cap_name("iterator() {") << endl; + out << get_cap_name("iterator() {") << '\n'; indent_up(); - indent(out) << "if (this." << field_name << " == null) {" << endl; + indent(out) << "if (this." << field_name << " == null) {" << '\n'; indent_up(); if (use_jdk8_option_type_) { - indent(out) << "return " << jdk_option_class << ".empty();" << endl; + indent(out) << "return " << jdk_option_class << ".empty();" << '\n'; } else { - indent(out) << "return " << thrift_option_class << ".none();" << endl; + indent(out) << "return " << thrift_option_class << ".none();" << '\n'; } indent_down(); - indent(out) << "} else {" << endl; + indent(out) << "} else {" << '\n'; indent_up(); if (use_jdk8_option_type_) { @@ -2539,104 +2536,104 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts } else { indent(out) << "return " << thrift_option_class << ".some(this."; } - out << field_name << ".iterator());" << endl; + out << field_name << ".iterator());" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } else { if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } - indent(out) << java_nullable_annotation() << endl; + indent(out) << java_nullable_annotation() << '\n'; indent(out) << "public java.util.Iterator<" << type_name(element_type, true, false) << "> get" << cap_name; - out << get_cap_name("iterator() {") << endl; + out << get_cap_name("iterator() {") << '\n'; indent_up(); indent(out) << "return (this." << field_name << " == null) ? null : " - << "this." << field_name << ".iterator();" << endl; + << "this." << field_name << ".iterator();" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } // Add to set or list, create if the set/list is null if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } indent(out) << "public void add" << get_cap_name("to"); - out << cap_name << "(" << type_name(element_type) << " elem) {" << endl; + out << cap_name << "(" << type_name(element_type) << " elem) {" << '\n'; indent_up(); - indent(out) << "if (this." << field_name << " == null) {" << endl; + indent(out) << "if (this." << field_name << " == null) {" << '\n'; indent_up(); indent(out) << "this." << field_name; if (is_enum_set(type)) { out << " = " << type_name(type, false, true, true) << ".noneOf(" - << inner_enum_type_name(type) << ");" << endl; + << inner_enum_type_name(type) << ");" << '\n'; } else { - out << " = new " << type_name(type, false, true) << "();" << endl; + out << " = new " << type_name(type, false, true) << "();" << '\n'; } indent_down(); - indent(out) << "}" << endl; - indent(out) << "this." << field_name << ".add(elem);" << endl; + indent(out) << "}" << '\n'; + indent(out) << "this." << field_name << ".add(elem);" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } else if (type->is_map()) { // Put to map t_type* key_type = ((t_map*)type)->get_key_type(); t_type* val_type = ((t_map*)type)->get_val_type(); if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } indent(out) << "public void put" << get_cap_name("to"); out << cap_name << "(" << type_name(key_type) << " key, " << type_name(val_type) << " val) {" - << endl; + << '\n'; indent_up(); - indent(out) << "if (this." << field_name << " == null) {" << endl; + indent(out) << "if (this." << field_name << " == null) {" << '\n'; indent_up(); std::string constructor_args; if (is_enum_map(type)) { constructor_args = inner_enum_type_name(type); } indent(out) << "this." << field_name << " = new " << type_name(type, false, true) << "(" - << constructor_args << ");" << endl; + << constructor_args << ");" << '\n'; indent_down(); - indent(out) << "}" << endl; - indent(out) << "this." << field_name << ".put(key, val);" << endl; + indent(out) << "}" << '\n'; + indent(out) << "this." << field_name << ".put(key, val);" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } // Simple getter generate_java_doc(out, field); if (type->is_binary()) { if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } - indent(out) << "public byte[] get" << cap_name << "() {" << endl; + indent(out) << "public byte[] get" << cap_name << "() {" << '\n'; indent(out) << " set" << cap_name << "(org.apache.thrift.TBaseHelper.rightSize(" - << field_name << "));" << endl; + << field_name << "));" << '\n'; indent(out) << " return " << field_name << " == null ? null : " << field_name << ".array();" - << endl; - indent(out) << "}" << endl << endl; + << '\n'; + indent(out) << "}" << '\n' << '\n'; indent(out) << "public java.nio.ByteBuffer buffer" << get_cap_name("for") << cap_name - << "() {" << endl; + << "() {" << '\n'; if (unsafe_binaries_) { - indent(out) << " return " << field_name << ";" << endl; + indent(out) << " return " << field_name << ";" << '\n'; } else { indent(out) << " return org.apache.thrift.TBaseHelper.copyBinary(" << field_name << ");" - << endl; + << '\n'; } - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } else { if (optional) { if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } if (use_jdk8_option_type_) { @@ -2650,10 +2647,10 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts } else { out << " get"; } - out << cap_name << "() {" << endl; + out << cap_name << "() {" << '\n'; indent_up(); - indent(out) << "if (this.isSet" << cap_name << "()) {" << endl; + indent(out) << "if (this.isSet" << cap_name << "()) {" << '\n'; indent_up(); if (use_jdk8_option_type_) { @@ -2661,28 +2658,28 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts } else { indent(out) << "return " << thrift_option_class << ".some(this."; } - out << field_name << ");" << endl; + out << field_name << ");" << '\n'; indent_down(); - indent(out) << "} else {" << endl; + indent(out) << "} else {" << '\n'; indent_up(); if (use_jdk8_option_type_) { - indent(out) << "return " << jdk_option_class << ".empty();" << endl; + indent(out) << "return " << jdk_option_class << ".empty();" << '\n'; } else { - indent(out) << "return " << thrift_option_class << ".none();" << endl; + indent(out) << "return " << thrift_option_class << ".none();" << '\n'; } indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } else { if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } if (type_can_be_null(type)) { - indent(out) << java_nullable_annotation() << endl; + indent(out) << java_nullable_annotation() << '\n'; } indent(out) << "public " << type_name(type); if (type->is_base_type() && ((t_base_type*)type)->get_base() == t_base_type::TYPE_BOOL) { @@ -2690,11 +2687,11 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts } else { out << " get"; } - out << cap_name << "() {" << endl; + out << cap_name << "() {" << '\n'; indent_up(); - indent(out) << "return this." << make_valid_java_identifier(field_name) << ";" << endl; + indent(out) << "return this." << make_valid_java_identifier(field_name) << ";" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } } @@ -2702,7 +2699,7 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts generate_java_doc(out, field); if (type->is_binary()) { if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } indent(out) << "public "; if (bean_style_) { @@ -2710,23 +2707,23 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts } else { out << type_name(tstruct); } - out << " set" << cap_name << "(byte[] " << make_valid_java_identifier(field_name) << ") {" << endl; + out << " set" << cap_name << "(byte[] " << make_valid_java_identifier(field_name) << ") {" << '\n'; indent(out) << " this." << make_valid_java_identifier(field_name) << " = " << make_valid_java_identifier(field_name) << " == null ? (java.nio.ByteBuffer)null"; if (unsafe_binaries_) { - indent(out) << " : java.nio.ByteBuffer.wrap(" << make_valid_java_identifier(field_name) << ");" << endl; + indent(out) << " : java.nio.ByteBuffer.wrap(" << make_valid_java_identifier(field_name) << ");" << '\n'; } else { - indent(out) << " : java.nio.ByteBuffer.wrap(" << make_valid_java_identifier(field_name) << ".clone());" << endl; + indent(out) << " : java.nio.ByteBuffer.wrap(" << make_valid_java_identifier(field_name) << ".clone());" << '\n'; } if (!bean_style_) { - indent(out) << " return this;" << endl; + indent(out) << " return this;" << '\n'; } - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } indent(out) << "public "; if (bean_style_) { @@ -2737,7 +2734,7 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts out << " set" << cap_name << "(" << (type_can_be_null(type) ? (java_nullable_annotation() + " ") : "") << type_name(type) - << " " << make_valid_java_identifier(field_name) << ") {" << endl; + << " " << make_valid_java_identifier(field_name) << ") {" << '\n'; indent_up(); indent(out) << "this." << make_valid_java_identifier(field_name) << " = "; if (type->is_binary() && !unsafe_binaries_) { @@ -2745,70 +2742,70 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts } else { out << make_valid_java_identifier(field_name); } - out << ";" << endl; + out << ";" << '\n'; generate_isset_set(out, field, ""); if (!bean_style_) { - indent(out) << "return this;" << endl; + indent(out) << "return this;" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; // Unsetter if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } - indent(out) << "public void unset" << cap_name << "() {" << endl; + indent(out) << "public void unset" << cap_name << "() {" << '\n'; indent_up(); if (type_can_be_null(type)) { - indent(out) << "this." << make_valid_java_identifier(field_name) << " = null;" << endl; + indent(out) << "this." << make_valid_java_identifier(field_name) << " = null;" << '\n'; } else if (issetType == ISSET_PRIMITIVE) { indent(out) << "__isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, " - << isset_field_id(field) << ");" << endl; + << isset_field_id(field) << ");" << '\n'; } else { - indent(out) << "__isset_bit_vector.clear(" << isset_field_id(field) << ");" << endl; + indent(out) << "__isset_bit_vector.clear(" << isset_field_id(field) << ");" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; // isSet method indent(out) << "/** Returns true if field " << field_name - << " is set (has been assigned a value) and false otherwise */" << endl; + << " is set (has been assigned a value) and false otherwise */" << '\n'; if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } - indent(out) << "public boolean is" << get_cap_name("set") << cap_name << "() {" << endl; + indent(out) << "public boolean is" << get_cap_name("set") << cap_name << "() {" << '\n'; indent_up(); if (type_can_be_null(type)) { - indent(out) << "return this." << make_valid_java_identifier(field_name) << " != null;" << endl; + indent(out) << "return this." << make_valid_java_identifier(field_name) << " != null;" << '\n'; } else if (issetType == ISSET_PRIMITIVE) { indent(out) << "return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, " - << isset_field_id(field) << ");" << endl; + << isset_field_id(field) << ");" << '\n'; } else { - indent(out) << "return __isset_bit_vector.get(" << isset_field_id(field) << ");" << endl; + indent(out) << "return __isset_bit_vector.get(" << isset_field_id(field) << ");" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; if (is_deprecated) { - indent(out) << "@Deprecated" << endl; + indent(out) << "@Deprecated" << '\n'; } indent(out) << "public void set" << cap_name << get_cap_name("isSet") << "(boolean value) {" - << endl; + << '\n'; indent_up(); if (type_can_be_null(type)) { - indent(out) << "if (!value) {" << endl; - indent(out) << " this." << make_valid_java_identifier(field_name) << " = null;" << endl; - indent(out) << "}" << endl; + indent(out) << "if (!value) {" << '\n'; + indent(out) << " this." << make_valid_java_identifier(field_name) << " = null;" << '\n'; + indent(out) << "}" << '\n'; } else if (issetType == ISSET_PRIMITIVE) { indent(out) << "__isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, " - << isset_field_id(field) << ", value);" << endl; + << isset_field_id(field) << ", value);" << '\n'; } else { - indent(out) << "__isset_bit_vector.set(" << isset_field_id(field) << ", value);" << endl; + indent(out) << "__isset_bit_vector.set(" << isset_field_id(field) << ", value);" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } } @@ -2818,13 +2815,13 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts * @param tstruct The struct definition */ void t_java_generator::generate_java_struct_tostring(ostream& out, t_struct* tstruct) { - out << indent() << java_override_annotation() << endl - << indent() << "public java.lang.String toString() {" << endl; + out << indent() << java_override_annotation() << '\n' + << indent() << "public java.lang.String toString() {" << '\n'; indent_up(); out << indent() << "java.lang.StringBuilder sb = new java.lang.StringBuilder(\"" - << tstruct->get_name() << "(\");" << endl; - out << indent() << "boolean first = true;" << endl << endl; + << tstruct->get_name() << "(\");" << '\n'; + out << indent() << "boolean first = true;" << '\n' << '\n'; const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; @@ -2832,55 +2829,55 @@ void t_java_generator::generate_java_struct_tostring(ostream& out, t_struct* tst for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool could_be_unset = (*f_iter)->get_req() == t_field::T_OPTIONAL; if (could_be_unset) { - indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << endl; + indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << '\n'; indent_up(); } t_field* field = (*f_iter); if (!first) { - indent(out) << "if (!first) sb.append(\", \");" << endl; + indent(out) << "if (!first) sb.append(\", \");" << '\n'; } - indent(out) << "sb.append(\"" << (*f_iter)->get_name() << ":\");" << endl; + indent(out) << "sb.append(\"" << (*f_iter)->get_name() << ":\");" << '\n'; bool can_be_null = type_can_be_null(field->get_type()); if (can_be_null) { - indent(out) << "if (this." << make_valid_java_identifier((*f_iter)->get_name()) << " == null) {" << endl; - indent(out) << " sb.append(\"null\");" << endl; - indent(out) << "} else {" << endl; + indent(out) << "if (this." << make_valid_java_identifier((*f_iter)->get_name()) << " == null) {" << '\n'; + indent(out) << " sb.append(\"null\");" << '\n'; + indent(out) << "} else {" << '\n'; indent_up(); } if (get_true_type(field->get_type())->is_binary()) { indent(out) << "org.apache.thrift.TBaseHelper.toString(this." << make_valid_java_identifier(field->get_name()) << ", sb);" - << endl; + << '\n'; } else if ((field->get_type()->is_set()) && (get_true_type(((t_set*)field->get_type())->get_elem_type())->is_binary())) { indent(out) << "org.apache.thrift.TBaseHelper.toString(this." << make_valid_java_identifier(field->get_name()) << ", sb);" - << endl; + << '\n'; } else if ((field->get_type()->is_list()) && (get_true_type(((t_list*)field->get_type())->get_elem_type())->is_binary())) { indent(out) << "org.apache.thrift.TBaseHelper.toString(this." << make_valid_java_identifier(field->get_name()) << ", sb);" - << endl; + << '\n'; } else { - indent(out) << "sb.append(this." << make_valid_java_identifier((*f_iter)->get_name()) << ");" << endl; + indent(out) << "sb.append(this." << make_valid_java_identifier((*f_iter)->get_name()) << ");" << '\n'; } if (can_be_null) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } - indent(out) << "first = false;" << endl; + indent(out) << "first = false;" << '\n'; if (could_be_unset) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } first = false; } - out << indent() << "sb.append(\")\");" << endl << indent() << "return sb.toString();" << endl; + out << indent() << "sb.append(\")\");" << '\n' << indent() << "return sb.toString();" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -2896,14 +2893,14 @@ void t_java_generator::generate_java_meta_data_map(ostream& out, t_struct* tstru // Static Map with fieldID -> org.apache.thrift.meta_data.FieldMetaData mappings indent(out) << "public static final java.util.Map<_Fields, " "org.apache.thrift.meta_data.FieldMetaData> metaDataMap;" - << endl; - indent(out) << "static {" << endl; + << '\n'; + indent(out) << "static {" << '\n'; indent_up(); indent(out) << "java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new " "java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);" - << endl; + << '\n'; // Populate map for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { @@ -2928,15 +2925,15 @@ void t_java_generator::generate_java_meta_data_map(ostream& out, t_struct* tstru if (annotations_as_metadata_) { generate_metadata_for_field_annotations(out, field); } - out << "));" << endl; + out << "));" << '\n'; } - indent(out) << "metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);" << endl; + indent(out) << "metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);" << '\n'; indent(out) << "org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(" - << type_name(tstruct) << ".class, metaDataMap);" << endl; + << type_name(tstruct) << ".class, metaDataMap);" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -3003,19 +3000,19 @@ void t_java_generator::generate_metadata_for_field_annotations(std::ostream& out if (field->annotations_.size() == 0) { return; } - out << ", " << endl; + out << ", " << '\n'; indent_up(); indent_up(); indent(out) << "java.util.stream.Stream.>builder()" - << endl; + << '\n'; indent_up(); indent_up(); for (auto& annotation : field->annotations_) { indent(out) << ".add(new java.util.AbstractMap.SimpleImmutableEntry<>(\"" + annotation.first + "\", \"" + annotation.second.back() + "\"))" - << endl; + << '\n'; } indent(out) << ".build().collect(java.util.stream.Collectors.toMap(java.util.Map.Entry::getKey, " "java.util.Map.Entry::getValue))"; @@ -3028,7 +3025,7 @@ void t_java_generator::generate_metadata_for_field_annotations(std::ostream& out void t_java_generator::generate_field_value_meta_data(std::ostream& out, t_type* type) { t_type* ttype = get_true_type(type); - out << endl; + out << '\n'; indent_up(); indent_up(); if (ttype->is_struct() || ttype->is_xception()) { @@ -3093,7 +3090,7 @@ void t_java_generator::generate_service(t_service* tservice) { generate_javax_generated_annotation(f_service_); } f_service_ << java_suppressions(); - f_service_ << "public class " << make_valid_java_identifier(service_name_) << " {" << endl << endl; + f_service_ << "public class " << make_valid_java_identifier(service_name_) << " {" << '\n' << '\n'; indent_up(); // Generate the three main parts of the service @@ -3112,7 +3109,7 @@ void t_java_generator::generate_service(t_service* tservice) { generate_service_helpers(tservice); indent_down(); - f_service_ << "}" << endl; + f_service_ << "}" << '\n'; f_service_.close(); } @@ -3130,16 +3127,16 @@ void t_java_generator::generate_service_interface(t_service* tservice) { } generate_java_doc(f_service_, tservice); - f_service_ << indent() << "public interface Iface" << extends_iface << " {" << endl << endl; + f_service_ << indent() << "public interface Iface" << extends_iface << " {" << '\n' << '\n'; indent_up(); vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_java_doc(f_service_, *f_iter); - indent(f_service_) << "public " << function_signature(*f_iter) << ";" << endl << endl; + indent(f_service_) << "public " << function_signature(*f_iter) << ";" << '\n' << '\n'; } indent_down(); - f_service_ << indent() << "}" << endl << endl; + f_service_ << indent() << "}" << '\n' << '\n'; } void t_java_generator::generate_service_async_interface(t_service* tservice) { @@ -3150,17 +3147,17 @@ void t_java_generator::generate_service_async_interface(t_service* tservice) { extends_iface = " extends " + extends + ".AsyncIface"; } - f_service_ << indent() << "public interface AsyncIface" << extends_iface << " {" << endl << endl; + f_service_ << indent() << "public interface AsyncIface" << extends_iface << " {" << '\n' << '\n'; indent_up(); vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { indent(f_service_) << "public " << function_signature_async(*f_iter, true) - << " throws org.apache.thrift.TException;" << endl - << endl; + << " throws org.apache.thrift.TException;" << '\n' + << '\n'; } indent_down(); - f_service_ << indent() << "}" << endl << endl; + f_service_ << indent() << "}" << '\n' << '\n'; } void t_java_generator::generate_service_future_interface(t_service* tservice) { @@ -3171,15 +3168,15 @@ void t_java_generator::generate_service_future_interface(t_service* tservice) { extends_iface = " extends " + extends + " .FutureIface"; } - f_service_ << indent() << "public interface FutureIface" << extends_iface << " {" << endl << endl; + f_service_ << indent() << "public interface FutureIface" << extends_iface << " {" << '\n' << '\n'; indent_up(); for (auto tfunc : tservice->get_functions()) { indent(f_service_) << "public " << function_signature_future(tfunc) - << " throws org.apache.thrift.TException;" << endl - << endl; + << " throws org.apache.thrift.TException;" << '\n' + << '\n'; } scope_down(f_service_); - f_service_ << endl << endl; + f_service_ << '\n' << '\n'; } /** @@ -3209,43 +3206,43 @@ void t_java_generator::generate_service_client(t_service* tservice) { } indent(f_service_) << "public static class Client extends " << extends_client - << " implements Iface {" << endl; + << " implements Iface {" << '\n'; indent_up(); indent(f_service_) << "public static class Factory implements org.apache.thrift.TServiceClientFactory {" - << endl; + << '\n'; indent_up(); - indent(f_service_) << "public Factory() {}" << endl; - indent(f_service_) << java_override_annotation() << endl; + indent(f_service_) << "public Factory() {}" << '\n'; + indent(f_service_) << java_override_annotation() << '\n'; indent(f_service_) << "public Client getClient(org.apache.thrift.protocol.TProtocol prot) {" - << endl; + << '\n'; indent_up(); - indent(f_service_) << "return new Client(prot);" << endl; + indent(f_service_) << "return new Client(prot);" << '\n'; indent_down(); - indent(f_service_) << "}" << endl; - indent(f_service_) << java_override_annotation() << endl; + indent(f_service_) << "}" << '\n'; + indent(f_service_) << java_override_annotation() << '\n'; indent(f_service_) << "public Client getClient(org.apache.thrift.protocol.TProtocol iprot, " "org.apache.thrift.protocol.TProtocol oprot) {" - << endl; + << '\n'; indent_up(); - indent(f_service_) << "return new Client(iprot, oprot);" << endl; + indent(f_service_) << "return new Client(iprot, oprot);" << '\n'; indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; - indent(f_service_) << "public Client(org.apache.thrift.protocol.TProtocol prot)" << endl; + indent(f_service_) << "public Client(org.apache.thrift.protocol.TProtocol prot)" << '\n'; scope_up(f_service_); - indent(f_service_) << "super(prot, prot);" << endl; + indent(f_service_) << "super(prot, prot);" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; indent(f_service_) << "public Client(org.apache.thrift.protocol.TProtocol iprot, " "org.apache.thrift.protocol.TProtocol oprot) {" - << endl; - indent(f_service_) << " super(iprot, oprot);" << endl; - indent(f_service_) << "}" << endl << endl; + << '\n'; + indent(f_service_) << " super(iprot, oprot);" << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; // Generate client method implementations vector functions = tservice->get_functions(); @@ -3260,8 +3257,8 @@ void t_java_generator::generate_service_client(t_service* tservice) { } // Open function - indent(f_service_) << java_override_annotation() << endl; - indent(f_service_) << "public " << function_signature(*f_iter) << endl; + indent(f_service_) << java_override_annotation() << '\n'; + indent(f_service_) << "public " << function_signature(*f_iter) << '\n'; scope_up(f_service_); indent(f_service_) << "send" << sep << javaname << "("; @@ -3280,17 +3277,17 @@ void t_java_generator::generate_service_client(t_service* tservice) { } f_service_ << make_valid_java_identifier((*fld_iter)->get_name()); } - f_service_ << ");" << endl; + f_service_ << ");" << '\n'; if (!(*f_iter)->is_oneway()) { f_service_ << indent(); if (!(*f_iter)->get_returntype()->is_void()) { f_service_ << "return "; } - f_service_ << "recv" << sep << javaname << "();" << endl; + f_service_ << "recv" << sep << javaname << "();" << '\n'; } scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; t_function send_function(g_type_void, string("send") + sep + javaname, (*f_iter)->get_arglist()); @@ -3298,22 +3295,22 @@ void t_java_generator::generate_service_client(t_service* tservice) { string argsname = (*f_iter)->get_name() + "_args"; // Open function - indent(f_service_) << "public " << function_signature(&send_function) << endl; + indent(f_service_) << "public " << function_signature(&send_function) << '\n'; scope_up(f_service_); // Serialize the request - indent(f_service_) << argsname << " args = new " << argsname << "();" << endl; + indent(f_service_) << argsname << " args = new " << argsname << "();" << '\n'; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { indent(f_service_) << "args.set" << get_cap_name((*fld_iter)->get_name()) << "(" - << make_valid_java_identifier((*fld_iter)->get_name()) << ");" << endl; + << make_valid_java_identifier((*fld_iter)->get_name()) << ");" << '\n'; } const string sendBaseName = (*f_iter)->is_oneway() ? "sendBaseOneway" : "sendBase"; - indent(f_service_) << sendBaseName << "(\"" << funname << "\", args);" << endl; + indent(f_service_) << sendBaseName << "(\"" << funname << "\", args);" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; if (!(*f_iter)->is_oneway()) { string resultname = (*f_iter)->get_name() + "_result"; @@ -3322,47 +3319,47 @@ void t_java_generator::generate_service_client(t_service* tservice) { t_function recv_function((*f_iter)->get_returntype(), string("recv") + sep + javaname, &noargs, (*f_iter)->get_xceptions()); // Open function - indent(f_service_) << "public " << function_signature(&recv_function) << endl; + indent(f_service_) << "public " << function_signature(&recv_function) << '\n'; scope_up(f_service_); - f_service_ << indent() << resultname << " result = new " << resultname << "();" << endl - << indent() << "receiveBase(result, \"" << funname << "\");" << endl; + f_service_ << indent() << resultname << " result = new " << resultname << "();" << '\n' + << indent() << "receiveBase(result, \"" << funname << "\");" << '\n'; // Careful, only return _result if not a void function if (!(*f_iter)->get_returntype()->is_void()) { - f_service_ << indent() << "if (result." << generate_isset_check("success") << ") {" << endl - << indent() << " return result.success;" << endl - << indent() << "}" << endl; + f_service_ << indent() << "if (result." << generate_isset_check("success") << ") {" << '\n' + << indent() << " return result.success;" << '\n' + << indent() << "}" << '\n'; } t_struct* xs = (*f_iter)->get_xceptions(); const std::vector& xceptions = xs->get_members(); vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { - f_service_ << indent() << "if (result." << make_valid_java_identifier((*x_iter)->get_name()) << " != null) {" << endl - << indent() << " throw result." << make_valid_java_identifier((*x_iter)->get_name()) << ";" << endl - << indent() << "}" << endl; + f_service_ << indent() << "if (result." << make_valid_java_identifier((*x_iter)->get_name()) << " != null) {" << '\n' + << indent() << " throw result." << make_valid_java_identifier((*x_iter)->get_name()) << ";" << '\n' + << indent() << "}" << '\n'; } // If you get here it's an exception, unless a void function if ((*f_iter)->get_returntype()->is_void()) { - indent(f_service_) << "return;" << endl; + indent(f_service_) << "return;" << '\n'; } else { f_service_ << indent() << "throw new " "org.apache.thrift.TApplicationException(org.apache.thrift." "TApplicationException.MISSING_RESULT, \"" - << (*f_iter)->get_name() << " failed: unknown result\");" << endl; + << (*f_iter)->get_name() << " failed: unknown result\");" << '\n'; } // Close function scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; } } indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } void t_java_generator::generate_service_future_client(t_service* tservice) { @@ -3373,13 +3370,13 @@ void t_java_generator::generate_service_future_client(t_service* tservice) { static string adapter_class = "org.apache.thrift.async.AsyncMethodFutureAdapter"; indent(f_service_) << "public static class FutureClient " << extends_client - << "implements FutureIface {" << endl; + << "implements FutureIface {" << '\n'; indent_up(); - indent(f_service_) << "public FutureClient(AsyncIface delegate) {" << endl; + indent(f_service_) << "public FutureClient(AsyncIface delegate) {" << '\n'; indent_up(); - indent(f_service_) << "this.delegate = delegate;" << endl; + indent(f_service_) << "this.delegate = delegate;" << '\n'; scope_down(f_service_); - indent(f_service_) << "private final AsyncIface delegate;" << endl; + indent(f_service_) << "private final AsyncIface delegate;" << '\n'; for (auto tfunc : tservice->get_functions()) { string funname = tfunc->get_name(); string sep = "_"; @@ -3396,23 +3393,23 @@ void t_java_generator::generate_service_future_client(t_service* tservice) { string args_name = funname + "_args"; string result_name = funname + "_result"; - indent(f_service_) << "@Override" << endl; + indent(f_service_) << "@Override" << '\n'; indent(f_service_) << "public " << function_signature_future(tfunc) - << " throws org.apache.thrift.TException {" << endl; + << " throws org.apache.thrift.TException {" << '\n'; indent_up(); auto adapter = tmp("asyncMethodFutureAdapter"); indent(f_service_) << adapter_class << "<" << ret_type_name << "> " << adapter << " = " - << adapter_class << ".<" << ret_type_name << ">create();" << endl; + << adapter_class << ".<" << ret_type_name << ">create();" << '\n'; bool empty_args = tfunc->get_arglist()->get_members().empty(); indent(f_service_) << "delegate." << get_rpc_method_name(funname) << "(" << argument_list(tfunc->get_arglist(), false) << (empty_args ? "" : ", ") - << adapter << ");" << endl; - indent(f_service_) << "return " << adapter << ".getFuture();" << endl; + << adapter << ");" << '\n'; + indent(f_service_) << "return " << adapter << ".getFuture();" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; } scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; } void t_java_generator::generate_service_async_client(t_service* tservice) { @@ -3422,41 +3419,41 @@ void t_java_generator::generate_service_async_client(t_service* tservice) { } indent(f_service_) << "public static class AsyncClient extends " << extends_client - << " implements AsyncIface {" << endl; + << " implements AsyncIface {" << '\n'; indent_up(); // Factory method indent(f_service_) << "public static class Factory implements " "org.apache.thrift.async.TAsyncClientFactory {" - << endl; + << '\n'; indent(f_service_) << " private org.apache.thrift.async.TAsyncClientManager clientManager;" - << endl; + << '\n'; indent(f_service_) << " private org.apache.thrift.protocol.TProtocolFactory protocolFactory;" - << endl; + << '\n'; indent(f_service_) << " public Factory(org.apache.thrift.async.TAsyncClientManager " "clientManager, org.apache.thrift.protocol.TProtocolFactory " "protocolFactory) {" - << endl; - indent(f_service_) << " this.clientManager = clientManager;" << endl; - indent(f_service_) << " this.protocolFactory = protocolFactory;" << endl; - indent(f_service_) << " }" << endl; - indent(f_service_) << java_override_annotation() << endl; + << '\n'; + indent(f_service_) << " this.clientManager = clientManager;" << '\n'; + indent(f_service_) << " this.protocolFactory = protocolFactory;" << '\n'; + indent(f_service_) << " }" << '\n'; + indent(f_service_) << java_override_annotation() << '\n'; indent(f_service_) << " public AsyncClient " "getAsyncClient(org.apache.thrift.transport.TNonblockingTransport " "transport) {" - << endl; + << '\n'; indent(f_service_) << " return new AsyncClient(protocolFactory, clientManager, transport);" - << endl; - indent(f_service_) << " }" << endl; - indent(f_service_) << "}" << endl << endl; + << '\n'; + indent(f_service_) << " }" << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; indent(f_service_) << "public AsyncClient(org.apache.thrift.protocol.TProtocolFactory " "protocolFactory, org.apache.thrift.async.TAsyncClientManager " "clientManager, org.apache.thrift.transport.TNonblockingTransport " "transport) {" - << endl; - indent(f_service_) << " super(protocolFactory, clientManager, transport);" << endl; - indent(f_service_) << "}" << endl << endl; + << '\n'; + indent(f_service_) << " super(protocolFactory, clientManager, transport);" << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; // Generate client method implementations vector functions = tservice->get_functions(); @@ -3479,35 +3476,35 @@ void t_java_generator::generate_service_async_client(t_service* tservice) { string result_name = (*f_iter)->get_name() + "_result"; // Main method body - indent(f_service_) << java_override_annotation() << endl; + indent(f_service_) << java_override_annotation() << '\n'; indent(f_service_) << "public " << function_signature_async(*f_iter, false) - << " throws org.apache.thrift.TException {" << endl; - indent(f_service_) << " checkReady();" << endl; + << " throws org.apache.thrift.TException {" << '\n'; + indent(f_service_) << " checkReady();" << '\n'; indent(f_service_) << " " << funclassname << " method_call = new " + funclassname + "(" << async_argument_list(*f_iter, arg_struct, ret_type) - << ", this, ___protocolFactory, ___transport);" << endl; - indent(f_service_) << " this.___currentMethod = method_call;" << endl; - indent(f_service_) << " ___manager.call(method_call);" << endl; - indent(f_service_) << "}" << endl; + << ", this, ___protocolFactory, ___transport);" << '\n'; + indent(f_service_) << " this.___currentMethod = method_call;" << '\n'; + indent(f_service_) << " ___manager.call(method_call);" << '\n'; + indent(f_service_) << "}" << '\n'; - f_service_ << endl; + f_service_ << '\n'; // TAsyncMethod object for this function call indent(f_service_) << "public static class " + funclassname + " extends org.apache.thrift.async.TAsyncMethodCall<" + type_name((*f_iter)->get_returntype(), true) + "> {" - << endl; + << '\n'; indent_up(); // Member variables for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { indent(f_service_) << "private " + type_name((*fld_iter)->get_type()) + " " + make_valid_java_identifier((*fld_iter)->get_name()) + ";" - << endl; + << '\n'; } // NOTE since we use a new Client instance to deserialize, let's keep seqid to 0 for now - // indent(f_service_) << "private int seqid;" << endl << endl; + // indent(f_service_) << "private int seqid;" << '\n' << '\n'; // Constructor indent(f_service_) << "public " + funclassname + "(" @@ -3516,22 +3513,22 @@ void t_java_generator::generate_service_async_client(t_service* tservice) { "org.apache.thrift.protocol.TProtocolFactory protocolFactory, " "org.apache.thrift.transport.TNonblockingTransport transport) throws " "org.apache.thrift.TException {" - << endl; + << '\n'; indent(f_service_) << " super(client, protocolFactory, transport, resultHandler, " - << ((*f_iter)->is_oneway() ? "true" : "false") << ");" << endl; + << ((*f_iter)->is_oneway() ? "true" : "false") << ");" << '\n'; // Assign member variables for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { indent(f_service_) << " this." + make_valid_java_identifier((*fld_iter)->get_name()) + " = " + make_valid_java_identifier((*fld_iter)->get_name()) + ";" - << endl; + << '\n'; } - indent(f_service_) << "}" << endl << endl; - indent(f_service_) << java_override_annotation() << endl; + indent(f_service_) << "}" << '\n' << '\n'; + indent(f_service_) << java_override_annotation() << '\n'; indent(f_service_) << "public void write_args(org.apache.thrift.protocol.TProtocol prot) " "throws org.apache.thrift.TException {" - << endl; + << '\n'; indent_up(); // Serialize request @@ -3539,68 +3536,68 @@ void t_java_generator::generate_service_async_client(t_service* tservice) { f_service_ << indent() << "prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"" << funname << "\", org.apache.thrift.protocol." << ((*f_iter)->is_oneway() ? "TMessageType.ONEWAY" : "TMessageType.CALL") << ", 0));" - << endl - << indent() << args_name << " args = new " << args_name << "();" << endl; + << '\n' + << indent() << args_name << " args = new " << args_name << "();" << '\n'; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { f_service_ << indent() << "args.set" << get_cap_name((*fld_iter)->get_name()) << "(" - << make_valid_java_identifier((*fld_iter)->get_name()) << ");" << endl; + << make_valid_java_identifier((*fld_iter)->get_name()) << ");" << '\n'; } - f_service_ << indent() << "args.write(prot);" << endl - << indent() << "prot.writeMessageEnd();" << endl; + f_service_ << indent() << "args.write(prot);" << '\n' + << indent() << "prot.writeMessageEnd();" << '\n'; indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; // Return method - indent(f_service_) << java_override_annotation() << endl; + indent(f_service_) << java_override_annotation() << '\n'; indent(f_service_) << "public " + type_name(ret_type, true) + " getResult() throws "; vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { f_service_ << type_name((*x_iter)->get_type(), false, false) + ", "; } - f_service_ << "org.apache.thrift.TException {" << endl; + f_service_ << "org.apache.thrift.TException {" << '\n'; indent_up(); f_service_ << indent() << "if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {" - << endl + << '\n' << indent() << " throw new java.lang.IllegalStateException(\"Method call not finished!\");" - << endl - << indent() << "}" << endl + << '\n' + << indent() << "}" << '\n' << indent() << "org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new " "org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());" - << endl + << '\n' << indent() << "org.apache.thrift.protocol.TProtocol prot = " "client.getProtocolFactory().getProtocol(memoryTransport);" - << endl; + << '\n'; indent(f_service_); if (ret_type->is_void()) { // NB: Includes oneways which always return void. if (!(*f_iter)->is_oneway()) { - f_service_ << "(new Client(prot)).recv" + sep + javaname + "();" << endl; + f_service_ << "(new Client(prot)).recv" + sep + javaname + "();" << '\n'; indent(f_service_); } - f_service_ << "return null;" << endl; + f_service_ << "return null;" << '\n'; } else { - f_service_ << "return (new Client(prot)).recv" + sep + javaname + "();" << endl; + f_service_ << "return (new Client(prot)).recv" + sep + javaname + "();" << '\n'; } // Close function indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; // Close class indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; } // Close AsyncClient scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; } /** @@ -3625,26 +3622,26 @@ void t_java_generator::generate_service_server(t_service* tservice) { // Generate the header portion indent(f_service_) << "public static class Processor extends " - << extends_processor << " implements org.apache.thrift.TProcessor {" << endl; + << extends_processor << " implements org.apache.thrift.TProcessor {" << '\n'; indent_up(); indent(f_service_) << "private static final org.slf4j.Logger _LOGGER = " "org.slf4j.LoggerFactory.getLogger(Processor.class.getName());" - << endl; + << '\n'; - indent(f_service_) << "public Processor(I iface) {" << endl; + indent(f_service_) << "public Processor(I iface) {" << '\n'; indent(f_service_) << " super(iface, getProcessMap(new java.util.HashMap>()));" - << endl; - indent(f_service_) << "}" << endl << endl; + << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; indent(f_service_) << "protected Processor(I iface, java.util.Map> processMap) {" - << endl; - indent(f_service_) << " super(iface, getProcessMap(processMap));" << endl; - indent(f_service_) << "}" << endl << endl; + << '\n'; + indent(f_service_) << " super(iface, getProcessMap(processMap));" << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; indent(f_service_) << "private static java.util.Map> processMap) {" - << endl; + << '\n'; indent_up(); for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { indent(f_service_) << "processMap.put(\"" << (*f_iter)->get_name() << "\", new " - << make_valid_java_identifier((*f_iter)->get_name()) << "());" << endl; + << make_valid_java_identifier((*f_iter)->get_name()) << "());" << '\n'; } - indent(f_service_) << "return processMap;" << endl; + indent(f_service_) << "return processMap;" << '\n'; indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; // Generate the process subfunctions for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -3668,7 +3665,7 @@ void t_java_generator::generate_service_server(t_service* tservice) { } indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; } /** @@ -3693,26 +3690,26 @@ void t_java_generator::generate_service_async_server(t_service* tservice) { // Generate the header portion indent(f_service_) << "public static class AsyncProcessor extends " - << extends_processor << " {" << endl; + << extends_processor << " {" << '\n'; indent_up(); indent(f_service_) << "private static final org.slf4j.Logger _LOGGER = " "org.slf4j.LoggerFactory.getLogger(AsyncProcessor.class.getName());" - << endl; + << '\n'; - indent(f_service_) << "public AsyncProcessor(I iface) {" << endl; + indent(f_service_) << "public AsyncProcessor(I iface) {" << '\n'; indent(f_service_) << " super(iface, getProcessMap(new java.util.HashMap>()));" - << endl; - indent(f_service_) << "}" << endl << endl; + << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; indent(f_service_) << "protected AsyncProcessor(I iface, java.util.Map> processMap) {" - << endl; - indent(f_service_) << " super(iface, getProcessMap(processMap));" << endl; - indent(f_service_) << "}" << endl << endl; + << '\n'; + indent(f_service_) << " super(iface, getProcessMap(processMap));" << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; indent(f_service_) << "private static java.util.Map> getProcessMap(java.util.Map> processMap) {" - << endl; + << '\n'; indent_up(); for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { indent(f_service_) << "processMap.put(\"" << (*f_iter)->get_name() << "\", new " - << make_valid_java_identifier((*f_iter)->get_name()) << "());" << endl; + << make_valid_java_identifier((*f_iter)->get_name()) << "());" << '\n'; } - indent(f_service_) << "return processMap;" << endl; + indent(f_service_) << "return processMap;" << '\n'; indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; // Generate the process subfunctions for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -3736,7 +3733,7 @@ void t_java_generator::generate_service_async_server(t_service* tservice) { } indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; } /** @@ -3784,101 +3781,101 @@ void t_java_generator::generate_process_async_function(t_service* tservice, t_fu // Open class indent(f_service_) << "public static class " << make_valid_java_identifier(tfunction->get_name()) << " extends org.apache.thrift.AsyncProcessFunction {" << endl; + << argsname << ", " << resulttype << ", " << resultname << "> {" << '\n'; indent_up(); - indent(f_service_) << "public " << make_valid_java_identifier(tfunction->get_name()) << "() {" << endl; - indent(f_service_) << " super(\"" << tfunction->get_name() << "\");" << endl; - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "public " << make_valid_java_identifier(tfunction->get_name()) << "() {" << '\n'; + indent(f_service_) << " super(\"" << tfunction->get_name() << "\");" << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; - indent(f_service_) << java_override_annotation() << endl; - indent(f_service_) << "public " << resultname << " getEmptyResultInstance() {" << endl; + indent(f_service_) << java_override_annotation() << '\n'; + indent(f_service_) << "public " << resultname << " getEmptyResultInstance() {" << '\n'; if (tfunction->is_oneway()) { - indent(f_service_) << " return null;" << endl; + indent(f_service_) << " return null;" << '\n'; } else { - indent(f_service_) << " return new " << resultname << "();" << endl; + indent(f_service_) << " return new " << resultname << "();" << '\n'; } - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; - indent(f_service_) << java_override_annotation() << endl; - indent(f_service_) << "public " << argsname << " getEmptyArgsInstance() {" << endl; - indent(f_service_) << " return new " << argsname << "();" << endl; - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << java_override_annotation() << '\n'; + indent(f_service_) << "public " << argsname << " getEmptyArgsInstance() {" << '\n'; + indent(f_service_) << " return new " << argsname << "();" << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; - indent(f_service_) << java_override_annotation() << endl; + indent(f_service_) << java_override_annotation() << '\n'; indent(f_service_) << "public org.apache.thrift.async.AsyncMethodCallback<" << resulttype << "> getResultHandler(final " "org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, " "final int seqid) {" - << endl; + << '\n'; indent_up(); - indent(f_service_) << "final org.apache.thrift.AsyncProcessFunction fcall = this;" << endl; + indent(f_service_) << "final org.apache.thrift.AsyncProcessFunction fcall = this;" << '\n'; indent(f_service_) << "return new org.apache.thrift.async.AsyncMethodCallback<" << resulttype - << ">() { " << endl; + << ">() { " << '\n'; indent_up(); - indent(f_service_) << java_override_annotation() << endl; - indent(f_service_) << "public void onComplete(" << resulttype << " o) {" << endl; + indent(f_service_) << java_override_annotation() << '\n'; + indent(f_service_) << "public void onComplete(" << resulttype << " o) {" << '\n'; indent_up(); if (!tfunction->is_oneway()) { - indent(f_service_) << resultname << " result = new " << resultname << "();" << endl; + indent(f_service_) << resultname << " result = new " << resultname << "();" << '\n'; if (!tfunction->get_returntype()->is_void()) { - indent(f_service_) << "result.success = o;" << endl; + indent(f_service_) << "result.success = o;" << '\n'; // Set isset on success field if (!type_can_be_null(tfunction->get_returntype())) { indent(f_service_) << "result.set" << get_cap_name("success") << get_cap_name("isSet") - << "(true);" << endl; + << "(true);" << '\n'; } } - indent(f_service_) << "try {" << endl; + indent(f_service_) << "try {" << '\n'; indent(f_service_) << " fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);" - << endl; - indent(f_service_) << "} catch (org.apache.thrift.transport.TTransportException e) {" << endl; + << '\n'; + indent(f_service_) << "} catch (org.apache.thrift.transport.TTransportException e) {" << '\n'; indent_up(); f_service_ << indent() << "_LOGGER.error(\"TTransportException writing to internal frame buffer\", e);" - << endl - << indent() << "fb.close();" << endl; + << '\n' + << indent() << "fb.close();" << '\n'; indent_down(); - indent(f_service_) << "} catch (java.lang.Exception e) {" << endl; + indent(f_service_) << "} catch (java.lang.Exception e) {" << '\n'; indent_up(); f_service_ << indent() << "_LOGGER.error(\"Exception writing to internal frame buffer\", e);" - << endl - << indent() << "onError(e);" << endl; + << '\n' + << indent() << "onError(e);" << '\n'; indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; - indent(f_service_) << java_override_annotation() << endl; - indent(f_service_) << "public void onError(java.lang.Exception e) {" << endl; + indent(f_service_) << java_override_annotation() << '\n'; + indent(f_service_) << "public void onError(java.lang.Exception e) {" << '\n'; indent_up(); if (tfunction->is_oneway()) { indent(f_service_) << "if (e instanceof org.apache.thrift.transport.TTransportException) {" - << endl; + << '\n'; indent_up(); - f_service_ << indent() << "_LOGGER.error(\"TTransportException inside handler\", e);" << endl - << indent() << "fb.close();" << endl; + f_service_ << indent() << "_LOGGER.error(\"TTransportException inside handler\", e);" << '\n' + << indent() << "fb.close();" << '\n'; indent_down(); - indent(f_service_) << "} else {" << endl; + indent(f_service_) << "} else {" << '\n'; indent_up(); - f_service_ << indent() << "_LOGGER.error(\"Exception inside oneway handler\", e);" << endl; + f_service_ << indent() << "_LOGGER.error(\"Exception inside oneway handler\", e);" << '\n'; indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } else { - indent(f_service_) << "byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;" << endl; - indent(f_service_) << "org.apache.thrift.TSerializable msg;" << endl; - indent(f_service_) << resultname << " result = new " << resultname << "();" << endl; + indent(f_service_) << "byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;" << '\n'; + indent(f_service_) << "org.apache.thrift.TSerializable msg;" << '\n'; + indent(f_service_) << resultname << " result = new " << resultname << "();" << '\n'; t_struct* xs = tfunction->get_xceptions(); const std::vector& xceptions = xs->get_members(); @@ -3890,66 +3887,66 @@ void t_java_generator::generate_process_async_function(t_service* tservice, t_fu f_service_ << indent(); string type = type_name((*x_iter)->get_type(), false, false); string name = (*x_iter)->get_name(); - f_service_ << "if (e instanceof " << type << ") {" << endl; + f_service_ << "if (e instanceof " << type << ") {" << '\n'; indent_up(); - f_service_ << indent() << "result." << make_valid_java_identifier(name) << " = (" << type << ") e;" << endl + f_service_ << indent() << "result." << make_valid_java_identifier(name) << " = (" << type << ") e;" << '\n' << indent() << "result.set" << get_cap_name(name) << get_cap_name("isSet") - << "(true);" << endl - << indent() << "msg = result;" << endl; + << "(true);" << '\n' + << indent() << "msg = result;" << '\n'; indent_down(); indent(f_service_) << "} else "; } } else { indent(f_service_); } - f_service_ << "if (e instanceof org.apache.thrift.transport.TTransportException) {" << endl; + f_service_ << "if (e instanceof org.apache.thrift.transport.TTransportException) {" << '\n'; indent_up(); - f_service_ << indent() << "_LOGGER.error(\"TTransportException inside handler\", e);" << endl - << indent() << "fb.close();" << endl - << indent() << "return;" << endl; + f_service_ << indent() << "_LOGGER.error(\"TTransportException inside handler\", e);" << '\n' + << indent() << "fb.close();" << '\n' + << indent() << "return;" << '\n'; indent_down(); indent(f_service_) << "} else if (e instanceof org.apache.thrift.TApplicationException) {" - << endl; + << '\n'; indent_up(); - f_service_ << indent() << "_LOGGER.error(\"TApplicationException inside handler\", e);" << endl - << indent() << "msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;" << endl - << indent() << "msg = (org.apache.thrift.TApplicationException)e;" << endl; + f_service_ << indent() << "_LOGGER.error(\"TApplicationException inside handler\", e);" << '\n' + << indent() << "msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;" << '\n' + << indent() << "msg = (org.apache.thrift.TApplicationException)e;" << '\n'; indent_down(); - indent(f_service_) << "} else {" << endl; + indent(f_service_) << "} else {" << '\n'; indent_up(); - f_service_ << indent() << "_LOGGER.error(\"Exception inside handler\", e);" << endl - << indent() << "msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;" << endl + f_service_ << indent() << "_LOGGER.error(\"Exception inside handler\", e);" << '\n' + << indent() << "msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;" << '\n' << indent() << "msg = new " "org.apache.thrift.TApplicationException(org.apache.thrift." "TApplicationException.INTERNAL_ERROR, e.getMessage());" - << endl; + << '\n'; indent_down(); - f_service_ << indent() << "}" << endl - << indent() << "try {" << endl - << indent() << " fcall.sendResponse(fb,msg,msgType,seqid);" << endl - << indent() << "} catch (java.lang.Exception ex) {" << endl + f_service_ << indent() << "}" << '\n' + << indent() << "try {" << '\n' + << indent() << " fcall.sendResponse(fb,msg,msgType,seqid);" << '\n' + << indent() << "} catch (java.lang.Exception ex) {" << '\n' << indent() << " _LOGGER.error(\"Exception writing to internal frame buffer\", ex);" - << endl - << indent() << " fb.close();" << endl - << indent() << "}" << endl; + << '\n' + << indent() << " fb.close();" << '\n' + << indent() << "}" << '\n'; } indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; indent_down(); - indent(f_service_) << "};" << endl; + indent(f_service_) << "};" << '\n'; indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; - indent(f_service_) << java_override_annotation() << endl; - indent(f_service_) << "public boolean isOneway() {" << endl; - indent(f_service_) << " return " << ((tfunction->is_oneway()) ? "true" : "false") << ";" << endl; - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << java_override_annotation() << '\n'; + indent(f_service_) << "public boolean isOneway() {" << '\n'; + indent(f_service_) << " return " << ((tfunction->is_oneway()) ? "true" : "false") << ";" << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; - indent(f_service_) << java_override_annotation() << endl; + indent(f_service_) << java_override_annotation() << '\n'; indent(f_service_) << "public void start(I iface, " << argsname << " args, org.apache.thrift.async.AsyncMethodCallback<" << resulttype - << "> resultHandler) throws org.apache.thrift.TException {" << endl; + << "> resultHandler) throws org.apache.thrift.TException {" << '\n'; indent_up(); // Generate the function call @@ -3971,17 +3968,17 @@ void t_java_generator::generate_process_async_function(t_service* tservice, t_fu if (!first) f_service_ << ","; f_service_ << "resultHandler"; - f_service_ << ");" << endl; + f_service_ << ");" << '\n'; indent_down(); indent(f_service_) << "}"; // Close function - f_service_ << endl; + f_service_ << '\n'; // Close class indent_down(); - f_service_ << indent() << "}" << endl << endl; + f_service_ << indent() << "}" << '\n' << '\n'; } /** @@ -4000,45 +3997,45 @@ void t_java_generator::generate_process_function(t_service* tservice, t_function // Open class indent(f_service_) << "public static class " << make_valid_java_identifier(tfunction->get_name()) << " extends org.apache.thrift.ProcessFunction {" << endl; + << argsname << ", " << resultname << "> {" << '\n'; indent_up(); - indent(f_service_) << "public " << make_valid_java_identifier(tfunction->get_name()) << "() {" << endl; - indent(f_service_) << " super(\"" << tfunction->get_name() << "\");" << endl; - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "public " << make_valid_java_identifier(tfunction->get_name()) << "() {" << '\n'; + indent(f_service_) << " super(\"" << tfunction->get_name() << "\");" << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; - indent(f_service_) << java_override_annotation() << endl; - indent(f_service_) << "public " << argsname << " getEmptyArgsInstance() {" << endl; - indent(f_service_) << " return new " << argsname << "();" << endl; - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << java_override_annotation() << '\n'; + indent(f_service_) << "public " << argsname << " getEmptyArgsInstance() {" << '\n'; + indent(f_service_) << " return new " << argsname << "();" << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; - indent(f_service_) << java_override_annotation() << endl; - indent(f_service_) << "public boolean isOneway() {" << endl; - indent(f_service_) << " return " << ((tfunction->is_oneway()) ? "true" : "false") << ";" << endl; - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << java_override_annotation() << '\n'; + indent(f_service_) << "public boolean isOneway() {" << '\n'; + indent(f_service_) << " return " << ((tfunction->is_oneway()) ? "true" : "false") << ";" << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; - indent(f_service_) << java_override_annotation() << endl; - indent(f_service_) << "protected boolean rethrowUnhandledExceptions() {" << endl; + indent(f_service_) << java_override_annotation() << '\n'; + indent(f_service_) << "protected boolean rethrowUnhandledExceptions() {" << '\n'; indent(f_service_) << " return " << ((rethrow_unhandled_exceptions_) ? "true" : "false") << ";" - << endl; - indent(f_service_) << "}" << endl << endl; + << '\n'; + indent(f_service_) << "}" << '\n' << '\n'; - indent(f_service_) << java_override_annotation() << endl; - indent(f_service_) << "public " << resultname << " getEmptyResultInstance() {" << endl; + indent(f_service_) << java_override_annotation() << '\n'; + indent(f_service_) << "public " << resultname << " getEmptyResultInstance() {" << '\n'; if (tfunction->is_oneway()) { - indent(f_service_) << " return null;" << endl; + indent(f_service_) << " return null;" << '\n'; } else { - indent(f_service_) << " return new " << resultname << "();" << endl; + indent(f_service_) << " return new " << resultname << "();" << '\n'; } - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; - indent(f_service_) << java_override_annotation() << endl; + indent(f_service_) << java_override_annotation() << '\n'; indent(f_service_) << "public " << resultname << " getResult(I iface, " << argsname - << " args) throws org.apache.thrift.TException {" << endl; + << " args) throws org.apache.thrift.TException {" << '\n'; indent_up(); if (!tfunction->is_oneway()) { - indent(f_service_) << resultname << " result = getEmptyResultInstance();" << endl; + indent(f_service_) << resultname << " result = getEmptyResultInstance();" << '\n'; } t_struct* xs = tfunction->get_xceptions(); @@ -4047,7 +4044,7 @@ void t_java_generator::generate_process_function(t_service* tservice, t_function // Try block for a function with exceptions if (xceptions.size() > 0) { - f_service_ << indent() << "try {" << endl; + f_service_ << indent() << "try {" << '\n'; indent_up(); } @@ -4070,13 +4067,13 @@ void t_java_generator::generate_process_function(t_service* tservice, t_function } f_service_ << "args." << make_valid_java_identifier((*f_iter)->get_name()); } - f_service_ << ");" << endl; + f_service_ << ");" << '\n'; // Set isset on success field if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void() && !type_can_be_null(tfunction->get_returntype())) { indent(f_service_) << "result.set" << get_cap_name("success") << get_cap_name("isSet") - << "(true);" << endl; + << "(true);" << '\n'; } if (!tfunction->is_oneway() && xceptions.size() > 0) { @@ -4084,34 +4081,34 @@ void t_java_generator::generate_process_function(t_service* tservice, t_function f_service_ << indent() << "}"; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { f_service_ << " catch (" << type_name((*x_iter)->get_type(), false, false) << " " - << make_valid_java_identifier((*x_iter)->get_name()) << ") {" << endl; + << make_valid_java_identifier((*x_iter)->get_name()) << ") {" << '\n'; if (!tfunction->is_oneway()) { indent_up(); f_service_ << indent() << "result." << make_valid_java_identifier((*x_iter)->get_name()) << " = " - << make_valid_java_identifier((*x_iter)->get_name()) << ";" << endl; + << make_valid_java_identifier((*x_iter)->get_name()) << ";" << '\n'; indent_down(); f_service_ << indent() << "}"; } else { f_service_ << "}"; } } - f_service_ << endl; + f_service_ << '\n'; } if (tfunction->is_oneway()) { - indent(f_service_) << "return null;" << endl; + indent(f_service_) << "return null;" << '\n'; } else { - indent(f_service_) << "return result;" << endl; + indent(f_service_) << "return result;" << '\n'; } indent_down(); indent(f_service_) << "}"; // Close function - f_service_ << endl; + f_service_ << '\n'; // Close class indent_down(); - f_service_ << indent() << "}" << endl << endl; + f_service_ << indent() << "}" << '\n' << '\n'; } /** @@ -4175,12 +4172,12 @@ void t_java_generator::generate_deserialize_field(ostream& out, default: throw "compiler error: no Java name for base type " + t_base_type::t_base_name(tbase); } - out << endl; + out << '\n'; } else if (type->is_enum()) { indent(out) << name << " = " << type_name(tfield->get_type(), true, false, false, true) + ".findByValue(iprot.readI32());" - << endl; + << '\n'; } else { printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", tfield->get_name().c_str(), type_name(type).c_str()); @@ -4193,15 +4190,15 @@ void t_java_generator::generate_deserialize_field(ostream& out, void t_java_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) { if (reuse_objects_) { - indent(out) << "if (" << prefix << " == null) {" << endl; + indent(out) << "if (" << prefix << " == null) {" << '\n'; indent_up(); } - indent(out) << prefix << " = new " << type_name(tstruct) << "();" << endl; + indent(out) << prefix << " = new " << type_name(tstruct) << "();" << '\n'; if (reuse_objects_) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } - indent(out) << prefix << ".read(iprot);" << endl; + indent(out) << prefix << ".read(iprot);" << '\n'; } /** @@ -4228,31 +4225,31 @@ void t_java_generator::generate_deserialize_container(ostream& out, // Declare variables, read header if (ttype->is_map()) { indent(out) << "org.apache.thrift.protocol.TMap " << obj << " = iprot.readMapBegin();" - << endl; + << '\n'; } else if (ttype->is_set()) { indent(out) << "org.apache.thrift.protocol.TSet " << obj << " = iprot.readSetBegin();" - << endl; + << '\n'; } else if (ttype->is_list()) { indent(out) << "org.apache.thrift.protocol.TList " << obj << " = iprot.readListBegin();" - << endl; + << '\n'; } } else { // Declare variables, read header if (ttype->is_map()) { indent(out) << "org.apache.thrift.protocol.TMap " << obj << " = iprot.readMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " - << type_to_enum(((t_map*)ttype)->get_val_type()) << "); " << endl; + << type_to_enum(((t_map*)ttype)->get_val_type()) << "); " << '\n'; } else if (ttype->is_set()) { indent(out) << "org.apache.thrift.protocol.TSet " << obj << " = iprot.readSetBegin(" - << type_to_enum(((t_set*)ttype)->get_elem_type()) << ");" << endl; + << type_to_enum(((t_set*)ttype)->get_elem_type()) << ");" << '\n'; } else if (ttype->is_list()) { indent(out) << "org.apache.thrift.protocol.TList " << obj << " = iprot.readListBegin(" - << type_to_enum(((t_list*)ttype)->get_elem_type()) << ");" << endl; + << type_to_enum(((t_list*)ttype)->get_elem_type()) << ");" << '\n'; } } if (reuse_objects_) { - indent(out) << "if (" << prefix << " == null) {" << endl; + indent(out) << "if (" << prefix << " == null) {" << '\n'; indent_up(); } @@ -4264,18 +4261,18 @@ void t_java_generator::generate_deserialize_container(ostream& out, // construct the collection correctly i.e. with appropriate size/type if (is_enum_set(ttype) || is_enum_map(ttype)) { - out << "(" << inner_enum_type_name(ttype) << ");" << endl; + out << "(" << inner_enum_type_name(ttype) << ");" << '\n'; } else if (sorted_containers_ && (ttype->is_map() || ttype->is_set())) { // TreeSet and TreeMap don't have any constructor which takes a capacity as an argument - out << "();" << endl; + out << "();" << '\n'; } else { out << "(" << (ttype->is_list() ? "" : "2*") << obj << ".size" - << ");" << endl; + << ");" << '\n'; } if (reuse_objects_) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } if (ttype->is_map()) { @@ -4291,11 +4288,11 @@ void t_java_generator::generate_deserialize_container(ostream& out, if (has_metadata) { // Read container end if (ttype->is_map()) { - indent(out) << "iprot.readMapEnd();" << endl; + indent(out) << "iprot.readMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "iprot.readSetEnd();" << endl; + indent(out) << "iprot.readSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "iprot.readListEnd();" << endl; + indent(out) << "iprot.readListEnd();" << '\n'; } } scope_down(out); @@ -4314,14 +4311,14 @@ void t_java_generator::generate_deserialize_map_element(ostream& out, t_field fkey(tmap->get_key_type(), key); t_field fval(tmap->get_val_type(), val); - indent(out) << declare_field(&fkey, reuse_objects_, false) << endl; - indent(out) << declare_field(&fval, reuse_objects_, false) << endl; + indent(out) << declare_field(&fkey, reuse_objects_, false) << '\n'; + indent(out) << declare_field(&fval, reuse_objects_, false) << '\n'; // For loop iterates over elements string i = tmp("_i"); indent(out) << "for (int " << i << " = 0; " << i << " < " << obj << ".size" << "; " - << "++" << i << ")" << endl; + << "++" << i << ")" << '\n'; scope_up(out); @@ -4329,22 +4326,22 @@ void t_java_generator::generate_deserialize_map_element(ostream& out, generate_deserialize_field(out, &fval, "", has_metadata); if (get_true_type(fkey.get_type())->is_enum()) { - indent(out) << "if (" << key << " != null)" << endl; + indent(out) << "if (" << key << " != null)" << '\n'; scope_up(out); } - indent(out) << prefix << ".put(" << key << ", " << val << ");" << endl; + indent(out) << prefix << ".put(" << key << ", " << val << ");" << '\n'; if (get_true_type(fkey.get_type())->is_enum()) { scope_down(out); } if (reuse_objects_ && !get_true_type(fkey.get_type())->is_base_type()) { - indent(out) << key << " = null;" << endl; + indent(out) << key << " = null;" << '\n'; } if (reuse_objects_ && !get_true_type(fval.get_type())->is_base_type()) { - indent(out) << val << " = null;" << endl; + indent(out) << val << " = null;" << '\n'; } } @@ -4359,30 +4356,30 @@ void t_java_generator::generate_deserialize_set_element(ostream& out, string elem = tmp("_elem"); t_field felem(tset->get_elem_type(), elem); - indent(out) << declare_field(&felem, reuse_objects_, false) << endl; + indent(out) << declare_field(&felem, reuse_objects_, false) << '\n'; // For loop iterates over elements string i = tmp("_i"); indent(out) << "for (int " << i << " = 0; " << i << " < " << obj << ".size" << "; " - << "++" << i << ")" << endl; + << "++" << i << ")" << '\n'; scope_up(out); generate_deserialize_field(out, &felem, "", has_metadata); if (get_true_type(felem.get_type())->is_enum()) { - indent(out) << "if (" << elem << " != null)" << endl; + indent(out) << "if (" << elem << " != null)" << '\n'; scope_up(out); } - indent(out) << prefix << ".add(" << elem << ");" << endl; + indent(out) << prefix << ".add(" << elem << ");" << '\n'; if (get_true_type(felem.get_type())->is_enum()) { scope_down(out); } if (reuse_objects_ && !get_true_type(felem.get_type())->is_base_type()) { - indent(out) << elem << " = null;" << endl; + indent(out) << elem << " = null;" << '\n'; } } @@ -4397,30 +4394,30 @@ void t_java_generator::generate_deserialize_list_element(ostream& out, string elem = tmp("_elem"); t_field felem(tlist->get_elem_type(), elem); - indent(out) << declare_field(&felem, reuse_objects_, false) << endl; + indent(out) << declare_field(&felem, reuse_objects_, false) << '\n'; // For loop iterates over elements string i = tmp("_i"); indent(out) << "for (int " << i << " = 0; " << i << " < " << obj << ".size" << "; " - << "++" << i << ")" << endl; + << "++" << i << ")" << '\n'; scope_up(out); generate_deserialize_field(out, &felem, "", has_metadata); if (get_true_type(felem.get_type())->is_enum()) { - indent(out) << "if (" << elem << " != null)" << endl; + indent(out) << "if (" << elem << " != null)" << '\n'; scope_up(out); } - indent(out) << prefix << ".add(" << elem << ");" << endl; + indent(out) << prefix << ".add(" << elem << ");" << '\n'; if (get_true_type(felem.get_type())->is_enum()) { scope_down(out); } if (reuse_objects_ && !get_true_type(felem.get_type())->is_base_type()) { - indent(out) << elem << " = null;" << endl; + indent(out) << elem << " = null;" << '\n'; } } @@ -4446,7 +4443,7 @@ void t_java_generator::generate_serialize_field(ostream& out, } else if (type->is_container()) { generate_serialize_container(out, type, prefix + make_valid_java_identifier(tfield->get_name()) + postfix, has_metadata); } else if (type->is_enum()) { - indent(out) << "oprot.writeI32(" << prefix + make_valid_java_identifier(tfield->get_name()) + postfix << ".getValue());" << endl; + indent(out) << "oprot.writeI32(" << prefix + make_valid_java_identifier(tfield->get_name()) + postfix << ".getValue());" << '\n'; } else if (type->is_base_type()) { string name = prefix + make_valid_java_identifier(tfield->get_name()) + postfix; indent(out) << "oprot."; @@ -4491,7 +4488,7 @@ void t_java_generator::generate_serialize_field(ostream& out, } else if (type->is_enum()) { out << "writeI32(struct." << name << ");"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s%s' TYPE '%s'\n", prefix.c_str(), tfield->get_name().c_str(), postfix.c_str(), type_name(type).c_str()); @@ -4506,7 +4503,7 @@ void t_java_generator::generate_serialize_field(ostream& out, */ void t_java_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) { (void)tstruct; - out << indent() << prefix << ".write(oprot);" << endl; + out << indent() << prefix << ".write(oprot);" << '\n'; } /** @@ -4526,18 +4523,18 @@ void t_java_generator::generate_serialize_container(ostream& out, indent(out) << "oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << prefix << ".size()));" - << endl; + << '\n'; } else if (ttype->is_set()) { indent(out) << "oprot.writeSetBegin(new org.apache.thrift.protocol.TSet(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " << prefix - << ".size()));" << endl; + << ".size()));" << '\n'; } else if (ttype->is_list()) { indent(out) << "oprot.writeListBegin(new org.apache.thrift.protocol.TList(" << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << prefix - << ".size()));" << endl; + << ".size()));" << '\n'; } } else { - indent(out) << "oprot.writeI32(" << prefix << ".size());" << endl; + indent(out) << "oprot.writeI32(" << prefix << ".size());" << '\n'; } string iter = tmp("_iter"); @@ -4554,7 +4551,7 @@ void t_java_generator::generate_serialize_container(ostream& out, << prefix << ")"; } - out << endl; + out << '\n'; scope_up(out); if (ttype->is_map()) { generate_serialize_map_element(out, (t_map*)ttype, iter, prefix, has_metadata); @@ -4567,11 +4564,11 @@ void t_java_generator::generate_serialize_container(ostream& out, if (has_metadata) { if (ttype->is_map()) { - indent(out) << "oprot.writeMapEnd();" << endl; + indent(out) << "oprot.writeMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "oprot.writeSetEnd();" << endl; + indent(out) << "oprot.writeSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "oprot.writeListEnd();" << endl; + indent(out) << "oprot.writeListEnd();" << '\n'; } } @@ -5101,7 +5098,7 @@ void t_java_generator::generate_deep_copy_container(ostream& out, // deep copy of base types can be done much more efficiently than iterating over all the // elements manually indent(out) << type_name(type, true, false) << " " << result_name << " = new " - << type_name(container, false, true) << "(" << source_name << ");" << endl; + << type_name(container, false, true) << "(" << source_name << ");" << '\n'; return; } @@ -5116,10 +5113,10 @@ void t_java_generator::generate_deep_copy_container(ostream& out, if (is_enum_set(container)) { indent(out) << type_name(type, true, false) << " " << result_name << " = " << type_name(container, false, true, true) << ".noneOf(" << constructor_args << ");" - << endl; + << '\n'; } else { indent(out) << type_name(type, true, false) << " " << result_name << " = new " - << type_name(container, false, true) << "(" << constructor_args << ");" << endl; + << type_name(container, false, true) << "(" << constructor_args << ");" << '\n'; } std::string iterator_element_name = source_name_p1 + "_element"; @@ -5131,17 +5128,17 @@ void t_java_generator::generate_deep_copy_container(ostream& out, indent(out) << "for (java.util.Map.Entry<" << type_name(key_type, true, false) << ", " << type_name(val_type, true, false) << "> " << iterator_element_name << " : " - << source_name << ".entrySet()) {" << endl; + << source_name << ".entrySet()) {" << '\n'; indent_up(); - out << endl; + out << '\n'; indent(out) << type_name(key_type, true, false) << " " << iterator_element_name - << "_key = " << iterator_element_name << ".getKey();" << endl; + << "_key = " << iterator_element_name << ".getKey();" << '\n'; indent(out) << type_name(val_type, true, false) << " " << iterator_element_name - << "_value = " << iterator_element_name << ".getValue();" << endl; + << "_value = " << iterator_element_name << ".getValue();" << '\n'; - out << endl; + out << '\n'; if (key_type->is_container()) { generate_deep_copy_container(out, iterator_element_name + "_key", "", @@ -5150,10 +5147,10 @@ void t_java_generator::generate_deep_copy_container(ostream& out, indent(out) << type_name(key_type, true, false) << " " << result_element_name << "_key = "; generate_deep_copy_non_container(out, iterator_element_name + "_key", result_element_name + "_key", key_type); - out << ";" << endl; + out << ";" << '\n'; } - out << endl; + out << '\n'; if (val_type->is_container()) { generate_deep_copy_container(out, iterator_element_name + "_value", "", @@ -5162,16 +5159,16 @@ void t_java_generator::generate_deep_copy_container(ostream& out, indent(out) << type_name(val_type, true, false) << " " << result_element_name << "_value = "; generate_deep_copy_non_container(out, iterator_element_name + "_value", result_element_name + "_value", val_type); - out << ";" << endl; + out << ";" << '\n'; } - out << endl; + out << '\n'; indent(out) << result_name << ".put(" << result_element_name << "_key, " << result_element_name - << "_value);" << endl; + << "_value);" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } else { t_type* elem_type; @@ -5183,32 +5180,32 @@ void t_java_generator::generate_deep_copy_container(ostream& out, } indent(out) << "for (" << type_name(elem_type, true, false) << " " << iterator_element_name - << " : " << source_name << ") {" << endl; + << " : " << source_name << ") {" << '\n'; indent_up(); if (elem_type->is_container()) { // recursive deep copy generate_deep_copy_container(out, iterator_element_name, "", result_element_name, elem_type); - indent(out) << result_name << ".add(" << result_element_name << ");" << endl; + indent(out) << result_name << ".add(" << result_element_name << ");" << '\n'; } else { // iterative copy if (elem_type->is_binary()) { indent(out) << "java.nio.ByteBuffer temp_binary_element = "; generate_deep_copy_non_container(out, iterator_element_name, "temp_binary_element", elem_type); - out << ";" << endl; - indent(out) << result_name << ".add(temp_binary_element);" << endl; + out << ";" << '\n'; + indent(out) << result_name << ".add(temp_binary_element);" << '\n'; } else { indent(out) << result_name << ".add("; generate_deep_copy_non_container(out, iterator_element_name, result_name, elem_type); - out << ");" << endl; + out << ");" << '\n'; } } indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } @@ -5245,14 +5242,14 @@ std::string t_java_generator::generate_isset_check(std::string field_name) { void t_java_generator::generate_isset_set(ostream& out, t_field* field, string prefix) { if (!type_can_be_null(field->get_type())) { indent(out) << prefix << "set" << get_cap_name(field->get_name()) << get_cap_name("isSet") - << "(true);" << endl; + << "(true);" << '\n'; } } void t_java_generator::generate_struct_desc(ostream& out, t_struct* tstruct) { indent(out) << "private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new " "org.apache.thrift.protocol.TStruct(\"" - << tstruct->get_name() << "\");" << endl; + << tstruct->get_name() << "\");" << '\n'; } void t_java_generator::generate_field_descs(ostream& out, t_struct* tstruct) { @@ -5264,24 +5261,24 @@ void t_java_generator::generate_field_descs(ostream& out, t_struct* tstruct) { << constant_name((*m_iter)->get_name()) << "_FIELD_DESC = new org.apache.thrift.protocol.TField(\"" << (*m_iter)->get_name() << "\", " << type_to_enum((*m_iter)->get_type()) << ", " - << "(short)" << (*m_iter)->get_key() << ");" << endl; + << "(short)" << (*m_iter)->get_key() << ");" << '\n'; } } void t_java_generator::generate_scheme_map(ostream& out, t_struct* tstruct) { indent(out) << "private static final org.apache.thrift.scheme.SchemeFactory " "STANDARD_SCHEME_FACTORY = new " - << tstruct->get_name() << "StandardSchemeFactory();" << endl; + << tstruct->get_name() << "StandardSchemeFactory();" << '\n'; indent(out) << "private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new " - << tstruct->get_name() << "TupleSchemeFactory();" << endl; + << tstruct->get_name() << "TupleSchemeFactory();" << '\n'; } void t_java_generator::generate_field_name_constants(ostream& out, t_struct* tstruct) { indent(out) << "/** The set of fields this struct contains, along with convenience methods for " "finding and manipulating them. */" - << endl; - indent(out) << "public enum _Fields implements org.apache.thrift.TFieldIdEnum {" << endl; + << '\n'; + indent(out) << "public enum _Fields implements org.apache.thrift.TFieldIdEnum {" << '\n'; indent_up(); bool first = true; @@ -5289,7 +5286,7 @@ void t_java_generator::generate_field_name_constants(ostream& out, t_struct* tst vector::const_iterator m_iter; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if (!first) { - out << "," << endl; + out << "," << '\n'; } first = false; generate_java_doc(out, *m_iter); @@ -5297,87 +5294,87 @@ void t_java_generator::generate_field_name_constants(ostream& out, t_struct* tst << ", \"" << (*m_iter)->get_name() << "\")"; } - out << ";" << endl << endl; + out << ";" << '\n' << '\n'; indent(out) << "private static final java.util.Map byName = new " "java.util.HashMap();" - << endl; - out << endl; + << '\n'; + out << '\n'; - indent(out) << "static {" << endl; - indent(out) << " for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {" << endl; - indent(out) << " byName.put(field.getFieldName(), field);" << endl; - indent(out) << " }" << endl; - indent(out) << "}" << endl << endl; + indent(out) << "static {" << '\n'; + indent(out) << " for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {" << '\n'; + indent(out) << " byName.put(field.getFieldName(), field);" << '\n'; + indent(out) << " }" << '\n'; + indent(out) << "}" << '\n' << '\n'; - indent(out) << "/**" << endl; + indent(out) << "/**" << '\n'; indent(out) << " * Find the _Fields constant that matches fieldId, or null if its not found." - << endl; - indent(out) << " */" << endl; - indent(out) << java_nullable_annotation() << endl; - indent(out) << "public static _Fields findByThriftId(int fieldId) {" << endl; + << '\n'; + indent(out) << " */" << '\n'; + indent(out) << java_nullable_annotation() << '\n'; + indent(out) << "public static _Fields findByThriftId(int fieldId) {" << '\n'; indent_up(); - indent(out) << "switch(fieldId) {" << endl; + indent(out) << "switch(fieldId) {" << '\n'; indent_up(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { indent(out) << "case " << (*m_iter)->get_key() << ": // " - << constant_name((*m_iter)->get_name()) << endl; - indent(out) << " return " << constant_name((*m_iter)->get_name()) << ";" << endl; + << constant_name((*m_iter)->get_name()) << '\n'; + indent(out) << " return " << constant_name((*m_iter)->get_name()) << ";" << '\n'; } - indent(out) << "default:" << endl; - indent(out) << " return null;" << endl; + indent(out) << "default:" << '\n'; + indent(out) << " return null;" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; - - indent(out) << "/**" << endl; - indent(out) << " * Find the _Fields constant that matches fieldId, throwing an exception" << endl; - indent(out) << " * if it is not found." << endl; - indent(out) << " */" << endl; - indent(out) << "public static _Fields findByThriftIdOrThrow(int fieldId) {" << endl; - indent(out) << " _Fields fields = findByThriftId(fieldId);" << endl; + indent(out) << "}" << '\n' << '\n'; + + indent(out) << "/**" << '\n'; + indent(out) << " * Find the _Fields constant that matches fieldId, throwing an exception" << '\n'; + indent(out) << " * if it is not found." << '\n'; + indent(out) << " */" << '\n'; + indent(out) << "public static _Fields findByThriftIdOrThrow(int fieldId) {" << '\n'; + indent(out) << " _Fields fields = findByThriftId(fieldId);" << '\n'; indent(out) << " if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + " "fieldId + " "\" doesn't exist!\");" - << endl; - indent(out) << " return fields;" << endl; - indent(out) << "}" << endl << endl; + << '\n'; + indent(out) << " return fields;" << '\n'; + indent(out) << "}" << '\n' << '\n'; - indent(out) << "/**" << endl; + indent(out) << "/**" << '\n'; indent(out) << " * Find the _Fields constant that matches name, or null if its not found." - << endl; - indent(out) << " */" << endl; - indent(out) << java_nullable_annotation() << endl; - indent(out) << "public static _Fields findByName(java.lang.String name) {" << endl; - indent(out) << " return byName.get(name);" << endl; - indent(out) << "}" << endl << endl; - - indent(out) << "private final short _thriftId;" << endl; - indent(out) << "private final java.lang.String _fieldName;" << endl << endl; - - indent(out) << "_Fields(short thriftId, java.lang.String fieldName) {" << endl; - indent(out) << " _thriftId = thriftId;" << endl; - indent(out) << " _fieldName = fieldName;" << endl; - indent(out) << "}" << endl << endl; - - indent(out) << java_override_annotation() << endl; - indent(out) << "public short getThriftFieldId() {" << endl; - indent(out) << " return _thriftId;" << endl; - indent(out) << "}" << endl << endl; - - indent(out) << java_override_annotation() << endl; - indent(out) << "public java.lang.String getFieldName() {" << endl; - indent(out) << " return _fieldName;" << endl; - indent(out) << "}" << endl; + << '\n'; + indent(out) << " */" << '\n'; + indent(out) << java_nullable_annotation() << '\n'; + indent(out) << "public static _Fields findByName(java.lang.String name) {" << '\n'; + indent(out) << " return byName.get(name);" << '\n'; + indent(out) << "}" << '\n' << '\n'; + + indent(out) << "private final short _thriftId;" << '\n'; + indent(out) << "private final java.lang.String _fieldName;" << '\n' << '\n'; + + indent(out) << "_Fields(short thriftId, java.lang.String fieldName) {" << '\n'; + indent(out) << " _thriftId = thriftId;" << '\n'; + indent(out) << " _fieldName = fieldName;" << '\n'; + indent(out) << "}" << '\n' << '\n'; + + indent(out) << java_override_annotation() << '\n'; + indent(out) << "public short getThriftFieldId() {" << '\n'; + indent(out) << " return _thriftId;" << '\n'; + indent(out) << "}" << '\n' << '\n'; + + indent(out) << java_override_annotation() << '\n'; + indent(out) << "public java.lang.String getFieldName() {" << '\n'; + indent(out) << " return _fieldName;" << '\n'; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } t_java_generator::isset_type t_java_generator::needs_isset(t_struct* tstruct, @@ -5411,8 +5408,8 @@ t_java_generator::isset_type t_java_generator::needs_isset(t_struct* tstruct, } void t_java_generator::generate_java_struct_clear(std::ostream& out, t_struct* tstruct) { - indent(out) << java_override_annotation() << endl; - indent(out) << "public void clear() {" << endl; + indent(out) << java_override_annotation() << '\n'; + indent(out) << "public void clear() {" << '\n'; indent_up(); for (auto field : tstruct->get_members()) { @@ -5425,13 +5422,13 @@ void t_java_generator::generate_java_struct_clear(std::ostream& out, t_struct* t if (type_can_be_null(t)) { if (reuse_objects_ && (t->is_container() || t->is_struct())) { - indent(out) << "if (this." << make_valid_java_identifier(field->get_name()) << " != null) {" << endl; + indent(out) << "if (this." << make_valid_java_identifier(field->get_name()) << " != null) {" << '\n'; indent_up(); - indent(out) << "this." << make_valid_java_identifier(field->get_name()) << ".clear();" << endl; + indent(out) << "this." << make_valid_java_identifier(field->get_name()) << ".clear();" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } else { - indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = null;" << endl; + indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = null;" << '\n'; } continue; } @@ -5439,7 +5436,7 @@ void t_java_generator::generate_java_struct_clear(std::ostream& out, t_struct* t // must be a base type // means it also needs to be explicitly unset indent(out) << "set" << get_cap_name(field->get_name()) << get_cap_name("isSet") << "(false);" - << endl; + << '\n'; t_base_type* base_type = (t_base_type*)t; switch (base_type->get_base()) { @@ -5447,13 +5444,13 @@ void t_java_generator::generate_java_struct_clear(std::ostream& out, t_struct* t case t_base_type::TYPE_I16: case t_base_type::TYPE_I32: case t_base_type::TYPE_I64: - indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = 0;" << endl; + indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = 0;" << '\n'; break; case t_base_type::TYPE_DOUBLE: - indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = 0.0;" << endl; + indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = 0.0;" << '\n'; break; case t_base_type::TYPE_BOOL: - indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = false;" << endl; + indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = false;" << '\n'; break; default: throw "unsupported type: " + base_type->get_name() + " for field " + field->get_name(); @@ -5461,7 +5458,7 @@ void t_java_generator::generate_java_struct_clear(std::ostream& out, t_struct* t } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } // generates java method to serialize (in the Java sense) the object @@ -5469,24 +5466,24 @@ void t_java_generator::generate_java_struct_write_object(ostream& out, t_struct* (void)tstruct; indent(out) << "private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {" - << endl; - indent(out) << " try {" << endl; + << '\n'; + indent(out) << " try {" << '\n'; indent(out) << " write(new org.apache.thrift.protocol.TCompactProtocol(new " "org.apache.thrift.transport.TIOStreamTransport(out)));" - << endl; - indent(out) << " } catch (org.apache.thrift.TException te) {" << endl; + << '\n'; + indent(out) << " } catch (org.apache.thrift.TException te) {" << '\n'; indent(out) << " throw new java.io.IOException(te" << (android_legacy_ ? ".getMessage()" : "") - << ");" << endl; - indent(out) << " }" << endl; - indent(out) << "}" << endl << endl; + << ");" << '\n'; + indent(out) << " }" << '\n'; + indent(out) << "}" << '\n' << '\n'; } // generates java method to serialize (in the Java sense) the object void t_java_generator::generate_java_struct_read_object(ostream& out, t_struct* tstruct) { indent(out) << "private void readObject(java.io.ObjectInputStream in) throws " "java.io.IOException, java.lang.ClassNotFoundException {" - << endl; - indent(out) << " try {" << endl; + << '\n'; + indent(out) << " try {" << '\n'; if (!tstruct->is_union()) { switch (needs_isset(tstruct)) { case ISSET_NONE: @@ -5494,174 +5491,174 @@ void t_java_generator::generate_java_struct_read_object(ostream& out, t_struct* case ISSET_PRIMITIVE: indent(out) << " // it doesn't seem like you should have to do this, but java " "serialization is wacky, and doesn't call the default constructor." - << endl; - indent(out) << " __isset_bitfield = 0;" << endl; + << '\n'; + indent(out) << " __isset_bitfield = 0;" << '\n'; break; case ISSET_BITSET: indent(out) << " // it doesn't seem like you should have to do this, but java " "serialization is wacky, and doesn't call the default constructor." - << endl; - indent(out) << " __isset_bit_vector = new java.util.BitSet(1);" << endl; + << '\n'; + indent(out) << " __isset_bit_vector = new java.util.BitSet(1);" << '\n'; break; } } indent(out) << " read(new org.apache.thrift.protocol.TCompactProtocol(new " "org.apache.thrift.transport.TIOStreamTransport(in)));" - << endl; - indent(out) << " } catch (org.apache.thrift.TException te) {" << endl; + << '\n'; + indent(out) << " } catch (org.apache.thrift.TException te) {" << '\n'; indent(out) << " throw new java.io.IOException(te" << (android_legacy_ ? ".getMessage()" : "") - << ");" << endl; - indent(out) << " }" << endl; - indent(out) << "}" << endl << endl; + << ");" << '\n'; + indent(out) << " }" << '\n'; + indent(out) << "}" << '\n' << '\n'; } void t_java_generator::generate_standard_reader(ostream& out, t_struct* tstruct) { - indent(out) << java_override_annotation() << endl; + indent(out) << java_override_annotation() << '\n'; indent(out) << "public void read(org.apache.thrift.protocol.TProtocol iprot, " - << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << endl; + << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << '\n'; indent_up(); const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; // Declare stack tmp variables and read struct header - out << indent() << "org.apache.thrift.protocol.TField schemeField;" << endl - << indent() << "iprot.readStructBegin();" << endl; + out << indent() << "org.apache.thrift.protocol.TField schemeField;" << '\n' + << indent() << "iprot.readStructBegin();" << '\n'; // Loop over reading in fields - indent(out) << "while (true)" << endl; + indent(out) << "while (true)" << '\n'; scope_up(out); // Read beginning field marker - indent(out) << "schemeField = iprot.readFieldBegin();" << endl; + indent(out) << "schemeField = iprot.readFieldBegin();" << '\n'; // Check for field STOP marker and break - indent(out) << "if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { " << endl; + indent(out) << "if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { " << '\n'; indent_up(); - indent(out) << "break;" << endl; + indent(out) << "break;" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; // Switch statement on the field we are reading - indent(out) << "switch (schemeField.id) {" << endl; + indent(out) << "switch (schemeField.id) {" << '\n'; indent_up(); // Generate deserialization code for known cases for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { indent(out) << "case " << (*f_iter)->get_key() << ": // " - << constant_name((*f_iter)->get_name()) << endl; + << constant_name((*f_iter)->get_name()) << '\n'; indent_up(); indent(out) << "if (schemeField.type == " << type_to_enum((*f_iter)->get_type()) << ") {" - << endl; + << '\n'; indent_up(); generate_deserialize_field(out, *f_iter, "struct.", true); indent(out) << "struct." << "set" << get_cap_name((*f_iter)->get_name()) << get_cap_name("isSet") - << "(true);" << endl; + << "(true);" << '\n'; indent_down(); - out << indent() << "} else { " << endl + out << indent() << "} else { " << '\n' << indent() << " org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);" - << endl - << indent() << "}" << endl - << indent() << "break;" << endl; + << '\n' + << indent() << "}" << '\n' + << indent() << "break;" << '\n'; indent_down(); } - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent(out) << " org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);" - << endl; + << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; // Read field end marker - indent(out) << "iprot.readFieldEnd();" << endl; + indent(out) << "iprot.readFieldEnd();" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; - out << indent() << "iprot.readStructEnd();" << endl; + out << indent() << "iprot.readStructEnd();" << '\n'; // in non-beans style, check for required fields of primitive type // (which can be checked here but not in the general validate method) if (!bean_style_) { - out << endl + out << '\n' << indent() << "// check for required fields of primitive type, which can't be " "checked in the validate method" - << endl; + << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED && !type_can_be_null((*f_iter)->get_type())) { - out << indent() << "if (!struct." << generate_isset_check(*f_iter) << ") {" << endl + out << indent() << "if (!struct." << generate_isset_check(*f_iter) << ") {" << '\n' << indent() << " throw new org.apache.thrift.protocol.TProtocolException(\"Required field '" << (*f_iter)->get_name() - << "' was not found in serialized data! Struct: \" + toString());" << endl - << indent() << "}" << endl; + << "' was not found in serialized data! Struct: \" + toString());" << '\n' + << indent() << "}" << '\n'; } } } // performs various checks (e.g. check that all required fields are set) - indent(out) << "struct.validate();" << endl; + indent(out) << "struct.validate();" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } void t_java_generator::generate_standard_writer(ostream& out, t_struct* tstruct, bool is_result) { indent_up(); - indent(out) << java_override_annotation() << endl; + indent(out) << java_override_annotation() << '\n'; indent(out) << "public void write(org.apache.thrift.protocol.TProtocol oprot, " - << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << endl; + << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << '\n'; indent_up(); const vector& fields = tstruct->get_sorted_members(); vector::const_iterator f_iter; // performs various checks (e.g. check that all required fields are set) - indent(out) << "struct.validate();" << endl << endl; + indent(out) << "struct.validate();" << '\n' << '\n'; - indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << endl; + indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool null_allowed = type_can_be_null((*f_iter)->get_type()); if (null_allowed) { - out << indent() << "if (struct." << make_valid_java_identifier((*f_iter)->get_name()) << " != null) {" << endl; + out << indent() << "if (struct." << make_valid_java_identifier((*f_iter)->get_name()) << " != null) {" << '\n'; indent_up(); } bool optional = ((*f_iter)->get_req() == t_field::T_OPTIONAL) || (is_result && !null_allowed); if (optional) { indent(out) << "if (" - << "struct." << generate_isset_check((*f_iter)) << ") {" << endl; + << "struct." << generate_isset_check((*f_iter)) << ") {" << '\n'; indent_up(); } indent(out) << "oprot.writeFieldBegin(" << constant_name((*f_iter)->get_name()) - << "_FIELD_DESC);" << endl; + << "_FIELD_DESC);" << '\n'; // Write field contents generate_serialize_field(out, *f_iter, "struct.", "", true); // Write field closer - indent(out) << "oprot.writeFieldEnd();" << endl; + indent(out) << "oprot.writeFieldEnd();" << '\n'; if (optional) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } if (null_allowed) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } // Write the struct map - out << indent() << "oprot.writeFieldStop();" << endl - << indent() << "oprot.writeStructEnd();" << endl; + out << indent() << "oprot.writeFieldStop();" << '\n' + << indent() << "oprot.writeStructEnd();" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; indent_down(); } @@ -5670,38 +5667,38 @@ void t_java_generator::generate_java_struct_standard_scheme(ostream& out, bool is_result) { indent(out) << "private static class " << tstruct->get_name() << "StandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {" - << endl; + << '\n'; indent_up(); - indent(out) << java_override_annotation() << endl; - indent(out) << "public " << tstruct->get_name() << "StandardScheme getScheme() {" << endl; + indent(out) << java_override_annotation() << '\n'; + indent(out) << "public " << tstruct->get_name() << "StandardScheme getScheme() {" << '\n'; indent_up(); - indent(out) << "return new " << tstruct->get_name() << "StandardScheme();" << endl; + indent(out) << "return new " << tstruct->get_name() << "StandardScheme();" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; out << indent() << "private static class " << tstruct->get_name() << "StandardScheme extends org.apache.thrift.scheme.StandardScheme<" << make_valid_java_identifier(tstruct->get_name()) - << "> {" << endl - << endl; + << "> {" << '\n' + << '\n'; indent_up(); generate_standard_reader(out, tstruct); indent_down(); - out << endl; + out << '\n'; generate_standard_writer(out, tstruct, is_result); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } void t_java_generator::generate_java_struct_tuple_reader(ostream& out, t_struct* tstruct) { - indent(out) << java_override_annotation() << endl; + indent(out) << java_override_annotation() << '\n'; indent(out) << "public void read(org.apache.thrift.protocol.TProtocol prot, " - << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << endl; + << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << '\n'; indent_up(); indent(out) << "org.apache.thrift.protocol.TTupleProtocol iprot = " "(org.apache.thrift.protocol.TTupleProtocol) prot;" - << endl; + << '\n'; int optional_count = 0; const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; @@ -5713,39 +5710,39 @@ void t_java_generator::generate_java_struct_tuple_reader(ostream& out, t_struct* if ((*f_iter)->get_req() == t_field::T_REQUIRED) { generate_deserialize_field(out, (*f_iter), "struct.", false); indent(out) << "struct.set" << get_cap_name((*f_iter)->get_name()) << get_cap_name("isSet") - << "(true);" << endl; + << "(true);" << '\n'; } } if (optional_count > 0) { indent(out) << "java.util.BitSet incoming = iprot.readBitSet(" << optional_count << ");" - << endl; + << '\n'; int i = 0; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_OPTIONAL || (*f_iter)->get_req() == t_field::T_OPT_IN_REQ_OUT) { - indent(out) << "if (incoming.get(" << i << ")) {" << endl; + indent(out) << "if (incoming.get(" << i << ")) {" << '\n'; indent_up(); generate_deserialize_field(out, (*f_iter), "struct.", false); indent(out) << "struct.set" << get_cap_name((*f_iter)->get_name()) << get_cap_name("isSet") - << "(true);" << endl; + << "(true);" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; i++; } } } indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_java_generator::generate_java_struct_tuple_writer(ostream& out, t_struct* tstruct) { - indent(out) << java_override_annotation() << endl; + indent(out) << java_override_annotation() << '\n'; indent(out) << "public void write(org.apache.thrift.protocol.TProtocol prot, " - << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << endl; + << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << '\n'; indent_up(); indent(out) << "org.apache.thrift.protocol.TTupleProtocol oprot = " "(org.apache.thrift.protocol.TTupleProtocol) prot;" - << endl; + << '\n'; const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; @@ -5762,70 +5759,70 @@ void t_java_generator::generate_java_struct_tuple_writer(ostream& out, t_struct* } } if (has_optional) { - indent(out) << "java.util.BitSet optionals = new java.util.BitSet();" << endl; + indent(out) << "java.util.BitSet optionals = new java.util.BitSet();" << '\n'; int i = 0; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_OPTIONAL || (*f_iter)->get_req() == t_field::T_OPT_IN_REQ_OUT) { - indent(out) << "if (struct." << generate_isset_check((*f_iter)) << ") {" << endl; + indent(out) << "if (struct." << generate_isset_check((*f_iter)) << ") {" << '\n'; indent_up(); - indent(out) << "optionals.set(" << i << ");" << endl; + indent(out) << "optionals.set(" << i << ");" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; i++; } } - indent(out) << "oprot.writeBitSet(optionals, " << optional_count << ");" << endl; + indent(out) << "oprot.writeBitSet(optionals, " << optional_count << ");" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_OPTIONAL || (*f_iter)->get_req() == t_field::T_OPT_IN_REQ_OUT) { - indent(out) << "if (struct." << generate_isset_check(*f_iter) << ") {" << endl; + indent(out) << "if (struct." << generate_isset_check(*f_iter) << ") {" << '\n'; indent_up(); generate_serialize_field(out, (*f_iter), "struct.", "", false); indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } } indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_java_generator::generate_java_struct_tuple_scheme(ostream& out, t_struct* tstruct) { indent(out) << "private static class " << tstruct->get_name() - << "TupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {" << endl; + << "TupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {" << '\n'; indent_up(); - indent(out) << java_override_annotation() << endl; - indent(out) << "public " << tstruct->get_name() << "TupleScheme getScheme() {" << endl; + indent(out) << java_override_annotation() << '\n'; + indent(out) << "public " << tstruct->get_name() << "TupleScheme getScheme() {" << '\n'; indent_up(); - indent(out) << "return new " << tstruct->get_name() << "TupleScheme();" << endl; + indent(out) << "return new " << tstruct->get_name() << "TupleScheme();" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; out << indent() << "private static class " << tstruct->get_name() << "TupleScheme extends org.apache.thrift.scheme.TupleScheme<" << make_valid_java_identifier(tstruct->get_name()) << "> {" - << endl - << endl; + << '\n' + << '\n'; indent_up(); generate_java_struct_tuple_writer(out, tstruct); - out << endl; + out << '\n'; generate_java_struct_tuple_reader(out, tstruct); indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } void t_java_generator::generate_java_scheme_lookup(ostream& out) { indent(out) << "private static S scheme(" - << "org.apache.thrift.protocol.TProtocol proto) {" << endl; + << "org.apache.thrift.protocol.TProtocol proto) {" << '\n'; indent_up(); indent(out) << "return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) " << "? STANDARD_SCHEME_FACTORY " << ": TUPLE_SCHEME_FACTORY" - << ").getScheme();" << endl; + << ").getScheme();" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_java_generator::generate_javax_generated_annotation(ostream& out) { @@ -5838,11 +5835,11 @@ void t_java_generator::generate_javax_generated_annotation(ostream& out) { } if (undated_generated_annotations_) { - out << ")" << endl; + out << ")" << '\n'; } else { indent(out) << ", date = \"" << (now->tm_year + 1900) << "-" << setfill('0') << setw(2) << (now->tm_mon + 1) << "-" << setfill('0') << setw(2) << now->tm_mday << "\")" - << endl; + << '\n'; } } diff --git a/compiler/cpp/src/thrift/generate/t_javame_generator.cc b/compiler/cpp/src/thrift/generate/t_javame_generator.cc index d8d9056306c..e2c3a395cdc 100644 --- a/compiler/cpp/src/thrift/generate/t_javame_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_javame_generator.cc @@ -37,8 +37,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /** * Java code generator. * @@ -339,7 +337,7 @@ void t_javame_generator::generate_enum(t_enum* tenum) { generate_java_doc(f_enum, tenum); indent(f_enum) << "public class " << tenum->get_name() << " implements org.apache.thrift.TEnum "; scope_up(f_enum); - f_enum << endl; + f_enum << '\n'; vector constants = tenum->get_constants(); vector::iterator c_iter; @@ -347,53 +345,53 @@ void t_javame_generator::generate_enum(t_enum* tenum) { int value = (*c_iter)->get_value(); generate_java_doc(f_enum, *c_iter); indent(f_enum) << "public static final " << tenum->get_name() << " " << (*c_iter)->get_name() - << " = new " << tenum->get_name() << "(" << value << ");" << endl; + << " = new " << tenum->get_name() << "(" << value << ");" << '\n'; } - f_enum << endl; + f_enum << '\n'; // Field for thriftCode - indent(f_enum) << "private final int value;" << endl << endl; + indent(f_enum) << "private final int value;" << '\n' << '\n'; - indent(f_enum) << "private " << tenum->get_name() << "(int value) {" << endl; - indent(f_enum) << " this.value = value;" << endl; - indent(f_enum) << "}" << endl << endl; + indent(f_enum) << "private " << tenum->get_name() << "(int value) {" << '\n'; + indent(f_enum) << " this.value = value;" << '\n'; + indent(f_enum) << "}" << '\n' << '\n'; - indent(f_enum) << "/**" << endl; + indent(f_enum) << "/**" << '\n'; indent(f_enum) << " * Get the integer value of this enum value, as defined in the Thrift IDL." - << endl; - indent(f_enum) << " */" << endl; - indent(f_enum) << "public int getValue() {" << endl; - indent(f_enum) << " return value;" << endl; - indent(f_enum) << "}" << endl << endl; + << '\n'; + indent(f_enum) << " */" << '\n'; + indent(f_enum) << "public int getValue() {" << '\n'; + indent(f_enum) << " return value;" << '\n'; + indent(f_enum) << "}" << '\n' << '\n'; - indent(f_enum) << "/**" << endl; + indent(f_enum) << "/**" << '\n'; indent(f_enum) << " * Find a the enum type by its integer value, as defined in the Thrift IDL." - << endl; - indent(f_enum) << " * @return null if the value is not found." << endl; - indent(f_enum) << " */" << endl; - indent(f_enum) << "public static " + tenum->get_name() + " findByValue(int value) { " << endl; + << '\n'; + indent(f_enum) << " * @return null if the value is not found." << '\n'; + indent(f_enum) << " */" << '\n'; + indent(f_enum) << "public static " + tenum->get_name() + " findByValue(int value) { " << '\n'; indent_up(); - indent(f_enum) << "switch (value) {" << endl; + indent(f_enum) << "switch (value) {" << '\n'; indent_up(); for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { int value = (*c_iter)->get_value(); - indent(f_enum) << "case " << value << ":" << endl; - indent(f_enum) << " return " << (*c_iter)->get_name() << ";" << endl; + indent(f_enum) << "case " << value << ":" << '\n'; + indent(f_enum) << " return " << (*c_iter)->get_name() << ";" << '\n'; } - indent(f_enum) << "default:" << endl; - indent(f_enum) << " return null;" << endl; + indent(f_enum) << "default:" << '\n'; + indent(f_enum) << " return null;" << '\n'; indent_down(); - indent(f_enum) << "}" << endl; + indent(f_enum) << "}" << '\n'; indent_down(); - indent(f_enum) << "}" << endl; + indent(f_enum) << "}" << '\n'; scope_down(f_enum); @@ -415,7 +413,7 @@ void t_javame_generator::generate_consts(std::vector consts) { // Print header f_consts << autogen_comment() << java_package() << java_type_imports(); - f_consts << "public class " << program_name_ << "Constants {" << endl << endl; + f_consts << "public class " << program_name_ << "Constants {" << '\n' << '\n'; indent_up(); vector::iterator c_iter; for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { @@ -426,7 +424,7 @@ void t_javame_generator::generate_consts(std::vector consts) { false); } indent_down(); - indent(f_consts) << "}" << endl; + indent(f_consts) << "}" << '\n'; f_consts.close(); } @@ -449,17 +447,17 @@ void t_javame_generator::print_const_value(std::ostream& out, } if (type->is_base_type()) { string v2 = render_const_value(out, name, type, value); - out << name << " = " << v2 << ";" << endl << endl; + out << name << " = " << v2 << ";" << '\n' << '\n'; } else if (type->is_enum()) { - out << name << " = " << render_const_value(out, name, type, value) << ";" << endl << endl; + out << name << " = " << render_const_value(out, name, type, value) << ";" << '\n' << '\n'; } else if (type->is_struct() || type->is_xception()) { const vector& fields = ((t_struct*)type)->get_members(); vector::const_iterator f_iter; const map& val = value->get_map(); map::const_iterator v_iter; - out << name << " = new " << type_name(type, false, true) << "();" << endl; + out << name << " = new " << type_name(type, false, true) << "();" << '\n'; if (!in_static) { - indent(out) << "static {" << endl; + indent(out) << "static {" << '\n'; indent_up(); } for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { @@ -475,17 +473,17 @@ void t_javame_generator::print_const_value(std::ostream& out, string val = render_const_value(out, name, field_type, v_iter->second); indent(out) << name << "."; std::string cap_name = get_cap_name(v_iter->first->get_string()); - out << "set" << cap_name << "(" << val << ");" << endl; + out << "set" << cap_name << "(" << val << ");" << '\n'; } if (!in_static) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } - out << endl; + out << '\n'; } else if (type->is_map()) { - out << name << " = new " << type_name(type, false, true) << "();" << endl; + out << name << " = new " << type_name(type, false, true) << "();" << '\n'; if (!in_static) { - indent(out) << "static {" << endl; + indent(out) << "static {" << '\n'; indent_up(); } t_type* ktype = ((t_map*)type)->get_key_type(); @@ -496,17 +494,17 @@ void t_javame_generator::print_const_value(std::ostream& out, string key = render_const_value(out, name, ktype, v_iter->first); string val = render_const_value(out, name, vtype, v_iter->second); indent(out) << name << ".put(" << box_type(ktype, key) << ", " << box_type(vtype, val) << ");" - << endl; + << '\n'; } if (!in_static) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } - out << endl; + out << '\n'; } else if (type->is_list() || type->is_set()) { - out << name << " = new " << type_name(type, false, true) << "();" << endl; + out << name << " = new " << type_name(type, false, true) << "();" << '\n'; if (!in_static) { - indent(out) << "static {" << endl; + indent(out) << "static {" << '\n'; indent_up(); } t_type* etype; @@ -520,17 +518,17 @@ void t_javame_generator::print_const_value(std::ostream& out, for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string val = render_const_value(out, name, etype, *v_iter); if (type->is_list()) { - indent(out) << name << ".addElement(" << box_type(etype, val) << ");" << endl; + indent(out) << name << ".addElement(" << box_type(etype, val) << ");" << '\n'; } else { indent(out) << name << ".put(" << box_type(etype, val) << ", " << box_type(etype, val) - << ");" << endl; + << ");" << '\n'; } } if (!in_static) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } - out << endl; + out << '\n'; } else { throw "compiler error: no const of type " + type->get_name(); } @@ -673,27 +671,27 @@ void t_javame_generator::generate_java_union(t_struct* tstruct) { generate_struct_desc(f_struct, tstruct); generate_field_descs(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_union_constructor(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_union_abstract_methods(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_union_getters_and_setters(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_union_comparisons(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; generate_union_hashcode(f_struct, tstruct); - f_struct << endl; + f_struct << '\n'; scope_down(f_struct); @@ -701,33 +699,33 @@ void t_javame_generator::generate_java_union(t_struct* tstruct) { } void t_javame_generator::generate_union_constructor(ostream& out, t_struct* tstruct) { - indent(out) << "public " << type_name(tstruct) << "() {" << endl; - indent(out) << " super();" << endl; - indent(out) << "}" << endl << endl; + indent(out) << "public " << type_name(tstruct) << "() {" << '\n'; + indent(out) << " super();" << '\n'; + indent(out) << "}" << '\n' << '\n'; - indent(out) << "public " << type_name(tstruct) << "(_Fields setField, Object value) {" << endl; - indent(out) << " super(setField, value);" << endl; - indent(out) << "}" << endl << endl; + indent(out) << "public " << type_name(tstruct) << "(_Fields setField, Object value) {" << '\n'; + indent(out) << " super(setField, value);" << '\n'; + indent(out) << "}" << '\n' << '\n'; indent(out) << "public " << type_name(tstruct) << "(" << type_name(tstruct) << " other) {" - << endl; - indent(out) << " super(other);" << endl; - indent(out) << "}" << endl; + << '\n'; + indent(out) << " super(other);" << '\n'; + indent(out) << "}" << '\n'; - indent(out) << "public " << tstruct->get_name() << " deepCopy() {" << endl; - indent(out) << " return new " << tstruct->get_name() << "(this);" << endl; - indent(out) << "}" << endl << endl; + indent(out) << "public " << tstruct->get_name() << " deepCopy() {" << '\n'; + indent(out) << " return new " << tstruct->get_name() << "(this);" << '\n'; + indent(out) << "}" << '\n' << '\n'; // generate "constructors" for each field const vector& members = tstruct->get_members(); vector::const_iterator m_iter; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { indent(out) << "public static " << type_name(tstruct) << " " << (*m_iter)->get_name() << "(" - << type_name((*m_iter)->get_type()) << " value) {" << endl; - indent(out) << " " << type_name(tstruct) << " x = new " << type_name(tstruct) << "();" << endl; - indent(out) << " x.set" << get_cap_name((*m_iter)->get_name()) << "(value);" << endl; - indent(out) << " return x;" << endl; - indent(out) << "}" << endl << endl; + << type_name((*m_iter)->get_type()) << " value) {" << '\n'; + indent(out) << " " << type_name(tstruct) << " x = new " << type_name(tstruct) << "();" << '\n'; + indent(out) << " x.set" << get_cap_name((*m_iter)->get_name()) << "(value);" << '\n'; + indent(out) << " return x;" << '\n'; + indent(out) << "}" << '\n' << '\n'; } } @@ -740,59 +738,59 @@ void t_javame_generator::generate_union_getters_and_setters(ostream& out, t_stru if (first) { first = false; } else { - out << endl; + out << '\n'; } t_field* field = (*m_iter); generate_java_doc(out, field); indent(out) << "public " << type_name(field->get_type()) << " get" - << get_cap_name(field->get_name()) << "() {" << endl; + << get_cap_name(field->get_name()) << "() {" << '\n'; indent(out) << " if (getSetField() == _Fields." << constant_name(field->get_name()) << ") {" - << endl; + << '\n'; indent(out) << " return (" << type_name(field->get_type(), true) << ")getFieldValue();" - << endl; - indent(out) << " } else {" << endl; + << '\n'; + indent(out) << " } else {" << '\n'; indent(out) << " throw new RuntimeException(\"Cannot get field '" << field->get_name() << "' because union is currently set to \" + getFieldDesc(getSetField()).name);" - << endl; - indent(out) << " }" << endl; - indent(out) << "}" << endl; + << '\n'; + indent(out) << " }" << '\n'; + indent(out) << "}" << '\n'; - out << endl; + out << '\n'; generate_java_doc(out, field); indent(out) << "public void set" << get_cap_name(field->get_name()) << "(" - << type_name(field->get_type()) << " value) {" << endl; + << type_name(field->get_type()) << " value) {" << '\n'; if (type_can_be_null(field->get_type())) { - indent(out) << " if (value == null) throw new NullPointerException();" << endl; + indent(out) << " if (value == null) throw new NullPointerException();" << '\n'; } - indent(out) << " setField_ = _Fields." << constant_name(field->get_name()) << ";" << endl; - indent(out) << " value_ = value;" << endl; - indent(out) << "}" << endl; + indent(out) << " setField_ = _Fields." << constant_name(field->get_name()) << ";" << '\n'; + indent(out) << " value_ = value;" << '\n'; + indent(out) << "}" << '\n'; } } void t_javame_generator::generate_union_abstract_methods(ostream& out, t_struct* tstruct) { generate_check_type(out, tstruct); - out << endl; + out << '\n'; generate_read_value(out, tstruct); - out << endl; + out << '\n'; generate_write_value(out, tstruct); - out << endl; + out << '\n'; generate_get_field_desc(out, tstruct); - out << endl; + out << '\n'; generate_get_struct_desc(out, tstruct); - out << endl; + out << '\n'; } void t_javame_generator::generate_check_type(ostream& out, t_struct* tstruct) { indent(out) << "protected void checkType(_Fields setField, Object value) throws ClassCastException {" - << endl; + << '\n'; indent_up(); - indent(out) << "switch (setField) {" << endl; + indent(out) << "switch (setField) {" << '\n'; indent_up(); const vector& members = tstruct->get_members(); @@ -801,37 +799,37 @@ void t_javame_generator::generate_check_type(ostream& out, t_struct* tstruct) { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* field = (*m_iter); - indent(out) << "case " << constant_name(field->get_name()) << ":" << endl; + indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n'; indent(out) << " if (value instanceof " << type_name(field->get_type(), true, false, true) - << ") {" << endl; - indent(out) << " break;" << endl; - indent(out) << " }" << endl; + << ") {" << '\n'; + indent(out) << " break;" << '\n'; + indent(out) << " }" << '\n'; indent(out) << " throw new ClassCastException(\"Was expecting value of type " << type_name(field->get_type(), true, false) << " for field '" << field->get_name() - << "', but got \" + value.getClass().getSimpleName());" << endl; + << "', but got \" + value.getClass().getSimpleName());" << '\n'; // do the real check here } - indent(out) << "default:" << endl; - indent(out) << " throw new IllegalArgumentException(\"Unknown field id \" + setField);" << endl; + indent(out) << "default:" << '\n'; + indent(out) << " throw new IllegalArgumentException(\"Unknown field id \" + setField);" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_javame_generator::generate_read_value(ostream& out, t_struct* tstruct) { indent(out) << "protected Object readValue(TProtocol iprot, TField field) throws TException {" - << endl; + << '\n'; indent_up(); - indent(out) << "_Fields setField = _Fields.findByThriftId(field.id);" << endl; - indent(out) << "if (setField != null) {" << endl; + indent(out) << "_Fields setField = _Fields.findByThriftId(field.id);" << '\n'; + indent(out) << "if (setField != null) {" << '\n'; indent_up(); - indent(out) << "switch (setField) {" << endl; + indent(out) << "switch (setField) {" << '\n'; indent_up(); const vector& members = tstruct->get_members(); @@ -840,48 +838,48 @@ void t_javame_generator::generate_read_value(ostream& out, t_struct* tstruct) { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* field = (*m_iter); - indent(out) << "case " << constant_name(field->get_name()) << ":" << endl; + indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n'; indent_up(); indent(out) << "if (field.type == " << constant_name(field->get_name()) << "_FIELD_DESC.type) {" - << endl; + << '\n'; indent_up(); indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << ";" - << endl; + << '\n'; generate_deserialize_field(out, field, ""); - indent(out) << "return " << field->get_name() << ";" << endl; + indent(out) << "return " << field->get_name() << ";" << '\n'; indent_down(); - indent(out) << "} else {" << endl; - indent(out) << " TProtocolUtil.skip(iprot, field.type);" << endl; - indent(out) << " return null;" << endl; - indent(out) << "}" << endl; + indent(out) << "} else {" << '\n'; + indent(out) << " TProtocolUtil.skip(iprot, field.type);" << '\n'; + indent(out) << " return null;" << '\n'; + indent(out) << "}" << '\n'; indent_down(); } - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent(out) << " throw new IllegalStateException(\"setField wasn't null, but didn't match any " - "of the case statements!\");" << endl; + "of the case statements!\");" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "} else {" << endl; + indent(out) << "} else {" << '\n'; indent_up(); - indent(out) << "TProtocolUtil.skip(iprot, field.type);" << endl; - indent(out) << "return null;" << endl; + indent(out) << "TProtocolUtil.skip(iprot, field.type);" << '\n'; + indent(out) << "return null;" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_javame_generator::generate_write_value(ostream& out, t_struct* tstruct) { - indent(out) << "protected void writeValue(TProtocol oprot) throws TException {" << endl; + indent(out) << "protected void writeValue(TProtocol oprot) throws TException {" << '\n'; indent_up(); - indent(out) << "switch (setField_) {" << endl; + indent(out) << "switch (setField_) {" << '\n'; indent_up(); const vector& members = tstruct->get_members(); @@ -890,100 +888,100 @@ void t_javame_generator::generate_write_value(ostream& out, t_struct* tstruct) { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* field = (*m_iter); - indent(out) << "case " << constant_name(field->get_name()) << ":" << endl; + indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n'; indent_up(); indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << " = (" - << type_name(field->get_type(), true, false) << ")value_;" << endl; + << type_name(field->get_type(), true, false) << ")value_;" << '\n'; generate_serialize_field(out, field, ""); - indent(out) << "return;" << endl; + indent(out) << "return;" << '\n'; indent_down(); } - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent(out) << " throw new IllegalStateException(\"Cannot write union with unknown field \" + " - "setField_);" << endl; + "setField_);" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_javame_generator::generate_get_field_desc(ostream& out, t_struct* tstruct) { - indent(out) << "protected TField getFieldDesc(_Fields setField) {" << endl; + indent(out) << "protected TField getFieldDesc(_Fields setField) {" << '\n'; indent_up(); const vector& members = tstruct->get_members(); vector::const_iterator m_iter; - indent(out) << "switch (setField) {" << endl; + indent(out) << "switch (setField) {" << '\n'; indent_up(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* field = (*m_iter); - indent(out) << "case " << constant_name(field->get_name()) << ":" << endl; - indent(out) << " return " << constant_name(field->get_name()) << "_FIELD_DESC;" << endl; + indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n'; + indent(out) << " return " << constant_name(field->get_name()) << "_FIELD_DESC;" << '\n'; } - indent(out) << "default:" << endl; - indent(out) << " throw new IllegalArgumentException(\"Unknown field id \" + setField);" << endl; + indent(out) << "default:" << '\n'; + indent(out) << " throw new IllegalArgumentException(\"Unknown field id \" + setField);" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_javame_generator::generate_get_struct_desc(ostream& out, t_struct* tstruct) { (void)tstruct; - indent(out) << "protected TStruct getStructDesc() {" << endl; - indent(out) << " return STRUCT_DESC;" << endl; - indent(out) << "}" << endl; + indent(out) << "protected TStruct getStructDesc() {" << '\n'; + indent(out) << " return STRUCT_DESC;" << '\n'; + indent(out) << "}" << '\n'; } void t_javame_generator::generate_union_comparisons(ostream& out, t_struct* tstruct) { // equality - indent(out) << "public boolean equals(Object other) {" << endl; - indent(out) << " if (other instanceof " << tstruct->get_name() << ") {" << endl; - indent(out) << " return equals((" << tstruct->get_name() << ")other);" << endl; - indent(out) << " } else {" << endl; - indent(out) << " return false;" << endl; - indent(out) << " }" << endl; - indent(out) << "}" << endl; + indent(out) << "public boolean equals(Object other) {" << '\n'; + indent(out) << " if (other instanceof " << tstruct->get_name() << ") {" << '\n'; + indent(out) << " return equals((" << tstruct->get_name() << ")other);" << '\n'; + indent(out) << " } else {" << '\n'; + indent(out) << " return false;" << '\n'; + indent(out) << " }" << '\n'; + indent(out) << "}" << '\n'; - out << endl; + out << '\n'; - indent(out) << "public boolean equals(" << tstruct->get_name() << " other) {" << endl; + indent(out) << "public boolean equals(" << tstruct->get_name() << " other) {" << '\n'; indent(out) << " return other != null && getSetField() == other.getSetField() && " - "getFieldValue().equals(other.getFieldValue());" << endl; - indent(out) << "}" << endl; - out << endl; + "getFieldValue().equals(other.getFieldValue());" << '\n'; + indent(out) << "}" << '\n'; + out << '\n'; - indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << endl; + indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << '\n'; indent(out) << " int lastComparison = TBaseHelper.compareTo(getSetField(), other.getSetField());" - << endl; - indent(out) << " if (lastComparison == 0) {" << endl; + << '\n'; + indent(out) << " if (lastComparison == 0) {" << '\n'; indent(out) << " return TBaseHelper.compareTo(getFieldValue(), other.getFieldValue());" - << endl; - indent(out) << " }" << endl; - indent(out) << " return lastComparison;" << endl; - indent(out) << "}" << endl; - out << endl; + << '\n'; + indent(out) << " }" << '\n'; + indent(out) << " return lastComparison;" << '\n'; + indent(out) << "}" << '\n'; + out << '\n'; } void t_javame_generator::generate_union_hashcode(ostream& out, t_struct* tstruct) { (void)tstruct; - indent(out) << "/**" << endl; + indent(out) << "/**" << '\n'; indent(out) << " * If you'd like this to perform more respectably, use the hashcode generator option." - << endl; - indent(out) << " */" << endl; - indent(out) << "public int hashCode() {" << endl; - indent(out) << " return 0;" << endl; - indent(out) << "}" << endl; + << '\n'; + indent(out) << " */" << '\n'; + indent(out) << "public int hashCode() {" << '\n'; + indent(out) << " return 0;" << '\n'; + indent(out) << "}" << '\n'; } /** @@ -1021,43 +1019,43 @@ void t_javame_generator::generate_java_struct_definition(ostream& out, const vector& members = tstruct->get_members(); vector::const_iterator m_iter; - out << endl; + out << '\n'; generate_field_descs(out, tstruct); - out << endl; + out << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { indent(out) << "private "; - out << declare_field(*m_iter, false) << endl; + out << declare_field(*m_iter, false) << '\n'; } // isset data if (members.size() > 0) { - out << endl; + out << '\n'; - indent(out) << "// isset id assignments" << endl; + indent(out) << "// isset id assignments" << '\n'; int i = 0; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if (!type_can_be_null((*m_iter)->get_type())) { indent(out) << "private static final int " << isset_field_id(*m_iter) << " = " << i << ";" - << endl; + << '\n'; i++; } } if (i > 0) { - indent(out) << "private boolean[] __isset_vector = new boolean[" << i << "];" << endl; + indent(out) << "private boolean[] __isset_vector = new boolean[" << i << "];" << '\n'; } - out << endl; + out << '\n'; } bool all_optional_members = true; // Default constructor - indent(out) << "public " << tstruct->get_name() << "() {" << endl; + indent(out) << "public " << tstruct->get_name() << "() {" << '\n'; indent_up(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_type* t = get_true_type((*m_iter)->get_type()); @@ -1074,49 +1072,49 @@ void t_javame_generator::generate_java_struct_definition(ostream& out, } } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; if (!members.empty() && !all_optional_members) { // Full constructor for all fields - indent(out) << "public " << tstruct->get_name() << "(" << endl; + indent(out) << "public " << tstruct->get_name() << "(" << '\n'; indent_up(); bool first = true; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() != t_field::T_OPTIONAL) { if (!first) { - out << "," << endl; + out << "," << '\n'; } first = false; indent(out) << type_name((*m_iter)->get_type()) << " " << (*m_iter)->get_name(); } } - out << ")" << endl; + out << ")" << '\n'; indent_down(); - indent(out) << "{" << endl; + indent(out) << "{" << '\n'; indent_up(); - indent(out) << "this();" << endl; + indent(out) << "this();" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() != t_field::T_OPTIONAL) { indent(out) << "this." << (*m_iter)->get_name() << " = " << (*m_iter)->get_name() << ";" - << endl; + << '\n'; generate_isset_set(out, (*m_iter)); } } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } // copy constructor - indent(out) << "/**" << endl; - indent(out) << " * Performs a deep copy on other." << endl; - indent(out) << " */" << endl; + indent(out) << "/**" << '\n'; + indent(out) << " * Performs a deep copy on other." << '\n'; + indent(out) << " */" << '\n'; indent(out) << "public " << tstruct->get_name() << "(" << tstruct->get_name() << " other) {" - << endl; + << '\n'; indent_up(); if (has_bit_vector(tstruct)) { indent(out) << "System.arraycopy(other.__isset_vector, 0, __isset_vector, 0, " - "other.__isset_vector.length);" << endl; + "other.__isset_vector.length);" << '\n'; } for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -1126,32 +1124,32 @@ void t_javame_generator::generate_java_struct_definition(ostream& out, bool can_be_null = type_can_be_null(type); if (can_be_null) { - indent(out) << "if (other." << generate_isset_check(field) << ") {" << endl; + indent(out) << "if (other." << generate_isset_check(field) << ") {" << '\n'; indent_up(); } if (type->is_container()) { generate_deep_copy_container(out, "other", field_name, "__this__" + field_name, type); - indent(out) << "this." << field_name << " = __this__" << field_name << ";" << endl; + indent(out) << "this." << field_name << " = __this__" << field_name << ";" << '\n'; } else { indent(out) << "this." << field_name << " = "; generate_deep_copy_non_container(out, "other." + field_name, field_name, type); - out << ";" << endl; + out << ";" << '\n'; } if (can_be_null) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; // clone method, so that you can deep copy an object when you don't know its class. - indent(out) << "public " << tstruct->get_name() << " deepCopy() {" << endl; - indent(out) << " return new " << tstruct->get_name() << "(this);" << endl; - indent(out) << "}" << endl << endl; + indent(out) << "public " << tstruct->get_name() << " deepCopy() {" << '\n'; + indent(out) << " return new " << tstruct->get_name() << "(this);" << '\n'; + indent(out) << "}" << '\n' << '\n'; generate_java_struct_clear(out, tstruct); @@ -1170,7 +1168,7 @@ void t_javame_generator::generate_java_struct_definition(ostream& out, generate_java_struct_tostring(out, tstruct); generate_java_validator(out, tstruct); scope_down(out); - out << endl; + out << '\n'; } /** @@ -1179,24 +1177,24 @@ void t_javame_generator::generate_java_struct_definition(ostream& out, * @param tstruct The struct definition */ void t_javame_generator::generate_java_struct_equality(ostream& out, t_struct* tstruct) { - out << indent() << "public boolean equals(Object that) {" << endl; + out << indent() << "public boolean equals(Object that) {" << '\n'; indent_up(); - out << indent() << "if (that == null)" << endl << indent() << " return false;" << endl - << indent() << "if (that instanceof " << tstruct->get_name() << ")" << endl << indent() - << " return this.equals((" << tstruct->get_name() << ")that);" << endl << indent() - << "return false;" << endl; + out << indent() << "if (that == null)" << '\n' << indent() << " return false;" << '\n' + << indent() << "if (that instanceof " << tstruct->get_name() << ")" << '\n' << indent() + << " return this.equals((" << tstruct->get_name() << ")that);" << '\n' << indent() + << "return false;" << '\n'; scope_down(out); - out << endl; + out << '\n'; - out << indent() << "public boolean equals(" << tstruct->get_name() << " that) {" << endl; + out << indent() << "public boolean equals(" << tstruct->get_name() << " that) {" << '\n'; indent_up(); - out << indent() << "if (that == null)" << endl << indent() << " return false;" << endl - << indent() << "if (this == that)" << endl << indent() << " return true;" << endl; + out << indent() << "if (that == null)" << '\n' << indent() << " return false;" << '\n' + << indent() << "if (this == that)" << '\n' << indent() << " return true;" << '\n'; const vector& members = tstruct->get_members(); vector::const_iterator m_iter; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - out << endl; + out << '\n'; t_type* t = get_true_type((*m_iter)->get_type()); // Most existing Thrift code does not use isset or optional/required, @@ -1214,14 +1212,14 @@ void t_javame_generator::generate_java_struct_equality(ostream& out, t_struct* t that_present += " && that." + generate_isset_check(*m_iter); } - out << indent() << "boolean this_present_" << name << " = " << this_present << ";" << endl - << indent() << "boolean that_present_" << name << " = " << that_present << ";" << endl + out << indent() << "boolean this_present_" << name << " = " << this_present << ";" << '\n' + << indent() << "boolean that_present_" << name << " = " << that_present << ";" << '\n' << indent() << "if (" - << "this_present_" << name << " || that_present_" << name << ") {" << endl; + << "this_present_" << name << " || that_present_" << name << ") {" << '\n'; indent_up(); out << indent() << "if (!(" - << "this_present_" << name << " && that_present_" << name << "))" << endl << indent() - << " return false;" << endl; + << "this_present_" << name << " && that_present_" << name << "))" << '\n' << indent() + << " return false;" << '\n'; if (t->is_binary()) { unequal = "TBaseHelper.compareTo(this." + name + ", that." + name + ") != 0"; @@ -1231,66 +1229,66 @@ void t_javame_generator::generate_java_struct_equality(ostream& out, t_struct* t unequal = "this." + name + " != that." + name; } - out << indent() << "if (" << unequal << ")" << endl << indent() << " return false;" << endl; + out << indent() << "if (" << unequal << ")" << '\n' << indent() << " return false;" << '\n'; scope_down(out); } - out << endl; - indent(out) << "return true;" << endl; + out << '\n'; + indent(out) << "return true;" << '\n'; scope_down(out); - out << endl; + out << '\n'; - out << indent() << "public int hashCode() {" << endl; + out << indent() << "public int hashCode() {" << '\n'; indent_up(); - indent(out) << "return 0;" << endl; + indent(out) << "return 0;" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } void t_javame_generator::generate_java_struct_compare_to(ostream& out, t_struct* tstruct) { - indent(out) << "public int compareTo(Object otherObject) {" << endl; - // indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << endl; + indent(out) << "public int compareTo(Object otherObject) {" << '\n'; + // indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << '\n'; indent_up(); - indent(out) << "if (!getClass().equals(otherObject.getClass())) {" << endl; + indent(out) << "if (!getClass().equals(otherObject.getClass())) {" << '\n'; indent(out) << " return getClass().getName().compareTo(otherObject.getClass().getName());" - << endl; - indent(out) << "}" << endl; - out << endl; + << '\n'; + indent(out) << "}" << '\n'; + out << '\n'; indent(out) << type_name(tstruct) << " other = (" << type_name(tstruct) << ")otherObject;"; - indent(out) << "int lastComparison = 0;" << endl; - out << endl; + indent(out) << "int lastComparison = 0;" << '\n'; + out << '\n'; const vector& members = tstruct->get_members(); vector::const_iterator m_iter; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* field = *m_iter; indent(out) << "lastComparison = TBaseHelper.compareTo(" << generate_isset_check(field) - << ", other." << generate_isset_check(field) << ");" << endl; - indent(out) << "if (lastComparison != 0) {" << endl; - indent(out) << " return lastComparison;" << endl; - indent(out) << "}" << endl; + << ", other." << generate_isset_check(field) << ");" << '\n'; + indent(out) << "if (lastComparison != 0) {" << '\n'; + indent(out) << " return lastComparison;" << '\n'; + indent(out) << "}" << '\n'; - indent(out) << "if (" << generate_isset_check(field) << ") {" << endl; + indent(out) << "if (" << generate_isset_check(field) << ") {" << '\n'; if (field->get_type()->is_struct() || field->get_type()->is_xception()) { indent(out) << " lastComparison = this." << field->get_name() << ".compareTo(other." - << field->get_name() << ");" << endl; + << field->get_name() << ");" << '\n'; } else { indent(out) << " lastComparison = TBaseHelper.compareTo(this." << field->get_name() - << ", other." << field->get_name() << ");" << endl; + << ", other." << field->get_name() << ");" << '\n'; } - indent(out) << " if (lastComparison != 0) {" << endl; - indent(out) << " return lastComparison;" << endl; - indent(out) << " }" << endl; - indent(out) << "}" << endl; + indent(out) << " if (lastComparison != 0) {" << '\n'; + indent(out) << " return lastComparison;" << '\n'; + indent(out) << " }" << '\n'; + indent(out) << "}" << '\n'; } - indent(out) << "return 0;" << endl; + indent(out) << "return 0;" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -1299,91 +1297,91 @@ void t_javame_generator::generate_java_struct_compare_to(ostream& out, t_struct* * @param tstruct The struct definition */ void t_javame_generator::generate_java_struct_reader(ostream& out, t_struct* tstruct) { - out << indent() << "public void read(TProtocol iprot) throws TException {" << endl; + out << indent() << "public void read(TProtocol iprot) throws TException {" << '\n'; indent_up(); const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; // Declare stack tmp variables and read struct header - out << indent() << "TField field;" << endl << indent() << "iprot.readStructBegin();" << endl; + out << indent() << "TField field;" << '\n' << indent() << "iprot.readStructBegin();" << '\n'; // Loop over reading in fields - indent(out) << "while (true)" << endl; + indent(out) << "while (true)" << '\n'; scope_up(out); // Read beginning field marker - indent(out) << "field = iprot.readFieldBegin();" << endl; + indent(out) << "field = iprot.readFieldBegin();" << '\n'; // Check for field STOP marker and break - indent(out) << "if (field.type == TType.STOP) { " << endl; + indent(out) << "if (field.type == TType.STOP) { " << '\n'; indent_up(); - indent(out) << "break;" << endl; + indent(out) << "break;" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; // Switch statement on the field we are reading - indent(out) << "switch (field.id) {" << endl; + indent(out) << "switch (field.id) {" << '\n'; indent_up(); // Generate deserialization code for known cases for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { indent(out) << "case " << (*f_iter)->get_key() << ": // " - << constant_name((*f_iter)->get_name()) << endl; + << constant_name((*f_iter)->get_name()) << '\n'; indent_up(); - indent(out) << "if (field.type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl; + indent(out) << "if (field.type == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n'; indent_up(); generate_deserialize_field(out, *f_iter, "this."); generate_isset_set(out, *f_iter); indent_down(); - out << indent() << "} else { " << endl << indent() << " TProtocolUtil.skip(iprot, field.type);" - << endl << indent() << "}" << endl << indent() << "break;" << endl; + out << indent() << "} else { " << '\n' << indent() << " TProtocolUtil.skip(iprot, field.type);" + << '\n' << indent() << "}" << '\n' << indent() << "break;" << '\n'; indent_down(); } - indent(out) << "default:" << endl; - indent(out) << " TProtocolUtil.skip(iprot, field.type);" << endl; + indent(out) << "default:" << '\n'; + indent(out) << " TProtocolUtil.skip(iprot, field.type);" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; // Read field end marker - indent(out) << "iprot.readFieldEnd();" << endl; + indent(out) << "iprot.readFieldEnd();" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; - out << indent() << "iprot.readStructEnd();" << endl; + out << indent() << "iprot.readStructEnd();" << '\n'; // performs various checks (e.g. check that all required fields are set) - indent(out) << "validate();" << endl; + indent(out) << "validate();" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } // generates java method to perform various checks // (e.g. check that all required fields are set) void t_javame_generator::generate_java_validator(ostream& out, t_struct* tstruct) { - indent(out) << "public void validate() throws TException {" << endl; + indent(out) << "public void validate() throws TException {" << '\n'; indent_up(); const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; - out << indent() << "// check for required fields" << endl; + out << indent() << "// check for required fields" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) { - out << indent() << "if (!" << generate_isset_check(*f_iter) << ") {" << endl << indent() + out << indent() << "if (!" << generate_isset_check(*f_iter) << ") {" << '\n' << indent() << " throw new TProtocolException(\"Required field '" << (*f_iter)->get_name() - << "' is unset! Struct:\" + toString());" << endl << indent() << "}" << endl << endl; + << "' is unset! Struct:\" + toString());" << '\n' << indent() << "}" << '\n' << '\n'; } } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -1392,7 +1390,7 @@ void t_javame_generator::generate_java_validator(ostream& out, t_struct* tstruct * @param tstruct The struct definition */ void t_javame_generator::generate_java_struct_writer(ostream& out, t_struct* tstruct) { - out << indent() << "public void write(TProtocol oprot) throws TException {" << endl; + out << indent() << "public void write(TProtocol oprot) throws TException {" << '\n'; indent_up(); string name = tstruct->get_name(); @@ -1400,46 +1398,46 @@ void t_javame_generator::generate_java_struct_writer(ostream& out, t_struct* tst vector::const_iterator f_iter; // performs various checks (e.g. check that all required fields are set) - indent(out) << "validate();" << endl << endl; + indent(out) << "validate();" << '\n' << '\n'; - indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << endl; + indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool null_allowed = type_can_be_null((*f_iter)->get_type()); if (null_allowed) { - out << indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << endl; + out << indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << '\n'; indent_up(); } bool optional = (*f_iter)->get_req() == t_field::T_OPTIONAL; if (optional) { - indent(out) << "if (" << generate_isset_check((*f_iter)) << ") {" << endl; + indent(out) << "if (" << generate_isset_check((*f_iter)) << ") {" << '\n'; indent_up(); } indent(out) << "oprot.writeFieldBegin(" << constant_name((*f_iter)->get_name()) - << "_FIELD_DESC);" << endl; + << "_FIELD_DESC);" << '\n'; // Write field contents generate_serialize_field(out, *f_iter, "this."); // Write field closer - indent(out) << "oprot.writeFieldEnd();" << endl; + indent(out) << "oprot.writeFieldEnd();" << '\n'; if (optional) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } if (null_allowed) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } // Write the struct map - out << indent() << "oprot.writeFieldStop();" << endl << indent() << "oprot.writeStructEnd();" - << endl; + out << indent() << "oprot.writeFieldStop();" << '\n' << indent() << "oprot.writeStructEnd();" + << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } /** @@ -1451,62 +1449,62 @@ void t_javame_generator::generate_java_struct_writer(ostream& out, t_struct* tst * @param tstruct The struct definition */ void t_javame_generator::generate_java_struct_result_writer(ostream& out, t_struct* tstruct) { - out << indent() << "public void write(TProtocol oprot) throws TException {" << endl; + out << indent() << "public void write(TProtocol oprot) throws TException {" << '\n'; indent_up(); string name = tstruct->get_name(); const vector& fields = tstruct->get_sorted_members(); vector::const_iterator f_iter; - indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << endl; + indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << '\n'; bool first = true; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if (first) { first = false; - out << endl << indent() << "if "; + out << '\n' << indent() << "if "; } else { out << " else if "; } - out << "(this." << generate_isset_check(*f_iter) << ") {" << endl; + out << "(this." << generate_isset_check(*f_iter) << ") {" << '\n'; indent_up(); indent(out) << "oprot.writeFieldBegin(" << constant_name((*f_iter)->get_name()) - << "_FIELD_DESC);" << endl; + << "_FIELD_DESC);" << '\n'; // Write field contents generate_serialize_field(out, *f_iter, "this."); // Write field closer - indent(out) << "oprot.writeFieldEnd();" << endl; + indent(out) << "oprot.writeFieldEnd();" << '\n'; indent_down(); indent(out) << "}"; } // Write the struct map - out << endl << indent() << "oprot.writeFieldStop();" << endl << indent() - << "oprot.writeStructEnd();" << endl; + out << '\n' << indent() << "oprot.writeFieldStop();" << '\n' << indent() + << "oprot.writeStructEnd();" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } void t_javame_generator::generate_reflection_getters(ostringstream& out, t_type* type, string field_name, string cap_name) { - indent(out) << "case " << constant_name(field_name) << ":" << endl; + indent(out) << "case " << constant_name(field_name) << ":" << '\n'; indent_up(); if (type->is_base_type() && !type->is_string()) { t_base_type* base_type = (t_base_type*)type; indent(out) << "return new " << type_name(type, true, false) << "(" - << (base_type->is_bool() ? "is" : "get") << cap_name << "());" << endl << endl; + << (base_type->is_bool() ? "is" : "get") << cap_name << "());" << '\n' << '\n'; } else { - indent(out) << "return get" << cap_name << "();" << endl << endl; + indent(out) << "return get" << cap_name << "();" << '\n' << '\n'; } indent_down(); @@ -1516,14 +1514,14 @@ void t_javame_generator::generate_reflection_setters(ostringstream& out, t_type* type, string field_name, string cap_name) { - indent(out) << "case " << constant_name(field_name) << ":" << endl; + indent(out) << "case " << constant_name(field_name) << ":" << '\n'; indent_up(); - indent(out) << "if (value == null) {" << endl; - indent(out) << " unset" << get_cap_name(field_name) << "();" << endl; - indent(out) << "} else {" << endl; - indent(out) << " set" << cap_name << "((" << type_name(type, true, false) << ")value);" << endl; - indent(out) << "}" << endl; - indent(out) << "break;" << endl << endl; + indent(out) << "if (value == null) {" << '\n'; + indent(out) << " unset" << get_cap_name(field_name) << "();" << '\n'; + indent(out) << "} else {" << '\n'; + indent(out) << " set" << cap_name << "((" << type_name(type, true, false) << ")value);" << '\n'; + indent(out) << "}" << '\n'; + indent(out) << "break;" << '\n' << '\n'; indent_down(); } @@ -1568,13 +1566,13 @@ void t_javame_generator::generate_java_bean_boilerplate(ostream& out, t_struct* if (type->is_container()) { // Method to return the size of the collection indent(out) << "public int get" << cap_name; - out << get_cap_name("size() {") << endl; + out << get_cap_name("size() {") << '\n'; indent_up(); indent(out) << "return (this." << field_name << " == null) ? 0 : " - << "this." << field_name << ".size();" << endl; + << "this." << field_name << ".size();" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } if (type->is_set() || type->is_list()) { @@ -1588,35 +1586,35 @@ void t_javame_generator::generate_java_bean_boilerplate(ostream& out, t_struct* // Iterator getter for sets and lists indent(out) << "public Enumeration get" << cap_name; - out << get_cap_name("Enumeration() {") << endl; + out << get_cap_name("Enumeration() {") << '\n'; indent_up(); indent(out) << "return (this." << field_name << " == null) ? null : " - << "this." << field_name << ".elements();" << endl; + << "this." << field_name << ".elements();" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; // Add to set or list, create if the set/list is null indent(out); out << "public void add" << get_cap_name("to"); - out << cap_name << "(" << type_name(element_type) << " elem) {" << endl; + out << cap_name << "(" << type_name(element_type) << " elem) {" << '\n'; indent_up(); - indent(out) << "if (this." << field_name << " == null) {" << endl; + indent(out) << "if (this." << field_name << " == null) {" << '\n'; indent_up(); indent(out) << "this." << field_name << " = new " << type_name(type, false, true) << "();" - << endl; + << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; if (type->is_set()) { indent(out) << "this." << field_name << ".put(" << box_type(element_type, "elem") << ", " - << box_type(element_type, "elem") << ");" << endl; + << box_type(element_type, "elem") << ");" << '\n'; } else { indent(out) << "this." << field_name << ".addElement(" << box_type(element_type, "elem") - << ");" << endl; + << ");" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } else if (type->is_map()) { // Put to map @@ -1625,18 +1623,18 @@ void t_javame_generator::generate_java_bean_boilerplate(ostream& out, t_struct* indent(out); out << "public void putTo" << cap_name << "(" << type_name(key_type, true) << " key, " - << type_name(val_type, true) << " val) {" << endl; + << type_name(val_type, true) << " val) {" << '\n'; indent_up(); - indent(out) << "if (this." << field_name << " == null) {" << endl; + indent(out) << "if (this." << field_name << " == null) {" << '\n'; indent_up(); indent(out) << "this." << field_name << " = new " << type_name(type, false, true) << "();" - << endl; + << '\n'; indent_down(); - indent(out) << "}" << endl; - indent(out) << "this." << field_name << ".put(key, val);" << endl; + indent(out) << "}" << '\n'; + indent(out) << "this." << field_name << ".put(key, val);" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } // Simple getter @@ -1647,60 +1645,60 @@ void t_javame_generator::generate_java_bean_boilerplate(ostream& out, t_struct* } else { out << " get"; } - out << cap_name << "() {" << endl; + out << cap_name << "() {" << '\n'; indent_up(); - indent(out) << "return this." << field_name << ";" << endl; + indent(out) << "return this." << field_name << ";" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; // Simple setter generate_java_doc(out, field); indent(out) << "public "; out << "void"; - out << " set" << cap_name << "(" << type_name(type) << " " << field_name << ") {" << endl; + out << " set" << cap_name << "(" << type_name(type) << " " << field_name << ") {" << '\n'; indent_up(); - indent(out) << "this." << field_name << " = " << field_name << ";" << endl; + indent(out) << "this." << field_name << " = " << field_name << ";" << '\n'; generate_isset_set(out, field); indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; // Unsetter - indent(out) << "public void unset" << cap_name << "() {" << endl; + indent(out) << "public void unset" << cap_name << "() {" << '\n'; indent_up(); if (type_can_be_null(type)) { - indent(out) << "this." << field_name << " = null;" << endl; + indent(out) << "this." << field_name << " = null;" << '\n'; } else { - indent(out) << "__isset_vector[" << isset_field_id(field) << "] = false;" << endl; + indent(out) << "__isset_vector[" << isset_field_id(field) << "] = false;" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; // isSet method indent(out) << "/** Returns true if field " << field_name - << " is set (has been assigned a value) and false otherwise */" << endl; - indent(out) << "public boolean is" << get_cap_name("set") << cap_name << "() {" << endl; + << " is set (has been assigned a value) and false otherwise */" << '\n'; + indent(out) << "public boolean is" << get_cap_name("set") << cap_name << "() {" << '\n'; indent_up(); if (type_can_be_null(type)) { - indent(out) << "return this." << field_name << " != null;" << endl; + indent(out) << "return this." << field_name << " != null;" << '\n'; } else { - indent(out) << "return __isset_vector[" << isset_field_id(field) << "];" << endl; + indent(out) << "return __isset_vector[" << isset_field_id(field) << "];" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; indent(out) << "public void set" << cap_name << get_cap_name("isSet") << "(boolean value) {" - << endl; + << '\n'; indent_up(); if (type_can_be_null(type)) { - indent(out) << "if (!value) {" << endl; - indent(out) << " this." << field_name << " = null;" << endl; - indent(out) << "}" << endl; + indent(out) << "if (!value) {" << '\n'; + indent(out) << " this." << field_name << " = null;" << '\n'; + indent(out) << "}" << '\n'; } else { - indent(out) << "__isset_vector[" << isset_field_id(field) << "] = value;" << endl; + indent(out) << "__isset_vector[" << isset_field_id(field) << "] = value;" << '\n'; } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } } @@ -1710,12 +1708,12 @@ void t_javame_generator::generate_java_bean_boilerplate(ostream& out, t_struct* * @param tstruct The struct definition */ void t_javame_generator::generate_java_struct_tostring(ostream& out, t_struct* tstruct) { - out << indent() << "public String toString() {" << endl; + out << indent() << "public String toString() {" << '\n'; indent_up(); out << indent() << "StringBuffer sb = new StringBuffer(\"" << tstruct->get_name() << "(\");" - << endl; - out << indent() << "boolean first = true;" << endl << endl; + << '\n'; + out << indent() << "boolean first = true;" << '\n' << '\n'; const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; @@ -1723,46 +1721,46 @@ void t_javame_generator::generate_java_struct_tostring(ostream& out, t_struct* t for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool could_be_unset = (*f_iter)->get_req() == t_field::T_OPTIONAL; if (could_be_unset) { - indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << endl; + indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << '\n'; indent_up(); } t_field* field = (*f_iter); if (!first) { - indent(out) << "if (!first) sb.append(\", \");" << endl; + indent(out) << "if (!first) sb.append(\", \");" << '\n'; } - indent(out) << "sb.append(\"" << (*f_iter)->get_name() << ":\");" << endl; + indent(out) << "sb.append(\"" << (*f_iter)->get_name() << ":\");" << '\n'; bool can_be_null = type_can_be_null(field->get_type()); if (can_be_null) { - indent(out) << "if (this." << (*f_iter)->get_name() << " == null) {" << endl; - indent(out) << " sb.append(\"null\");" << endl; - indent(out) << "} else {" << endl; + indent(out) << "if (this." << (*f_iter)->get_name() << " == null) {" << '\n'; + indent(out) << " sb.append(\"null\");" << '\n'; + indent(out) << "} else {" << '\n'; indent_up(); } if (field->get_type()->is_binary()) { - indent(out) << "TBaseHelper.toString(this." << field->get_name() << ", sb);" << endl; + indent(out) << "TBaseHelper.toString(this." << field->get_name() << ", sb);" << '\n'; } else { - indent(out) << "sb.append(this." << (*f_iter)->get_name() << ");" << endl; + indent(out) << "sb.append(this." << (*f_iter)->get_name() << ");" << '\n'; } if (can_be_null) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } - indent(out) << "first = false;" << endl; + indent(out) << "first = false;" << '\n'; if (could_be_unset) { indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } first = false; } - out << indent() << "sb.append(\")\");" << endl << indent() << "return sb.toString();" << endl; + out << indent() << "sb.append(\")\");" << '\n' << indent() << "return sb.toString();" << '\n'; indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } /** @@ -1821,7 +1819,7 @@ std::string t_javame_generator::get_java_type_string(t_type* type) { } void t_javame_generator::generate_field_value_meta_data(std::ostream& out, t_type* type) { - out << endl; + out << '\n'; indent_up(); indent_up(); if (type->is_struct() || type->is_xception()) { @@ -1871,7 +1869,7 @@ void t_javame_generator::generate_service(t_service* tservice) { f_service_ << autogen_comment() << java_package() << java_type_imports() << java_thrift_imports(); - f_service_ << "public class " << service_name_ << " {" << endl << endl; + f_service_ << "public class " << service_name_ << " {" << '\n' << '\n'; indent_up(); // Generate the three main parts of the service @@ -1881,7 +1879,7 @@ void t_javame_generator::generate_service(t_service* tservice) { generate_service_helpers(tservice); indent_down(); - f_service_ << "}" << endl; + f_service_ << "}" << '\n'; f_service_.close(); } @@ -1892,7 +1890,7 @@ void t_javame_generator::generate_service(t_service* tservice) { */ void t_javame_generator::generate_primitive_service_interface(t_service* tservice) { f_service_ << indent() << "public interface Iface extends " << service_name_ << "Iface { }" - << endl << endl; + << '\n' << '\n'; string f_interface_name = package_dir_ + "/" + service_name_ + "Iface.java"; ofstream_with_content_based_conditional_update f_iface; @@ -1905,15 +1903,15 @@ void t_javame_generator::generate_primitive_service_interface(t_service* tservic f_iface << autogen_comment() << java_package() << java_type_imports() << java_thrift_imports(); generate_java_doc(f_iface, tservice); - f_iface << "public interface " << service_name_ << "Iface" << extends_iface << " {" << endl - << endl; + f_iface << "public interface " << service_name_ << "Iface" << extends_iface << " {" << '\n' + << '\n'; vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_java_doc(f_iface, *f_iter); - f_iface << " public " << function_signature(*f_iter) << ";" << endl << endl; + f_iface << " public " << function_signature(*f_iter) << ";" << '\n' << '\n'; } - f_iface << "}" << endl << endl; + f_iface << "}" << '\n' << '\n'; } /** @@ -1930,16 +1928,16 @@ void t_javame_generator::generate_service_interface(t_service* tservice) { } generate_java_doc(f_service_, tservice); - f_service_ << indent() << "public interface Iface" << extends_iface << " {" << endl << endl; + f_service_ << indent() << "public interface Iface" << extends_iface << " {" << '\n' << '\n'; indent_up(); vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_java_doc(f_service_, *f_iter); - indent(f_service_) << "public " << function_signature(*f_iter) << ";" << endl << endl; + indent(f_service_) << "public " << function_signature(*f_iter) << ";" << '\n' << '\n'; } indent_down(); - f_service_ << indent() << "}" << endl << endl; + f_service_ << indent() << "}" << '\n' << '\n'; } /** @@ -1971,41 +1969,41 @@ void t_javame_generator::generate_service_client(t_service* tservice) { } indent(f_service_) << "public static class Client" << extends_client - << " implements TServiceClient, Iface {" << endl; + << " implements TServiceClient, Iface {" << '\n'; indent_up(); - indent(f_service_) << "public Client(TProtocol prot)" << endl; + indent(f_service_) << "public Client(TProtocol prot)" << '\n'; scope_up(f_service_); - indent(f_service_) << "this(prot, prot);" << endl; + indent(f_service_) << "this(prot, prot);" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; - indent(f_service_) << "public Client(TProtocol iprot, TProtocol oprot)" << endl; + indent(f_service_) << "public Client(TProtocol iprot, TProtocol oprot)" << '\n'; scope_up(f_service_); if (extends.empty()) { - f_service_ << indent() << "iprot_ = iprot;" << endl << indent() << "oprot_ = oprot;" << endl; + f_service_ << indent() << "iprot_ = iprot;" << '\n' << indent() << "oprot_ = oprot;" << '\n'; } else { - f_service_ << indent() << "super(iprot, oprot);" << endl; + f_service_ << indent() << "super(iprot, oprot);" << '\n'; } scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; if (extends.empty()) { - f_service_ << indent() << "protected TProtocol iprot_;" << endl << indent() - << "protected TProtocol oprot_;" << endl << endl << indent() - << "protected int seqid_;" << endl << endl; + f_service_ << indent() << "protected TProtocol iprot_;" << '\n' << indent() + << "protected TProtocol oprot_;" << '\n' << '\n' << indent() + << "protected int seqid_;" << '\n' << '\n'; - indent(f_service_) << "public TProtocol getInputProtocol()" << endl; + indent(f_service_) << "public TProtocol getInputProtocol()" << '\n'; scope_up(f_service_); - indent(f_service_) << "return this.iprot_;" << endl; + indent(f_service_) << "return this.iprot_;" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; - indent(f_service_) << "public TProtocol getOutputProtocol()" << endl; + indent(f_service_) << "public TProtocol getOutputProtocol()" << '\n'; scope_up(f_service_); - indent(f_service_) << "return this.oprot_;" << endl; + indent(f_service_) << "return this.oprot_;" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; } // Generate client method implementations @@ -2015,7 +2013,7 @@ void t_javame_generator::generate_service_client(t_service* tservice) { string funname = (*f_iter)->get_name(); // Open function - indent(f_service_) << "public " << function_signature(*f_iter) << endl; + indent(f_service_) << "public " << function_signature(*f_iter) << '\n'; scope_up(f_service_); indent(f_service_) << "send_" << funname << "("; @@ -2034,17 +2032,17 @@ void t_javame_generator::generate_service_client(t_service* tservice) { } f_service_ << (*fld_iter)->get_name(); } - f_service_ << ");" << endl; + f_service_ << ");" << '\n'; if (!(*f_iter)->is_oneway()) { f_service_ << indent(); if (!(*f_iter)->get_returntype()->is_void()) { f_service_ << "return "; } - f_service_ << "recv_" << funname << "();" << endl; + f_service_ << "recv_" << funname << "();" << '\n'; } scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; t_function send_function(g_type_void, string("send_") + (*f_iter)->get_name(), @@ -2053,26 +2051,26 @@ void t_javame_generator::generate_service_client(t_service* tservice) { string argsname = (*f_iter)->get_name() + "_args"; // Open function - indent(f_service_) << "public " << function_signature(&send_function) << endl; + indent(f_service_) << "public " << function_signature(&send_function) << '\n'; scope_up(f_service_); // Serialize the request f_service_ << indent() << "oprot_.writeMessageBegin(new TMessage(\"" << funname << "\", " << ((*f_iter)->is_oneway() ? "TMessageType.ONEWAY" : "TMessageType.CALL") - << ", ++seqid_));" << endl << indent() << argsname << " args = new " << argsname - << "();" << endl; + << ", ++seqid_));" << '\n' << indent() << argsname << " args = new " << argsname + << "();" << '\n'; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { f_service_ << indent() << "args.set" << get_cap_name((*fld_iter)->get_name()) << "(" - << (*fld_iter)->get_name() << ");" << endl; + << (*fld_iter)->get_name() << ");" << '\n'; } - f_service_ << indent() << "args.write(oprot_);" << endl << indent() - << "oprot_.writeMessageEnd();" << endl << indent() - << "oprot_.getTransport().flush();" << endl; + f_service_ << indent() << "args.write(oprot_);" << '\n' << indent() + << "oprot_.writeMessageEnd();" << '\n' << indent() + << "oprot_.getTransport().flush();" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; if (!(*f_iter)->is_oneway()) { string resultname = (*f_iter)->get_name() + "_result"; @@ -2083,53 +2081,53 @@ void t_javame_generator::generate_service_client(t_service* tservice) { &noargs, (*f_iter)->get_xceptions()); // Open function - indent(f_service_) << "public " << function_signature(&recv_function) << endl; + indent(f_service_) << "public " << function_signature(&recv_function) << '\n'; scope_up(f_service_); - f_service_ << indent() << "TMessage msg = iprot_.readMessageBegin();" << endl << indent() - << "if (msg.type == TMessageType.EXCEPTION) {" << endl << indent() - << " TApplicationException x = TApplicationException.read(iprot_);" << endl - << indent() << " iprot_.readMessageEnd();" << endl << indent() << " throw x;" - << endl << indent() << "}" << endl << indent() << "if (msg.seqid != seqid_) {" - << endl << indent() + f_service_ << indent() << "TMessage msg = iprot_.readMessageBegin();" << '\n' << indent() + << "if (msg.type == TMessageType.EXCEPTION) {" << '\n' << indent() + << " TApplicationException x = TApplicationException.read(iprot_);" << '\n' + << indent() << " iprot_.readMessageEnd();" << '\n' << indent() << " throw x;" + << '\n' << indent() << "}" << '\n' << indent() << "if (msg.seqid != seqid_) {" + << '\n' << indent() << " throw new TApplicationException(TApplicationException.BAD_SEQUENCE_ID, \"" - << (*f_iter)->get_name() << " failed: out of sequence response\");" << endl - << indent() << "}" << endl << indent() << resultname << " result = new " - << resultname << "();" << endl << indent() << "result.read(iprot_);" << endl - << indent() << "iprot_.readMessageEnd();" << endl; + << (*f_iter)->get_name() << " failed: out of sequence response\");" << '\n' + << indent() << "}" << '\n' << indent() << resultname << " result = new " + << resultname << "();" << '\n' << indent() << "result.read(iprot_);" << '\n' + << indent() << "iprot_.readMessageEnd();" << '\n'; // Careful, only return _result if not a void function if (!(*f_iter)->get_returntype()->is_void()) { - f_service_ << indent() << "if (result." << generate_isset_check("success") << ") {" << endl - << indent() << " return result.success;" << endl << indent() << "}" << endl; + f_service_ << indent() << "if (result." << generate_isset_check("success") << ") {" << '\n' + << indent() << " return result.success;" << '\n' << indent() << "}" << '\n'; } t_struct* xs = (*f_iter)->get_xceptions(); const std::vector& xceptions = xs->get_members(); vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { - f_service_ << indent() << "if (result." << (*x_iter)->get_name() << " != null) {" << endl - << indent() << " throw result." << (*x_iter)->get_name() << ";" << endl - << indent() << "}" << endl; + f_service_ << indent() << "if (result." << (*x_iter)->get_name() << " != null) {" << '\n' + << indent() << " throw result." << (*x_iter)->get_name() << ";" << '\n' + << indent() << "}" << '\n'; } // If you get here it's an exception, unless a void function if ((*f_iter)->get_returntype()->is_void()) { - indent(f_service_) << "return;" << endl; + indent(f_service_) << "return;" << '\n'; } else { f_service_ << indent() << "throw new TApplicationException(TApplicationException.MISSING_RESULT, \"" - << (*f_iter)->get_name() << " failed: unknown result\");" << endl; + << (*f_iter)->get_name() << " failed: unknown result\");" << '\n'; } // Close function scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; } } indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } /** @@ -2152,66 +2150,66 @@ void t_javame_generator::generate_service_server(t_service* tservice) { // Generate the header portion indent(f_service_) << "public static class Processor" << extends_processor - << " implements TProcessor {" << endl; + << " implements TProcessor {" << '\n'; indent_up(); - indent(f_service_) << "public Processor(Iface iface)" << endl; + indent(f_service_) << "public Processor(Iface iface)" << '\n'; scope_up(f_service_); if (!extends.empty()) { - f_service_ << indent() << "super(iface);" << endl; + f_service_ << indent() << "super(iface);" << '\n'; } - f_service_ << indent() << "iface_ = iface;" << endl; + f_service_ << indent() << "iface_ = iface;" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { f_service_ << indent() << "processMap_.put(\"" << (*f_iter)->get_name() << "\", new " - << (*f_iter)->get_name() << "());" << endl; + << (*f_iter)->get_name() << "());" << '\n'; } scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; if (extends.empty()) { f_service_ - << indent() << "protected static interface ProcessFunction {" << endl << indent() + << indent() << "protected static interface ProcessFunction {" << '\n' << indent() << " public void process(int seqid, TProtocol iprot, TProtocol oprot) throws TException;" - << endl << indent() << "}" << endl << endl; + << '\n' << indent() << "}" << '\n' << '\n'; } - f_service_ << indent() << "private Iface iface_;" << endl; + f_service_ << indent() << "private Iface iface_;" << '\n'; if (extends.empty()) { - f_service_ << indent() << "protected final Hashtable processMap_ = new Hashtable();" << endl; + f_service_ << indent() << "protected final Hashtable processMap_ = new Hashtable();" << '\n'; } - f_service_ << endl; + f_service_ << '\n'; // Generate the server implementation indent(f_service_) << "public boolean process(TProtocol iprot, TProtocol oprot) throws TException" - << endl; + << '\n'; scope_up(f_service_); - f_service_ << indent() << "TMessage msg = iprot.readMessageBegin();" << endl; + f_service_ << indent() << "TMessage msg = iprot.readMessageBegin();" << '\n'; // TODO(mcslee): validate message, was the seqid etc. legit? f_service_ - << indent() << "ProcessFunction fn = (ProcessFunction)processMap_.get(msg.name);" << endl - << indent() << "if (fn == null) {" << endl << indent() - << " TProtocolUtil.skip(iprot, TType.STRUCT);" << endl << indent() - << " iprot.readMessageEnd();" << endl << indent() + << indent() << "ProcessFunction fn = (ProcessFunction)processMap_.get(msg.name);" << '\n' + << indent() << "if (fn == null) {" << '\n' << indent() + << " TProtocolUtil.skip(iprot, TType.STRUCT);" << '\n' << indent() + << " iprot.readMessageEnd();" << '\n' << indent() << " TApplicationException x = new " "TApplicationException(TApplicationException.UNKNOWN_METHOD, \"Invalid method name: " - "'\"+msg.name+\"'\");" << endl << indent() + "'\"+msg.name+\"'\");" << '\n' << indent() << " oprot.writeMessageBegin(new TMessage(msg.name, TMessageType.EXCEPTION, msg.seqid));" - << endl << indent() << " x.write(oprot);" << endl << indent() << " oprot.writeMessageEnd();" - << endl << indent() << " oprot.getTransport().flush();" << endl << indent() - << " return true;" << endl << indent() << "}" << endl << indent() - << "fn.process(msg.seqid, iprot, oprot);" << endl; + << '\n' << indent() << " x.write(oprot);" << '\n' << indent() << " oprot.writeMessageEnd();" + << '\n' << indent() << " oprot.getTransport().flush();" << '\n' << indent() + << " return true;" << '\n' << indent() << "}" << '\n' << indent() + << "fn.process(msg.seqid, iprot, oprot);" << '\n'; - f_service_ << indent() << "return true;" << endl; + f_service_ << indent() << "return true;" << '\n'; scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Generate the process subfunctions for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -2219,7 +2217,7 @@ void t_javame_generator::generate_service_server(t_service* tservice) { } indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; } /** @@ -2257,36 +2255,36 @@ void t_javame_generator::generate_process_function(t_service* tservice, t_functi (void)tservice; // Open class indent(f_service_) << "private class " << tfunction->get_name() << " implements ProcessFunction {" - << endl; + << '\n'; indent_up(); // Open function indent(f_service_) << "public void process(int seqid, TProtocol iprot, TProtocol oprot) throws TException" - << endl; + << '\n'; scope_up(f_service_); string argsname = tfunction->get_name() + "_args"; string resultname = tfunction->get_name() + "_result"; - f_service_ << indent() << argsname << " args = new " << argsname << "();" << endl << indent() - << "try {" << endl; + f_service_ << indent() << argsname << " args = new " << argsname << "();" << '\n' << indent() + << "try {" << '\n'; indent_up(); - f_service_ << indent() << "args.read(iprot);" << endl; + f_service_ << indent() << "args.read(iprot);" << '\n'; indent_down(); - f_service_ << indent() << "} catch (TProtocolException e) {" << endl; + f_service_ << indent() << "} catch (TProtocolException e) {" << '\n'; indent_up(); - f_service_ << indent() << "iprot.readMessageEnd();" << endl << indent() + f_service_ << indent() << "iprot.readMessageEnd();" << '\n' << indent() << "TApplicationException x = new " "TApplicationException(TApplicationException.PROTOCOL_ERROR, e.getMessage());" - << endl << indent() << "oprot.writeMessageBegin(new TMessage(\"" - << tfunction->get_name() << "\", TMessageType.EXCEPTION, seqid));" << endl << indent() - << "x.write(oprot);" << endl << indent() << "oprot.writeMessageEnd();" << endl - << indent() << "oprot.getTransport().flush();" << endl << indent() << "return;" - << endl; + << '\n' << indent() << "oprot.writeMessageBegin(new TMessage(\"" + << tfunction->get_name() << "\", TMessageType.EXCEPTION, seqid));" << '\n' << indent() + << "x.write(oprot);" << '\n' << indent() << "oprot.writeMessageEnd();" << '\n' + << indent() << "oprot.getTransport().flush();" << '\n' << indent() << "return;" + << '\n'; indent_down(); - f_service_ << indent() << "}" << endl; - f_service_ << indent() << "iprot.readMessageEnd();" << endl; + f_service_ << indent() << "}" << '\n'; + f_service_ << indent() << "iprot.readMessageEnd();" << '\n'; t_struct* xs = tfunction->get_xceptions(); const std::vector& xceptions = xs->get_members(); @@ -2294,12 +2292,12 @@ void t_javame_generator::generate_process_function(t_service* tservice, t_functi // Declare result for non oneway function if (!tfunction->is_oneway()) { - f_service_ << indent() << resultname << " result = new " << resultname << "();" << endl; + f_service_ << indent() << resultname << " result = new " << resultname << "();" << '\n'; } // Try block for a function with exceptions if (xceptions.size() > 0) { - f_service_ << indent() << "try {" << endl; + f_service_ << indent() << "try {" << '\n'; indent_up(); } @@ -2322,13 +2320,13 @@ void t_javame_generator::generate_process_function(t_service* tservice, t_functi } f_service_ << "args." << (*f_iter)->get_name(); } - f_service_ << ");" << endl; + f_service_ << ");" << '\n'; // Set isset on success field if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void() && !type_can_be_null(tfunction->get_returntype())) { f_service_ << indent() << "result.set" << get_cap_name("success") << get_cap_name("isSet") - << "(true);" << endl; + << "(true);" << '\n'; } if (!tfunction->is_oneway() && xceptions.size() > 0) { @@ -2336,54 +2334,54 @@ void t_javame_generator::generate_process_function(t_service* tservice, t_functi f_service_ << indent() << "}"; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { f_service_ << " catch (" << type_name((*x_iter)->get_type(), false, false) << " " - << (*x_iter)->get_name() << ") {" << endl; + << (*x_iter)->get_name() << ") {" << '\n'; if (!tfunction->is_oneway()) { indent_up(); f_service_ << indent() << "result." << (*x_iter)->get_name() << " = " - << (*x_iter)->get_name() << ";" << endl; + << (*x_iter)->get_name() << ";" << '\n'; indent_down(); f_service_ << indent() << "}"; } else { f_service_ << "}"; } } - f_service_ << " catch (Throwable th) {" << endl; + f_service_ << " catch (Throwable th) {" << '\n'; indent_up(); f_service_ << indent() << "TApplicationException x = new " "TApplicationException(TApplicationException.INTERNAL_ERROR, " "\"Internal error processing " << tfunction->get_name() << "\");" - << endl << indent() << "oprot.writeMessageBegin(new TMessage(\"" - << tfunction->get_name() << "\", TMessageType.EXCEPTION, seqid));" << endl - << indent() << "x.write(oprot);" << endl << indent() << "oprot.writeMessageEnd();" - << endl << indent() << "oprot.getTransport().flush();" << endl << indent() - << "return;" << endl; + << '\n' << indent() << "oprot.writeMessageBegin(new TMessage(\"" + << tfunction->get_name() << "\", TMessageType.EXCEPTION, seqid));" << '\n' + << indent() << "x.write(oprot);" << '\n' << indent() << "oprot.writeMessageEnd();" + << '\n' << indent() << "oprot.getTransport().flush();" << '\n' << indent() + << "return;" << '\n'; indent_down(); - f_service_ << indent() << "}" << endl; + f_service_ << indent() << "}" << '\n'; } // Shortcut out here for oneway functions if (tfunction->is_oneway()) { - f_service_ << indent() << "return;" << endl; + f_service_ << indent() << "return;" << '\n'; scope_down(f_service_); // Close class indent_down(); - f_service_ << indent() << "}" << endl << endl; + f_service_ << indent() << "}" << '\n' << '\n'; return; } f_service_ << indent() << "oprot.writeMessageBegin(new TMessage(\"" << tfunction->get_name() - << "\", TMessageType.REPLY, seqid));" << endl << indent() << "result.write(oprot);" - << endl << indent() << "oprot.writeMessageEnd();" << endl << indent() - << "oprot.getTransport().flush();" << endl; + << "\", TMessageType.REPLY, seqid));" << '\n' << indent() << "result.write(oprot);" + << '\n' << indent() << "oprot.writeMessageEnd();" << '\n' << indent() + << "oprot.getTransport().flush();" << '\n'; // Close function scope_down(f_service_); - f_service_ << endl; + f_service_ << '\n'; // Close class indent_down(); - f_service_ << indent() << "}" << endl << endl; + f_service_ << indent() << "}" << '\n' << '\n'; } /** @@ -2441,11 +2439,11 @@ void t_javame_generator::generate_deserialize_field(ostream& out, t_field* tfiel default: throw "compiler error: no Java name for base type " + t_base_type::t_base_name(tbase); } - out << endl; + out << '\n'; } else if (type->is_enum()) { indent(out) << name << " = " << type_name(tfield->get_type(), true, false) + ".findByValue(iprot.readI32());" - << endl; + << '\n'; } else { printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", tfield->get_name().c_str(), @@ -2459,8 +2457,8 @@ void t_javame_generator::generate_deserialize_field(ostream& out, t_field* tfiel void t_javame_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) { - out << indent() << prefix << " = new " << type_name(tstruct) << "();" << endl << indent() - << prefix << ".read(iprot);" << endl; + out << indent() << prefix << " = new " << type_name(tstruct) << "();" << '\n' << indent() + << prefix << ".read(iprot);" << '\n'; } /** @@ -2483,23 +2481,23 @@ void t_javame_generator::generate_deserialize_container(ostream& out, // Declare variables, read header if (ttype->is_map()) { - indent(out) << "TMap " << obj << " = iprot.readMapBegin();" << endl; + indent(out) << "TMap " << obj << " = iprot.readMapBegin();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "TSet " << obj << " = iprot.readSetBegin();" << endl; + indent(out) << "TSet " << obj << " = iprot.readSetBegin();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "TList " << obj << " = iprot.readListBegin();" << endl; + indent(out) << "TList " << obj << " = iprot.readListBegin();" << '\n'; } indent(out) << prefix << " = new " << type_name(ttype, false, true) // size the collection correctly << "(" << (ttype->is_list() ? "" : "2*") << obj << ".size" - << ");" << endl; + << ");" << '\n'; // For loop iterates over elements string i = tmp("_i"); indent(out) << "for (int " << i << " = 0; " << i << " < " << obj << ".size" << "; " - << "++" << i << ")" << endl; + << "++" << i << ")" << '\n'; scope_up(out); @@ -2515,11 +2513,11 @@ void t_javame_generator::generate_deserialize_container(ostream& out, // Read container end if (ttype->is_map()) { - indent(out) << "iprot.readMapEnd();" << endl; + indent(out) << "iprot.readMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "iprot.readSetEnd();" << endl; + indent(out) << "iprot.readSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "iprot.readListEnd();" << endl; + indent(out) << "iprot.readListEnd();" << '\n'; } scope_down(out); @@ -2536,14 +2534,14 @@ void t_javame_generator::generate_deserialize_map_element(ostream& out, t_field fkey(tmap->get_key_type(), key); t_field fval(tmap->get_val_type(), val); - indent(out) << declare_field(&fkey) << endl; - indent(out) << declare_field(&fval) << endl; + indent(out) << declare_field(&fkey) << '\n'; + indent(out) << declare_field(&fval) << '\n'; generate_deserialize_field(out, &fkey); generate_deserialize_field(out, &fval); indent(out) << prefix << ".put(" << box_type(tmap->get_key_type(), key) << ", " - << box_type(tmap->get_val_type(), val) << ");" << endl; + << box_type(tmap->get_val_type(), val) << ");" << '\n'; } /** @@ -2555,12 +2553,12 @@ void t_javame_generator::generate_deserialize_set_element(ostream& out, string elem = tmp("_elem"); t_field felem(tset->get_elem_type(), elem); - indent(out) << declare_field(&felem) << endl; + indent(out) << declare_field(&felem) << '\n'; generate_deserialize_field(out, &felem); indent(out) << prefix << ".put(" << box_type(tset->get_elem_type(), elem) << ", " - << box_type(tset->get_elem_type(), elem) << ");" << endl; + << box_type(tset->get_elem_type(), elem) << ");" << '\n'; } /** @@ -2572,11 +2570,11 @@ void t_javame_generator::generate_deserialize_list_element(ostream& out, string elem = tmp("_elem"); t_field felem(tlist->get_elem_type(), elem); - indent(out) << declare_field(&felem) << endl; + indent(out) << declare_field(&felem) << '\n'; generate_deserialize_field(out, &felem); - indent(out) << prefix << ".addElement(" << box_type(tlist->get_elem_type(), elem) << ");" << endl; + indent(out) << prefix << ".addElement(" << box_type(tlist->get_elem_type(), elem) << ");" << '\n'; } /** @@ -2598,7 +2596,7 @@ void t_javame_generator::generate_serialize_field(ostream& out, t_field* tfield, } else if (type->is_container()) { generate_serialize_container(out, type, prefix + tfield->get_name()); } else if (type->is_enum()) { - indent(out) << "oprot.writeI32(" << prefix + tfield->get_name() << ".getValue());" << endl; + indent(out) << "oprot.writeI32(" << prefix + tfield->get_name() << ".getValue());" << '\n'; } else if (type->is_base_type()) { string name = prefix + tfield->get_name(); indent(out) << "oprot."; @@ -2640,7 +2638,7 @@ void t_javame_generator::generate_serialize_field(ostream& out, t_field* tfield, } else if (type->is_enum()) { out << "writeI32(" << name << ");"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n", prefix.c_str(), @@ -2659,7 +2657,7 @@ void t_javame_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) { (void)tstruct; - out << indent() << prefix << ".write(oprot);" << endl; + out << indent() << prefix << ".write(oprot);" << '\n'; } /** @@ -2674,14 +2672,14 @@ void t_javame_generator::generate_serialize_container(ostream& out, t_type* ttyp if (ttype->is_map()) { indent(out) << "oprot.writeMapBegin(new TMap(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << prefix - << ".size()));" << endl; + << ".size()));" << '\n'; } else if (ttype->is_set()) { indent(out) << "oprot.writeSetBegin(new TSet(" << type_to_enum(((t_set*)ttype)->get_elem_type()) - << ", " << prefix << ".size()));" << endl; + << ", " << prefix << ".size()));" << '\n'; } else if (ttype->is_list()) { indent(out) << "oprot.writeListBegin(new TList(" << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << prefix << ".size()));" - << endl; + << '\n'; } string iter = tmp("_iter"); @@ -2692,7 +2690,7 @@ void t_javame_generator::generate_serialize_container(ostream& out, t_type* ttyp << ".hasMoreElements(); ) "; scope_up(out); indent(out) << key_type << " " << iter << " = (" << key_type << ")" << enumer - << ".nextElement();" << endl; + << ".nextElement();" << '\n'; } else if (ttype->is_set()) { string enumer = iter + "_enum"; string ele_type = type_name(((t_list*)ttype)->get_elem_type(), true); @@ -2700,7 +2698,7 @@ void t_javame_generator::generate_serialize_container(ostream& out, t_type* ttyp << ".hasMoreElements(); ) "; scope_up(out); indent(out) << ele_type << " " << iter << " = (" << ele_type << ")" << enumer - << ".nextElement();" << endl; + << ".nextElement();" << '\n'; } else if (ttype->is_list()) { string enumer = iter + "_enum"; indent(out) << "for (Enumeration " << enumer << " = " << prefix << ".elements(); " << enumer @@ -2708,7 +2706,7 @@ void t_javame_generator::generate_serialize_container(ostream& out, t_type* ttyp scope_up(out); string ele_type = type_name(((t_list*)ttype)->get_elem_type(), true); indent(out) << ele_type << " " << iter << " = (" << ele_type << ")" << enumer - << ".nextElement();" << endl; + << ".nextElement();" << '\n'; } if (ttype->is_map()) { @@ -2721,11 +2719,11 @@ void t_javame_generator::generate_serialize_container(ostream& out, t_type* ttyp scope_down(out); if (ttype->is_map()) { - indent(out) << "oprot.writeMapEnd();" << endl; + indent(out) << "oprot.writeMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "oprot.writeSetEnd();" << endl; + indent(out) << "oprot.writeSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "oprot.writeListEnd();" << endl; + indent(out) << "oprot.writeListEnd();" << '\n'; } scope_down(out); @@ -3056,7 +3054,7 @@ void t_javame_generator::generate_deep_copy_container(ostream& out, source_name = source_name_p1 + "." + source_name_p2; indent(out) << type_name(type, true, false) << " " << result_name << " = new " - << type_name(container, false, true) << "();" << endl; + << type_name(container, false, true) << "();" << '\n'; std::string iterator_element_name = source_name_p1 + "_element"; std::string enumeration_name = source_name_p1 + "_enum"; @@ -3067,19 +3065,19 @@ void t_javame_generator::generate_deep_copy_container(ostream& out, t_type* val_type = ((t_map*)container)->get_val_type(); indent(out) << "for (Enumeration " << enumeration_name << " = " << source_name << ".keys(); " - << enumeration_name << ".hasMoreElements(); ) {" << endl; + << enumeration_name << ".hasMoreElements(); ) {" << '\n'; indent_up(); - out << endl; + out << '\n'; indent(out) << type_name(key_type, true, false) << " " << iterator_element_name << "_key = (" << type_name(key_type, true, false) << ")" << enumeration_name << ".nextElement();" - << endl; + << '\n'; indent(out) << type_name(val_type, true, false) << " " << iterator_element_name << "_value = (" << type_name(val_type, true, false) << ")" << source_name << ".get(" - << iterator_element_name << "_key);" << endl; + << iterator_element_name << "_key);" << '\n'; - out << endl; + out << '\n'; if (key_type->is_container()) { generate_deep_copy_container(out, @@ -3093,10 +3091,10 @@ void t_javame_generator::generate_deep_copy_container(ostream& out, iterator_element_name + "_key", result_element_name + "_key", key_type); - out << ";" << endl; + out << ";" << '\n'; } - out << endl; + out << '\n'; if (val_type->is_container()) { generate_deep_copy_container(out, @@ -3110,16 +3108,16 @@ void t_javame_generator::generate_deep_copy_container(ostream& out, iterator_element_name + "_value", result_element_name + "_value", val_type); - out << ";" << endl; + out << ";" << '\n'; } - out << endl; + out << '\n'; indent(out) << result_name << ".put(" << result_element_name << "_key, " << result_element_name - << "_value);" << endl; + << "_value);" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } else { t_type* elem_type; @@ -3131,19 +3129,19 @@ void t_javame_generator::generate_deep_copy_container(ostream& out, } indent(out) << "for (Enumeration " << enumeration_name << " = " << source_name - << ".elements(); " << enumeration_name << ".hasMoreElements(); ) {" << endl; + << ".elements(); " << enumeration_name << ".hasMoreElements(); ) {" << '\n'; indent_up(); indent(out) << type_name(elem_type, true, false) << " " << iterator_element_name << " = (" << type_name(elem_type, true, false) << ")" << enumeration_name << ".nextElement();" - << endl; + << '\n'; if (elem_type->is_container()) { // recursive deep copy generate_deep_copy_container(out, iterator_element_name, "", result_element_name, elem_type); if (elem_type->is_list()) { - indent(out) << result_name << ".addElement(" << result_element_name << ");" << endl; + indent(out) << result_name << ".addElement(" << result_element_name << ");" << '\n'; } else { indent(out) << result_name << ".put(" << result_element_name << ", " << result_element_name - << ");" << endl; + << ");" << '\n'; } } else { // iterative copy @@ -3153,22 +3151,22 @@ void t_javame_generator::generate_deep_copy_container(ostream& out, iterator_element_name, "temp_binary_element", elem_type); - out << ";" << endl; + out << ";" << '\n'; if (elem_type->is_list()) { - indent(out) << result_name << ".addElement(temp_binary_element);" << endl; + indent(out) << result_name << ".addElement(temp_binary_element);" << '\n'; } else { - indent(out) << result_name << ".put(temp_binary_element, temp_binary_element);" << endl; + indent(out) << result_name << ".put(temp_binary_element, temp_binary_element);" << '\n'; } } else { indent(out) << result_name << ".addElement("; generate_deep_copy_non_container(out, iterator_element_name, result_name, elem_type); - out << ");" << endl; + out << ");" << '\n'; } } indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } @@ -3179,7 +3177,7 @@ void t_javame_generator::generate_deep_copy_non_container(ostream& out, if (type->is_base_type() || type->is_enum() || type->is_typedef()) { // binary fields need to be copied with System.arraycopy if (type->is_binary()) { - out << "new byte[" << source_name << ".length];" << endl; + out << "new byte[" << source_name << ".length];" << '\n'; indent(out) << "System.arraycopy(" << source_name << ", 0, " << dest_name << ", 0, " << source_name << ".length)"; } @@ -3206,7 +3204,7 @@ std::string t_javame_generator::generate_isset_check(std::string field_name) { void t_javame_generator::generate_isset_set(ostream& out, t_field* field) { if (!type_can_be_null(field->get_type())) { indent(out) << "set" << get_cap_name(field->get_name()) << get_cap_name("isSet") << "(true);" - << endl; + << '\n'; } } @@ -3221,7 +3219,7 @@ std::string t_javame_generator::get_enum_class_name(t_type* type) { void t_javame_generator::generate_struct_desc(ostream& out, t_struct* tstruct) { indent(out) << "private static final TStruct STRUCT_DESC = new TStruct(\"" << tstruct->get_name() - << "\");" << endl; + << "\");" << '\n'; } void t_javame_generator::generate_field_descs(ostream& out, t_struct* tstruct) { @@ -3232,7 +3230,7 @@ void t_javame_generator::generate_field_descs(ostream& out, t_struct* tstruct) { indent(out) << "private static final TField " << constant_name((*m_iter)->get_name()) << "_FIELD_DESC = new TField(\"" << (*m_iter)->get_name() << "\", " << type_to_enum((*m_iter)->get_type()) << ", " - << "(short)" << (*m_iter)->get_key() << ");" << endl; + << "(short)" << (*m_iter)->get_key() << ");" << '\n'; } } @@ -3249,7 +3247,7 @@ bool t_javame_generator::has_bit_vector(t_struct* tstruct) { } void t_javame_generator::generate_java_struct_clear(std::ostream& out, t_struct* tstruct) { - indent(out) << "public void clear() {" << endl; + indent(out) << "public void clear() {" << '\n'; const vector& members = tstruct->get_members(); vector::const_iterator m_iter; @@ -3266,24 +3264,24 @@ void t_javame_generator::generate_java_struct_clear(std::ostream& out, t_struct* true); } else { if (type_can_be_null(t)) { - indent(out) << "this." << (*m_iter)->get_name() << " = null;" << endl; + indent(out) << "this." << (*m_iter)->get_name() << " = null;" << '\n'; } else { // must be a base type // means it also needs to be explicitly unset indent(out) << "set" << get_cap_name((*m_iter)->get_name()) << get_cap_name("isSet") - << "(false);" << endl; + << "(false);" << '\n'; switch (((t_base_type*)t)->get_base()) { case t_base_type::TYPE_I8: case t_base_type::TYPE_I16: case t_base_type::TYPE_I32: case t_base_type::TYPE_I64: - indent(out) << "this." << (*m_iter)->get_name() << " = 0;" << endl; + indent(out) << "this." << (*m_iter)->get_name() << " = 0;" << '\n'; break; case t_base_type::TYPE_DOUBLE: - indent(out) << "this." << (*m_iter)->get_name() << " = 0.0;" << endl; + indent(out) << "this." << (*m_iter)->get_name() << " = 0.0;" << '\n'; break; case t_base_type::TYPE_BOOL: - indent(out) << "this." << (*m_iter)->get_name() << " = false;" << endl; + indent(out) << "this." << (*m_iter)->get_name() << " = false;" << '\n'; break; default: // prevent gcc compiler warning break; @@ -3293,7 +3291,7 @@ void t_javame_generator::generate_java_struct_clear(std::ostream& out, t_struct* } indent_down(); - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } std::string t_javame_generator::display_name() const { diff --git a/compiler/cpp/src/thrift/generate/t_js_generator.cc b/compiler/cpp/src/thrift/generate/t_js_generator.cc index 0e8da5963ee..dfc334bbf0f 100644 --- a/compiler/cpp/src/thrift/generate/t_js_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_js_generator.cc @@ -43,7 +43,6 @@ using std::stringstream; using std::unordered_map; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes static const string episode_file_name = "thrift.js.episode"; // largest consecutive integer representable by a double (2 ^ 53 - 1) static const int64_t max_safe_integer = 0x1fffffffffffff; @@ -339,17 +338,17 @@ class t_js_generator : public t_oop_generator { * @return string The documentation */ string ts_print_doc(t_doc* tdoc) { - string result = endl; + string result = "\n"; if (tdoc->has_doc()) { std::stringstream doc(tdoc->get_doc()); string item; - result += ts_indent() + "/**" + endl; + result += ts_indent() + "/**" + "\n"; while (std::getline(doc, item)) { - result += ts_indent() + " * " + item + endl; + result += ts_indent() + " * " + item + "\n"; } - result += ts_indent() + " */" + endl; + result += ts_indent() + " */" + "\n"; } return result; } @@ -457,7 +456,7 @@ void t_js_generator::init_generator() { f_types_.open(f_types_name.c_str()); if (gen_episode_file_) { const auto types_module = program_->get_name() + "_types"; - f_episode_ << types_module << ":" << thrift_package_output_directory_ << "/" << types_module << endl; + f_episode_ << types_module << ":" << thrift_package_output_directory_ << "/" << types_module << '\n'; } if (gen_ts_) { @@ -469,17 +468,17 @@ void t_js_generator::init_generator() { f_types_ << autogen_comment(); if ((gen_node_ || gen_es6_) && no_ns_) { - f_types_ << "\"use strict\";" << endl << endl; + f_types_ << "\"use strict\";" << '\n' << '\n'; } - f_types_ << js_includes() << endl << render_includes() << endl; + f_types_ << js_includes() << '\n' << render_includes() << '\n'; if (gen_ts_) { - f_types_ts_ << autogen_comment() << ts_includes() << endl << render_ts_includes() << endl; + f_types_ts_ << autogen_comment() << ts_includes() << '\n' << render_ts_includes() << '\n'; } if (gen_node_) { - f_types_ << js_const_type_ << "ttypes = module.exports = {};" << endl; + f_types_ << js_const_type_ << "ttypes = module.exports = {};" << '\n'; } string pns; @@ -490,11 +489,11 @@ void t_js_generator::init_generator() { if (ns_pieces.size() > 0) { for (size_t i = 0; i < ns_pieces.size(); ++i) { pns += ((i == 0) ? "" : ".") + ns_pieces[i]; - f_types_ << "if (typeof " << pns << " === 'undefined') {" << endl; - f_types_ << " " << pns << " = {};" << endl; - f_types_ << "}" << endl; - f_types_ << "" << "if (typeof module !== 'undefined' && module.exports) {" << endl; - f_types_ << " module.exports." << pns << " = " << pns << ";" << endl << "}" << endl; + f_types_ << "if (typeof " << pns << " === 'undefined') {" << '\n'; + f_types_ << " " << pns << " = {};" << '\n'; + f_types_ << "}" << '\n'; + f_types_ << "" << "if (typeof module !== 'undefined' && module.exports) {" << '\n'; + f_types_ << " module.exports." << pns << " = " << pns << ";" << '\n' << "}" << '\n'; } if (gen_ts_) { ts_module_ = pns; @@ -639,11 +638,11 @@ void t_js_generator::generate_typedef(t_typedef* ttypedef) { * @param tenum The enumeration */ void t_js_generator::generate_enum(t_enum* tenum) { - f_types_ << js_type_namespace(tenum->get_program()) << tenum->get_name() << " = {" << endl; + f_types_ << js_type_namespace(tenum->get_program()) << tenum->get_name() << " = {" << '\n'; if (gen_ts_) { f_types_ts_ << ts_print_doc(tenum) << ts_indent() << ts_declare() << "enum " - << tenum->get_name() << " {" << endl; + << tenum->get_name() << " {" << '\n'; } indent_up(); @@ -653,23 +652,23 @@ void t_js_generator::generate_enum(t_enum* tenum) { for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { int value = (*c_iter)->get_value(); if (gen_ts_) { - f_types_ts_ << ts_indent() << (*c_iter)->get_name() << " = " << value << "," << endl; + f_types_ts_ << ts_indent() << (*c_iter)->get_name() << " = " << value << "," << '\n'; // add 'value: key' in addition to 'key: value' for TypeScript enums - f_types_ << indent() << "'" << value << "' : '" << (*c_iter)->get_name() << "'," << endl; + f_types_ << indent() << "'" << value << "' : '" << (*c_iter)->get_name() << "'," << '\n'; } f_types_ << indent() << "'" << (*c_iter)->get_name() << "' : " << value; if (c_iter != constants.end() - 1) { f_types_ << ","; } - f_types_ << endl; + f_types_ << '\n'; } indent_down(); - f_types_ << "};" << endl; + f_types_ << "};" << '\n'; if (gen_ts_) { - f_types_ts_ << ts_indent() << "}" << endl; + f_types_ts_ << ts_indent() << "}" << '\n'; } } @@ -682,11 +681,11 @@ void t_js_generator::generate_const(t_const* tconst) { t_const_value* value = tconst->get_value(); f_types_ << js_type_namespace(program_) << name << " = "; - f_types_ << render_const_value(type, value) << ";" << endl; + f_types_ << render_const_value(type, value) << ";" << '\n'; if (gen_ts_) { f_types_ts_ << ts_print_doc(tconst) << ts_indent() << ts_declare() << js_const_type_ << name << ": " - << ts_get_type(type) << ";" << endl; + << ts_get_type(type) << ";" << '\n'; } } @@ -755,24 +754,24 @@ string t_js_generator::render_const_value(t_type* type, t_const_value* value) { } if (v_iter != val.begin()) out << ","; - out << endl << indent() << render_const_value(g_type_string, v_iter->first); + out << '\n' << indent() << render_const_value(g_type_string, v_iter->first); out << " : "; out << render_const_value(field_type, v_iter->second); } indent_down(); - out << endl << indent() << "})"; + out << '\n' << indent() << "})"; } else if (type->is_map()) { t_type* ktype = ((t_map*)type)->get_key_type(); t_type* vtype = ((t_map*)type)->get_val_type(); - out << "{" << endl; + out << "{" << '\n'; indent_up(); const map& val = value->get_map(); map::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { if (v_iter != val.begin()) - out << "," << endl; + out << "," << '\n'; if (ktype->is_base_type() && ((t_base_type*)get_true_type(ktype))->get_base() == t_base_type::TYPE_I64){ out << indent() << "\"" << v_iter->first->get_integer() << "\""; @@ -784,7 +783,7 @@ string t_js_generator::render_const_value(t_type* type, t_const_value* value) { out << render_const_value(vtype, v_iter->second); } indent_down(); - out << endl << indent() << "}"; + out << '\n' << indent() << "}"; } else if (type->is_list() || type->is_set()) { t_type* etype; if (type->is_list()) { @@ -866,27 +865,27 @@ void t_js_generator::generate_js_struct_definition(ostream& out, if (gen_ts_) { f_types_ts_ << ts_print_doc(tstruct) << ts_indent() << ts_declare() << "class " << tstruct->get_name() << (is_exception ? " extends Thrift.TException" : "") - << " {" << endl; + << " {" << '\n'; } } else { out << js_namespace(tstruct->get_program()) << tstruct->get_name(); if (gen_ts_) { f_types_ts_ << ts_print_doc(tstruct) << ts_indent() << ts_declare() << "class " << tstruct->get_name() << (is_exception ? " extends Thrift.TException" : "") - << " {" << endl; + << " {" << '\n'; } } if (gen_es6_) { if (gen_node_ && is_exception) { - out << " = class extends Thrift.TException {" << endl; + out << " = class extends Thrift.TException {" << '\n'; } else { - out << " = class {" << endl; + out << " = class {" << '\n'; } indent_up(); - indent(out) << "constructor(args) {" << endl; + indent(out) << "constructor(args) {" << '\n'; } else { - out << " = function(args) {" << endl; + out << " = function(args) {" << '\n'; } indent_up(); @@ -894,13 +893,13 @@ void t_js_generator::generate_js_struct_definition(ostream& out, // Call super() method on inherited Error class if (gen_node_ && is_exception) { if (gen_es6_) { - indent(out) << "super(args);" << endl; + indent(out) << "super(args);" << '\n'; } else { indent(out) << "Thrift.TException.call(this, \"" << js_namespace(tstruct->get_program()) - << tstruct->get_name() << "\");" << endl; + << tstruct->get_name() << "\");" << '\n'; } out << indent() << "this.name = \"" << js_namespace(tstruct->get_program()) - << tstruct->get_name() << "\";" << endl; + << tstruct->get_name() << "\";" << '\n'; } // members with arguments @@ -909,9 +908,9 @@ void t_js_generator::generate_js_struct_definition(ostream& out, t_type* t = get_true_type((*m_iter)->get_type()); if ((*m_iter)->get_value() != nullptr && !(t->is_struct() || t->is_xception())) { dval = render_const_value((*m_iter)->get_type(), (*m_iter)->get_value()); - out << indent() << "this." << (*m_iter)->get_name() << " = " << dval << ";" << endl; + out << indent() << "this." << (*m_iter)->get_name() << " = " << dval << ";" << '\n'; } else { - out << indent() << dval << ";" << endl; + out << indent() << dval << ";" << '\n'; } if (gen_ts_) { string ts_access = gen_node_ ? "public " : ""; @@ -919,11 +918,11 @@ void t_js_generator::generate_js_struct_definition(ostream& out, // Special case. Exceptions derive from Error, and error has a non optional message field. // Ignore the optional flag in this case, otherwise we will generate a incompatible field - // in the eyes of typescript. + // in the eyes of typescript. string optional_flag = is_exception && member_name == "message" ? "" : ts_get_req(*m_iter); - + f_types_ts_ << ts_indent() << ts_access << member_name << optional_flag << ": " - << ts_get_type((*m_iter)->get_type()) << ";" << endl; + << ts_get_type((*m_iter)->get_type()) << ";" << '\n'; } } @@ -934,7 +933,7 @@ void t_js_generator::generate_js_struct_definition(ostream& out, t_type* t = get_true_type((*m_iter)->get_type()); if ((*m_iter)->get_value() != nullptr && (t->is_struct() || t->is_xception())) { indent(out) << "this." << (*m_iter)->get_name() << " = " - << render_const_value(t, (*m_iter)->get_value()) << ";" << endl; + << render_const_value(t, (*m_iter)->get_value()) << ";" << '\n'; } } @@ -943,28 +942,28 @@ void t_js_generator::generate_js_struct_definition(ostream& out, t_type* t = get_true_type((*m_iter)->get_type()); if (t->is_xception()) { out << indent() << "if (args instanceof " << js_type_namespace(t->get_program()) - << t->get_name() << ") {" << endl << indent() << indent() << "this." - << (*m_iter)->get_name() << " = args;" << endl << indent() << indent() << "return;" - << endl << indent() << "}" << endl; + << t->get_name() << ") {" << '\n' << indent() << indent() << "this." + << (*m_iter)->get_name() << " = args;" << '\n' << indent() << indent() << "return;" + << '\n' << indent() << "}" << '\n'; } } - indent(out) << "if (args) {" << endl; + indent(out) << "if (args) {" << '\n'; indent_up(); if (gen_ts_) { - f_types_ts_ << endl << ts_indent() << "constructor(args?: { "; + f_types_ts_ << '\n' << ts_indent() << "constructor(args?: { "; } for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_type* t = get_true_type((*m_iter)->get_type()); - indent(out) << "if (args." << (*m_iter)->get_name() << " !== undefined && args." << (*m_iter)->get_name() << " !== null) {" << endl; + indent(out) << "if (args." << (*m_iter)->get_name() << " !== undefined && args." << (*m_iter)->get_name() << " !== null) {" << '\n'; indent_up(); indent(out) << "this." << (*m_iter)->get_name(); if (t->is_struct()) { out << (" = new " + js_type_namespace(t->get_program()) + t->get_name() + "(args."+(*m_iter)->get_name() +");"); - out << endl; + out << '\n'; } else if (t->is_container()) { t_type* etype = get_contained_type(t); string copyFunc = t->is_map() ? "Thrift.copyMap" : "Thrift.copyList"; @@ -993,53 +992,53 @@ void t_js_generator::generate_js_struct_definition(ostream& out, out << (" = " + copyFunc + "(args." + (*m_iter)->get_name() + ", [" + type_list + "]);"); - out << endl; + out << '\n'; } else { - out << " = args." << (*m_iter)->get_name() << ";" << endl; + out << " = args." << (*m_iter)->get_name() << ";" << '\n'; } indent_down(); if (!(*m_iter)->get_req()) { - indent(out) << "} else {" << endl; + indent(out) << "} else {" << '\n'; indent(out) << " throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, " - "'Required field " << (*m_iter)->get_name() << " is unset!');" << endl; + "'Required field " << (*m_iter)->get_name() << " is unset!');" << '\n'; } - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; if (gen_ts_) { f_types_ts_ << (*m_iter)->get_name() << ts_get_req(*m_iter) << ": " << ts_get_type((*m_iter)->get_type()) << "; "; } } indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; if (gen_ts_) { - f_types_ts_ << "});" << endl; + f_types_ts_ << "});" << '\n'; } } // Done with constructor indent_down(); if (gen_es6_) { - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } else { - indent(out) << "};" << endl; + indent(out) << "};" << '\n'; } if (gen_ts_) { - f_types_ts_ << ts_indent() << "}" << endl; + f_types_ts_ << ts_indent() << "}" << '\n'; } if (!gen_es6_) { if (is_exception) { out << "Thrift.inherits(" << js_namespace(tstruct->get_program()) << tstruct->get_name() - << ", Thrift.TException);" << endl; + << ", Thrift.TException);" << '\n'; out << js_namespace(tstruct->get_program()) << tstruct->get_name() << ".prototype.name = '" - << tstruct->get_name() << "';" << endl; + << tstruct->get_name() << "';" << '\n'; } else { // init prototype manually if we aren't using es6 out << js_namespace(tstruct->get_program()) << tstruct->get_name() << ".prototype = {};" - << endl; + << '\n'; } } @@ -1050,7 +1049,7 @@ void t_js_generator::generate_js_struct_definition(ostream& out, // Close out the class definition if (gen_es6_) { indent_down(); - indent(out) << "};" << endl; + indent(out) << "};" << '\n'; } } @@ -1062,84 +1061,84 @@ void t_js_generator::generate_js_struct_reader(ostream& out, t_struct* tstruct) vector::const_iterator f_iter; if (gen_es6_) { - indent(out) << "read (input) {" << endl; + indent(out) << "read (input) {" << '\n'; } else { indent(out) << js_namespace(tstruct->get_program()) << tstruct->get_name() - << ".prototype.read = function(input) {" << endl; + << ".prototype.read = function(input) {" << '\n'; } indent_up(); - indent(out) << "input.readStructBegin();" << endl; + indent(out) << "input.readStructBegin();" << '\n'; // Loop over reading in fields - indent(out) << "while (true) {" << endl; + indent(out) << "while (true) {" << '\n'; indent_up(); - indent(out) << js_const_type_ << "ret = input.readFieldBegin();" << endl; - indent(out) << js_const_type_ << "ftype = ret.ftype;" << endl; + indent(out) << js_const_type_ << "ret = input.readFieldBegin();" << '\n'; + indent(out) << js_const_type_ << "ftype = ret.ftype;" << '\n'; if (!fields.empty()) { - indent(out) << js_const_type_ << "fid = ret.fid;" << endl; + indent(out) << js_const_type_ << "fid = ret.fid;" << '\n'; } // Check for field STOP marker and break - indent(out) << "if (ftype == Thrift.Type.STOP) {" << endl; + indent(out) << "if (ftype == Thrift.Type.STOP) {" << '\n'; indent_up(); - indent(out) << "break;" << endl; + indent(out) << "break;" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; if (!fields.empty()) { // Switch statement on the field we are reading - indent(out) << "switch (fid) {" << endl; + indent(out) << "switch (fid) {" << '\n'; indent_up(); // Generate deserialization code for known cases for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - indent(out) << "case " << (*f_iter)->get_key() << ":" << endl; - indent(out) << "if (ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl; + indent(out) << "case " << (*f_iter)->get_key() << ":" << '\n'; + indent(out) << "if (ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n'; indent_up(); generate_deserialize_field(out, *f_iter, "this."); indent_down(); - indent(out) << "} else {" << endl; + indent(out) << "} else {" << '\n'; - indent(out) << " input.skip(ftype);" << endl; + indent(out) << " input.skip(ftype);" << '\n'; - out << indent() << "}" << endl << indent() << "break;" << endl; + out << indent() << "}" << '\n' << indent() << "break;" << '\n'; } if (fields.size() == 1) { // pseudo case to make jslint happy - indent(out) << "case 0:" << endl; - indent(out) << " input.skip(ftype);" << endl; - indent(out) << " break;" << endl; + indent(out) << "case 0:" << '\n'; + indent(out) << " input.skip(ftype);" << '\n'; + indent(out) << " break;" << '\n'; } // In the default case we skip the field - indent(out) << "default:" << endl; - indent(out) << " input.skip(ftype);" << endl; + indent(out) << "default:" << '\n'; + indent(out) << " input.skip(ftype);" << '\n'; scope_down(out); } else { - indent(out) << "input.skip(ftype);" << endl; + indent(out) << "input.skip(ftype);" << '\n'; } - indent(out) << "input.readFieldEnd();" << endl; + indent(out) << "input.readFieldEnd();" << '\n'; scope_down(out); - indent(out) << "input.readStructEnd();" << endl; + indent(out) << "input.readStructEnd();" << '\n'; - indent(out) << "return;" << endl; + indent(out) << "return;" << '\n'; indent_down(); if (gen_es6_) { - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } else { - indent(out) << "};" << endl << endl; + indent(out) << "};" << '\n' << '\n'; } } @@ -1152,44 +1151,44 @@ void t_js_generator::generate_js_struct_writer(ostream& out, t_struct* tstruct) vector::const_iterator f_iter; if (gen_es6_) { - indent(out) << "write (output) {" << endl; + indent(out) << "write (output) {" << '\n'; } else { indent(out) << js_namespace(tstruct->get_program()) << tstruct->get_name() - << ".prototype.write = function(output) {" << endl; + << ".prototype.write = function(output) {" << '\n'; } indent_up(); - indent(out) << "output.writeStructBegin('" << name << "');" << endl; + indent(out) << "output.writeStructBegin('" << name << "');" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { out << indent() << "if (this." << (*f_iter)->get_name() << " !== null && this." - << (*f_iter)->get_name() << " !== undefined) {" << endl; + << (*f_iter)->get_name() << " !== undefined) {" << '\n'; indent_up(); indent(out) << "output.writeFieldBegin(" << "'" << (*f_iter)->get_name() << "', " << type_to_enum((*f_iter)->get_type()) - << ", " << (*f_iter)->get_key() << ");" << endl; + << ", " << (*f_iter)->get_key() << ");" << '\n'; // Write field contents generate_serialize_field(out, *f_iter, "this."); - indent(out) << "output.writeFieldEnd();" << endl; + indent(out) << "output.writeFieldEnd();" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } - out << indent() << "output.writeFieldStop();" << endl << indent() << "output.writeStructEnd();" - << endl; + out << indent() << "output.writeFieldStop();" << '\n' << indent() << "output.writeStructEnd();" + << '\n'; - out << indent() << "return;" << endl; + out << indent() << "return;" << '\n'; indent_down(); if (gen_es6_) { - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } else { - out << indent() << "};" << endl << endl; + out << indent() << "};" << '\n' << '\n'; } } @@ -1202,7 +1201,7 @@ void t_js_generator::generate_service(t_service* tservice) { string f_service_name = get_out_dir() + service_name_ + ".js"; f_service_.open(f_service_name.c_str()); if (gen_episode_file_) { - f_episode_ << service_name_ << ":" << thrift_package_output_directory_ << "/" << service_name_ << endl; + f_episode_ << service_name_ << ":" << thrift_package_output_directory_ << "/" << service_name_ << '\n'; } if (gen_ts_) { @@ -1213,58 +1212,58 @@ void t_js_generator::generate_service(t_service* tservice) { f_service_ << autogen_comment(); if ((gen_node_ || gen_es6_) && no_ns_) { - f_service_ << "\"use strict\";" << endl << endl; + f_service_ << "\"use strict\";" << '\n' << '\n'; } - f_service_ << js_includes() << endl << render_includes() << endl; + f_service_ << js_includes() << '\n' << render_includes() << '\n'; if (gen_ts_) { if (tservice->get_extends() != nullptr) { f_service_ts_ << "/// get_extends()->get_name() - << ".d.ts\" />" << endl; + << ".d.ts\" />" << '\n'; } - f_service_ts_ << autogen_comment() << endl << ts_includes() << endl << render_ts_includes() << endl; + f_service_ts_ << autogen_comment() << '\n' << ts_includes() << '\n' << render_ts_includes() << '\n'; if (gen_node_) { - f_service_ts_ << "import ttypes = require('./" + program_->get_name() + "_types');" << endl; + f_service_ts_ << "import ttypes = require('./" + program_->get_name() + "_types');" << '\n'; // Generate type aliases // enum vector const& enums = program_->get_enums(); vector::const_iterator e_iter; for (e_iter = enums.begin(); e_iter != enums.end(); ++e_iter) { f_service_ts_ << "import " << (*e_iter)->get_name() << " = ttypes." - << js_namespace(program_) << (*e_iter)->get_name() << endl; + << js_namespace(program_) << (*e_iter)->get_name() << '\n'; } // const vector const& consts = program_->get_consts(); vector::const_iterator c_iter; for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { f_service_ts_ << "import " << (*c_iter)->get_name() << " = ttypes." - << js_namespace(program_) << (*c_iter)->get_name() << endl; + << js_namespace(program_) << (*c_iter)->get_name() << '\n'; } // exception vector const& exceptions = program_->get_xceptions(); vector::const_iterator x_iter; for (x_iter = exceptions.begin(); x_iter != exceptions.end(); ++x_iter) { f_service_ts_ << "import " << (*x_iter)->get_name() << " = ttypes." - << js_namespace(program_) << (*x_iter)->get_name() << endl; + << js_namespace(program_) << (*x_iter)->get_name() << '\n'; } // structs vector const& structs = program_->get_structs(); vector::const_iterator s_iter; for (s_iter = structs.begin(); s_iter != structs.end(); ++s_iter) { f_service_ts_ << "import " << (*s_iter)->get_name() << " = ttypes." - << js_namespace(program_) << (*s_iter)->get_name() << endl; + << js_namespace(program_) << (*s_iter)->get_name() << '\n'; } } else { - f_service_ts_ << "import { " << program_->get_name() << " } from \"./" << program_->get_name() << "_types\";" << endl << endl; + f_service_ts_ << "import { " << program_->get_name() << " } from \"./" << program_->get_name() << "_types\";" << '\n' << '\n'; } if (!ts_module_.empty()) { if (gen_node_) { f_service_ts_ << "declare module " << ts_module_ << " {"; } else { - f_service_ts_ << "declare module \"./" << program_->get_name() << "_types\" {" << endl; + f_service_ts_ << "declare module \"./" << program_->get_name() << "_types\" {" << '\n'; indent_up(); - f_service_ts_ << ts_indent() << "module " << program_->get_name() << " {" << endl; + f_service_ts_ << ts_indent() << "module " << program_->get_name() << " {" << '\n'; indent_up(); } } @@ -1273,17 +1272,17 @@ void t_js_generator::generate_service(t_service* tservice) { if (gen_node_) { if (tservice->get_extends() != nullptr) { f_service_ << js_const_type_ << tservice->get_extends()->get_name() << " = require('./" - << tservice->get_extends()->get_name() << "');" << endl << js_const_type_ + << tservice->get_extends()->get_name() << "');" << '\n' << js_const_type_ << tservice->get_extends()->get_name() - << "Client = " << tservice->get_extends()->get_name() << ".Client;" << endl + << "Client = " << tservice->get_extends()->get_name() << ".Client;" << '\n' << js_const_type_ << tservice->get_extends()->get_name() - << "Processor = " << tservice->get_extends()->get_name() << ".Processor;" << endl; + << "Processor = " << tservice->get_extends()->get_name() << ".Processor;" << '\n'; f_service_ts_ << "import " << tservice->get_extends()->get_name() << " = require('./" - << tservice->get_extends()->get_name() << "');" << endl; + << tservice->get_extends()->get_name() << "');" << '\n'; } - f_service_ << js_const_type_ << "ttypes = require('./" + program_->get_name() + "_types');" << endl; + f_service_ << js_const_type_ << "ttypes = require('./" + program_->get_name() + "_types');" << '\n'; } generate_service_helpers(tservice); @@ -1298,11 +1297,11 @@ void t_js_generator::generate_service(t_service* tservice) { if (gen_ts_) { if (!ts_module_.empty()) { if (gen_node_) { - f_service_ts_ << "}" << endl; + f_service_ts_ << "}" << '\n'; } else { indent_down(); - f_service_ts_ << ts_indent() << "}" << endl; - f_service_ts_ << "}" << endl; + f_service_ts_ << ts_indent() << "}" << '\n'; + f_service_ts_ << "}" << '\n'; } } f_service_ts_.close(); @@ -1322,18 +1321,18 @@ void t_js_generator::generate_service_processor(t_service* tservice) { string prefix = has_js_namespace(tservice->get_program()) ? js_namespace(tservice->get_program()) : js_const_type_; f_service_ << prefix << service_name_ << "Processor = " << "exports.Processor"; if (gen_ts_) { - f_service_ts_ << endl << "declare class Processor "; + f_service_ts_ << '\n' << "declare class Processor "; if (tservice->get_extends() != nullptr) { f_service_ts_ << "extends " << tservice->get_extends()->get_name() << ".Processor "; } - f_service_ts_ << "{" << endl; + f_service_ts_ << "{" << '\n'; indent_up(); if(tservice->get_extends() == nullptr) { - f_service_ts_ << ts_indent() << "private _handler: object;" << endl << endl; + f_service_ts_ << ts_indent() << "private _handler: object;" << '\n' << '\n'; } - f_service_ts_ << ts_indent() << "constructor(handler: object);" << endl; - f_service_ts_ << ts_indent() << "process(input: thrift.TProtocol, output: thrift.TProtocol): void;" << endl; + f_service_ts_ << ts_indent() << "constructor(handler: object);" << '\n'; + f_service_ts_ << ts_indent() << "process(input: thrift.TProtocol, output: thrift.TProtocol): void;" << '\n'; indent_down(); } } else { @@ -1346,65 +1345,65 @@ void t_js_generator::generate_service_processor(t_service* tservice) { // ES6 Constructor if (gen_es6_) { if (is_subclass_service) { - f_service_ << " = class " << service_name_ << "Processor extends " << tservice->get_extends()->get_name() << "Processor {" << endl; + f_service_ << " = class " << service_name_ << "Processor extends " << tservice->get_extends()->get_name() << "Processor {" << '\n'; } else { - f_service_ << " = class " << service_name_ << "Processor {" << endl; + f_service_ << " = class " << service_name_ << "Processor {" << '\n'; } indent_up(); - indent(f_service_) << "constructor(handler) {" << endl; + indent(f_service_) << "constructor(handler) {" << '\n'; } else { - f_service_ << " = function(handler) {" << endl; + f_service_ << " = function(handler) {" << '\n'; } indent_up(); if (gen_es6_ && is_subclass_service) { - indent(f_service_) << "super(handler);" << endl; + indent(f_service_) << "super(handler);" << '\n'; } - indent(f_service_) << "this._handler = handler;" << endl; + indent(f_service_) << "this._handler = handler;" << '\n'; indent_down(); // Done with constructor if (gen_es6_) { - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } else { - indent(f_service_) << "};" << endl; + indent(f_service_) << "};" << '\n'; } // ES5 service inheritance if (!gen_es6_ && is_subclass_service) { indent(f_service_) << "Thrift.inherits(" << js_namespace(tservice->get_program()) << service_name_ << "Processor, " << tservice->get_extends()->get_name() - << "Processor);" << endl; + << "Processor);" << '\n'; } // Generate the server implementation if (gen_es6_) { - indent(f_service_) << "process (input, output) {" << endl; + indent(f_service_) << "process (input, output) {" << '\n'; } else { indent(f_service_) << js_namespace(tservice->get_program()) << service_name_ - << "Processor.prototype.process = function(input, output) {" << endl; + << "Processor.prototype.process = function(input, output) {" << '\n'; } indent_up(); - indent(f_service_) << js_const_type_ << "r = input.readMessageBegin();" << endl << indent() - << "if (this['process_' + r.fname]) {" << endl << indent() - << " return this['process_' + r.fname].call(this, r.rseqid, input, output);" << endl - << indent() << "} else {" << endl << indent() << " input.skip(Thrift.Type.STRUCT);" - << endl << indent() << " input.readMessageEnd();" << endl << indent() + indent(f_service_) << js_const_type_ << "r = input.readMessageBegin();" << '\n' << indent() + << "if (this['process_' + r.fname]) {" << '\n' << indent() + << " return this['process_' + r.fname].call(this, r.rseqid, input, output);" << '\n' + << indent() << "} else {" << '\n' << indent() << " input.skip(Thrift.Type.STRUCT);" + << '\n' << indent() << " input.readMessageEnd();" << '\n' << indent() << " " << js_const_type_ << "x = new " "Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN_METHOD, " - "'Unknown function ' + r.fname);" << endl << indent() + "'Unknown function ' + r.fname);" << '\n' << indent() << " output.writeMessageBegin(r.fname, Thrift.MessageType.EXCEPTION, r.rseqid);" - << endl << indent() << " x.write(output);" << endl << indent() - << " output.writeMessageEnd();" << endl << indent() << " output.flush();" << endl - << indent() << "}" << endl; + << '\n' << indent() << " x.write(output);" << '\n' << indent() + << " output.writeMessageEnd();" << '\n' << indent() << " output.flush();" << '\n' + << indent() << "}" << '\n'; indent_down(); if (gen_es6_) { - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } else { - indent(f_service_) << "};" << endl; + indent(f_service_) << "};" << '\n'; } // Generate the process subfunctions @@ -1415,10 +1414,10 @@ void t_js_generator::generate_service_processor(t_service* tservice) { // Close off the processor class definition if (gen_es6_) { indent_down(); - indent(f_service_) << "};" << endl; + indent(f_service_) << "};" << '\n'; } if (gen_node_ && gen_ts_) { - f_service_ts_ << "}" << endl; + f_service_ts_ << "}" << '\n'; } } @@ -1429,15 +1428,15 @@ void t_js_generator::generate_service_processor(t_service* tservice) { */ void t_js_generator::generate_process_function(t_service* tservice, t_function* tfunction) { if (gen_es6_) { - indent(f_service_) << "process_" + tfunction->get_name() + " (seqid, input, output) {" << endl; + indent(f_service_) << "process_" + tfunction->get_name() + " (seqid, input, output) {" << '\n'; } else { indent(f_service_) << js_namespace(tservice->get_program()) << service_name_ << "Processor.prototype.process_" + tfunction->get_name() - + " = function(seqid, input, output) {" << endl; + + " = function(seqid, input, output) {" << '\n'; } if (gen_ts_) { indent_up(); - f_service_ts_ << ts_indent() << "process_" << tfunction->get_name() << "(seqid: number, input: thrift.TProtocol, output: thrift.TProtocol): void;" << endl; + f_service_ts_ << ts_indent() << "process_" << tfunction->get_name() << "(seqid: number, input: thrift.TProtocol, output: thrift.TProtocol): void;" << '\n'; indent_down(); } @@ -1447,8 +1446,8 @@ void t_js_generator::generate_process_function(t_service* tservice, t_function* string resultname = js_namespace(program_) + service_name_ + "_" + tfunction->get_name() + "_result"; - indent(f_service_) << js_const_type_ << "args = new " << argsname << "();" << endl << indent() - << "args.read(input);" << endl << indent() << "input.readMessageEnd();" << endl; + indent(f_service_) << js_const_type_ << "args = new " << argsname << "();" << '\n' << indent() + << "args.read(input);" << '\n' << indent() << "input.readMessageEnd();" << '\n'; // Generate the function call t_struct* arg_struct = tfunction->get_arglist(); @@ -1469,58 +1468,58 @@ void t_js_generator::generate_process_function(t_service* tservice, t_function* f_service_ << "args." << (*f_iter)->get_name(); } - f_service_ << ");" << endl; + f_service_ << ");" << '\n'; indent_down(); if (gen_es6_) { - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } else { - indent(f_service_) << "};" << endl; + indent(f_service_) << "};" << '\n'; } return; } // Promise style invocation indent(f_service_) << "if (this._handler." << tfunction->get_name() - << ".length === " << fields.size() << ") {" << endl; + << ".length === " << fields.size() << ") {" << '\n'; indent_up(); if (gen_es6_) { - indent(f_service_) << "new Promise((resolve) => resolve(this._handler." << tfunction->get_name() << ".bind(this._handler)(" << endl; + indent(f_service_) << "new Promise((resolve) => resolve(this._handler." << tfunction->get_name() << ".bind(this._handler)(" << '\n'; } else { string maybeComma = (fields.size() > 0 ? "," : ""); indent(f_service_) << "Q.fcall(this._handler." << tfunction->get_name() << ".bind(this._handler)" - << maybeComma << endl; + << maybeComma << '\n'; } indent_up(); for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { string maybeComma = (f_iter != fields.end() - 1 ? "," : ""); - indent(f_service_) << "args." << (*f_iter)->get_name() << maybeComma << endl; + indent(f_service_) << "args." << (*f_iter)->get_name() << maybeComma << '\n'; } indent_down(); if (gen_es6_) { - indent(f_service_) << "))).then(result => {" << endl; + indent(f_service_) << "))).then(result => {" << '\n'; } else { - indent(f_service_) << ").then(function(result) {" << endl; + indent(f_service_) << ").then(function(result) {" << '\n'; } indent_up(); - f_service_ << indent() << js_const_type_ << "result_obj = new " << resultname << "({success: result});" << endl + f_service_ << indent() << js_const_type_ << "result_obj = new " << resultname << "({success: result});" << '\n' << indent() << "output.writeMessageBegin(\"" << tfunction->get_name() - << "\", Thrift.MessageType.REPLY, seqid);" << endl << indent() - << "result_obj.write(output);" << endl << indent() << "output.writeMessageEnd();" << endl - << indent() << "output.flush();" << endl; + << "\", Thrift.MessageType.REPLY, seqid);" << '\n' << indent() + << "result_obj.write(output);" << '\n' << indent() << "output.writeMessageEnd();" << '\n' + << indent() << "output.flush();" << '\n'; indent_down(); if (gen_es6_) { - indent(f_service_) << "}).catch(err => {" << endl; + indent(f_service_) << "}).catch(err => {" << '\n'; } else { - indent(f_service_) << "}).catch(function (err) {" << endl; + indent(f_service_) << "}).catch(function (err) {" << '\n'; } indent_up(); - indent(f_service_) << js_let_type_ << "result;" << endl; + indent(f_service_) << js_let_type_ << "result;" << '\n'; bool has_exception = false; t_struct* exceptions = tfunction->get_xceptions(); @@ -1542,36 +1541,36 @@ void t_js_generator::generate_process_function(t_service* tservice, t_function* } if (has_exception) { - f_service_ << ") {" << endl; + f_service_ << ") {" << '\n'; indent_up(); - f_service_ << indent() << "result = new " << resultname << "(err);" << endl << indent() + f_service_ << indent() << "result = new " << resultname << "(err);" << '\n' << indent() << "output.writeMessageBegin(\"" << tfunction->get_name() - << "\", Thrift.MessageType.REPLY, seqid);" << endl; + << "\", Thrift.MessageType.REPLY, seqid);" << '\n'; indent_down(); - indent(f_service_) << "} else {" << endl; + indent(f_service_) << "} else {" << '\n'; indent_up(); } f_service_ << indent() << "result = new " "Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN," - " err.message);" << endl << indent() << "output.writeMessageBegin(\"" - << tfunction->get_name() << "\", Thrift.MessageType.EXCEPTION, seqid);" << endl; + " err.message);" << '\n' << indent() << "output.writeMessageBegin(\"" + << tfunction->get_name() << "\", Thrift.MessageType.EXCEPTION, seqid);" << '\n'; if (has_exception) { indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } - f_service_ << indent() << "result.write(output);" << endl << indent() - << "output.writeMessageEnd();" << endl << indent() << "output.flush();" << endl; + f_service_ << indent() << "result.write(output);" << '\n' << indent() + << "output.writeMessageEnd();" << '\n' << indent() << "output.flush();" << '\n'; indent_down(); - indent(f_service_) << "});" << endl; + indent(f_service_) << "});" << '\n'; indent_down(); // End promise style invocation // Callback style invocation - indent(f_service_) << "} else {" << endl; + indent(f_service_) << "} else {" << '\n'; indent_up(); indent(f_service_) << "this._handler." << tfunction->get_name() << "("; @@ -1580,12 +1579,12 @@ void t_js_generator::generate_process_function(t_service* tservice, t_function* } if (gen_es6_) { - f_service_ << "(err, result) => {" << endl; + f_service_ << "(err, result) => {" << '\n'; } else { - f_service_ << "function (err, result) {" << endl; + f_service_ << "function (err, result) {" << '\n'; } indent_up(); - indent(f_service_) << js_let_type_ << "result_obj;" << endl; + indent(f_service_) << js_let_type_ << "result_obj;" << '\n'; indent(f_service_) << "if ((err === null || typeof err === 'undefined')"; if (has_exception) { @@ -1597,35 +1596,35 @@ void t_js_generator::generate_process_function(t_service* tservice, t_function* } } } - f_service_ << ") {" << endl; + f_service_ << ") {" << '\n'; indent_up(); f_service_ << indent() << "result_obj = new " << resultname - << "((err !== null || typeof err === 'undefined') ? err : {success: result});" << endl << indent() + << "((err !== null || typeof err === 'undefined') ? err : {success: result});" << '\n' << indent() << "output.writeMessageBegin(\"" << tfunction->get_name() - << "\", Thrift.MessageType.REPLY, seqid);" << endl; + << "\", Thrift.MessageType.REPLY, seqid);" << '\n'; indent_down(); - indent(f_service_) << "} else {" << endl; + indent(f_service_) << "} else {" << '\n'; indent_up(); f_service_ << indent() << "result_obj = new " "Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN," - " err.message);" << endl << indent() << "output.writeMessageBegin(\"" - << tfunction->get_name() << "\", Thrift.MessageType.EXCEPTION, seqid);" << endl; + " err.message);" << '\n' << indent() << "output.writeMessageBegin(\"" + << tfunction->get_name() << "\", Thrift.MessageType.EXCEPTION, seqid);" << '\n'; indent_down(); - f_service_ << indent() << "}" << endl << indent() << "result_obj.write(output);" << endl << indent() - << "output.writeMessageEnd();" << endl << indent() << "output.flush();" << endl; + f_service_ << indent() << "}" << '\n' << indent() << "result_obj.write(output);" << '\n' << indent() + << "output.writeMessageEnd();" << '\n' << indent() << "output.flush();" << '\n'; indent_down(); - indent(f_service_) << "});" << endl; + indent(f_service_) << "});" << '\n'; indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; // End callback style invocation indent_down(); if (gen_es6_) { - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } else { - indent(f_service_) << "};" << endl; + indent(f_service_) << "};" << '\n'; } } @@ -1642,7 +1641,7 @@ void t_js_generator::generate_service_helpers(t_service* tservice) { vector functions = tservice->get_functions(); vector::iterator f_iter; - f_service_ << "//HELPER FUNCTIONS AND STRUCTURES" << endl << endl; + f_service_ << "//HELPER FUNCTIONS AND STRUCTURES" << '\n' << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { t_struct* ts = (*f_iter)->get_arglist(); @@ -1712,7 +1711,7 @@ void t_js_generator::generate_service_client(t_service* tservice) { if (tservice->get_extends() != nullptr) { f_service_ts_ << "extends " << tservice->get_extends()->get_name() << ".Client "; } - f_service_ts_ << "{" << endl; + f_service_ts_ << "{" << '\n'; } } else { f_service_ << js_namespace(tservice->get_program()) << service_name_ @@ -1723,7 +1722,7 @@ void t_js_generator::generate_service_client(t_service* tservice) { if (is_subclass_service) { f_service_ts_ << "extends " << tservice->get_extends()->get_name() << "Client "; } - f_service_ts_ << "{" << endl; + f_service_ts_ << "{" << '\n'; } } @@ -1732,21 +1731,21 @@ void t_js_generator::generate_service_client(t_service* tservice) { if (is_subclass_service) { f_service_ << " = class " << service_name_ << "Client extends " << js_namespace(tservice->get_extends()->get_program()) - << tservice->get_extends()->get_name() << "Client {" << endl; + << tservice->get_extends()->get_name() << "Client {" << '\n'; } else { - f_service_ << " = class " << service_name_ << "Client {" << endl; + f_service_ << " = class " << service_name_ << "Client {" << '\n'; } indent_up(); if (gen_node_) { - indent(f_service_) << "constructor(output, pClass) {" << endl; + indent(f_service_) << "constructor(output, pClass) {" << '\n'; } else { - indent(f_service_) << "constructor(input, output) {" << endl; + indent(f_service_) << "constructor(input, output) {" << '\n'; } } else { if (gen_node_) { - f_service_ << " = function(output, pClass) {" << endl; + f_service_ << " = function(output, pClass) {" << '\n'; } else { - f_service_ << " = function(input, output) {" << endl; + f_service_ << " = function(input, output) {" << '\n'; } } @@ -1754,65 +1753,65 @@ void t_js_generator::generate_service_client(t_service* tservice) { if (gen_node_) { if (gen_es6_ && is_subclass_service) { - indent(f_service_) << "super(output, pClass);" << endl; + indent(f_service_) << "super(output, pClass);" << '\n'; } - indent(f_service_) << "this.output = output;" << endl; - indent(f_service_) << "this.pClass = pClass;" << endl; - indent(f_service_) << "this._seqid = 0;" << endl; - indent(f_service_) << "this._reqs = {};" << endl; + indent(f_service_) << "this.output = output;" << '\n'; + indent(f_service_) << "this.pClass = pClass;" << '\n'; + indent(f_service_) << "this._seqid = 0;" << '\n'; + indent(f_service_) << "this._reqs = {};" << '\n'; if (gen_ts_) { if(!is_subclass_service) { - f_service_ts_ << ts_indent() << "private output: thrift.TTransport;" << endl - << ts_indent() << "private pClass: thrift.TProtocol;" << endl - << ts_indent() << "private _seqid: number;" << endl - << endl; + f_service_ts_ << ts_indent() << "private output: thrift.TTransport;" << '\n' + << ts_indent() << "private pClass: thrift.TProtocol;" << '\n' + << ts_indent() << "private _seqid: number;" << '\n' + << '\n'; } f_service_ts_ << ts_indent() << "constructor(output: thrift.TTransport, pClass: { new(trans: thrift.TTransport): thrift.TProtocol });" - << endl; + << '\n'; } } else { - indent(f_service_) << "this.input = input;" << endl; - indent(f_service_) << "this.output = (!output) ? input : output;" << endl; - indent(f_service_) << "this.seqid = 0;" << endl; + indent(f_service_) << "this.input = input;" << '\n'; + indent(f_service_) << "this.output = (!output) ? input : output;" << '\n'; + indent(f_service_) << "this.seqid = 0;" << '\n'; if (gen_ts_) { - f_service_ts_ << ts_indent() << "input: Thrift.TJSONProtocol;" << endl << ts_indent() - << "output: Thrift.TJSONProtocol;" << endl << ts_indent() << "seqid: number;" - << endl << endl << ts_indent() + f_service_ts_ << ts_indent() << "input: Thrift.TJSONProtocol;" << '\n' << ts_indent() + << "output: Thrift.TJSONProtocol;" << '\n' << ts_indent() << "seqid: number;" + << '\n' << '\n' << ts_indent() << "constructor(input: Thrift.TJSONProtocol, output?: Thrift.TJSONProtocol);" - << endl; + << '\n'; } } indent_down(); if (gen_es6_) { - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } else { - indent(f_service_) << "};" << endl; + indent(f_service_) << "};" << '\n'; if (is_subclass_service) { indent(f_service_) << "Thrift.inherits(" << js_namespace(tservice->get_program()) << service_name_ << "Client, " << js_namespace(tservice->get_extends()->get_program()) - << tservice->get_extends()->get_name() << "Client);" << endl; + << tservice->get_extends()->get_name() << "Client);" << '\n'; } else { // init prototype indent(f_service_) << js_namespace(tservice->get_program()) << service_name_ - << "Client.prototype = {};" << endl; + << "Client.prototype = {};" << '\n'; } } // utils for multiplexed services if (gen_node_) { if (gen_es6_) { - indent(f_service_) << "seqid () { return this._seqid; }" << endl; - indent(f_service_) << "new_seqid () { return this._seqid += 1; }" << endl; + indent(f_service_) << "seqid () { return this._seqid; }" << '\n'; + indent(f_service_) << "new_seqid () { return this._seqid += 1; }" << '\n'; } else { indent(f_service_) << js_namespace(tservice->get_program()) << service_name_ - << "Client.prototype.seqid = function() { return this._seqid; };" << endl + << "Client.prototype.seqid = function() { return this._seqid; };" << '\n' << js_namespace(tservice->get_program()) << service_name_ << "Client.prototype.new_seqid = function() { return this._seqid += 1; };" - << endl; + << '\n'; } } @@ -1827,144 +1826,144 @@ void t_js_generator::generate_service_client(t_service* tservice) { string arglist = argument_list(arg_struct); // Open function - f_service_ << endl; + f_service_ << '\n'; if (gen_es6_) { - indent(f_service_) << funname << " (" << arglist << ") {" << endl; + indent(f_service_) << funname << " (" << arglist << ") {" << '\n'; } else { indent(f_service_) << js_namespace(tservice->get_program()) << service_name_ << "Client.prototype." - << function_signature(*f_iter, "", !gen_es6_) << " {" << endl; + << function_signature(*f_iter, "", !gen_es6_) << " {" << '\n'; } indent_up(); if (gen_ts_) { // function definition without callback - f_service_ts_ << ts_print_doc(*f_iter) << ts_indent() << ts_function_signature(*f_iter, false) << endl; + f_service_ts_ << ts_print_doc(*f_iter) << ts_indent() << ts_function_signature(*f_iter, false) << '\n'; if (!gen_es6_) { // overload with callback - f_service_ts_ << ts_print_doc(*f_iter) << ts_indent() << ts_function_signature(*f_iter, true) << endl; + f_service_ts_ << ts_print_doc(*f_iter) << ts_indent() << ts_function_signature(*f_iter, true) << '\n'; } else { // overload with callback - f_service_ts_ << ts_print_doc(*f_iter) << ts_indent() << ts_function_signature(*f_iter, true) << endl; + f_service_ts_ << ts_print_doc(*f_iter) << ts_indent() << ts_function_signature(*f_iter, true) << '\n'; } } if (gen_es6_ && gen_node_) { - indent(f_service_) << "this._seqid = this.new_seqid();" << endl; - indent(f_service_) << js_const_type_ << "self = this;" << endl << indent() - << "return new Promise((resolve, reject) => {" << endl; + indent(f_service_) << "this._seqid = this.new_seqid();" << '\n'; + indent(f_service_) << js_const_type_ << "self = this;" << '\n' << indent() + << "return new Promise((resolve, reject) => {" << '\n'; indent_up(); - indent(f_service_) << "self._reqs[self.seqid()] = (error, result) => {" << endl; + indent(f_service_) << "self._reqs[self.seqid()] = (error, result) => {" << '\n'; indent_up(); - indent(f_service_) << "return error ? reject(error) : resolve(result);" << endl; + indent(f_service_) << "return error ? reject(error) : resolve(result);" << '\n'; indent_down(); - indent(f_service_) << "};" << endl; - indent(f_service_) << "self.send_" << funname << "(" << arglist << ");" << endl; + indent(f_service_) << "};" << '\n'; + indent(f_service_) << "self.send_" << funname << "(" << arglist << ");" << '\n'; indent_down(); - indent(f_service_) << "});" << endl; + indent(f_service_) << "});" << '\n'; } else if (gen_node_) { // Node.js output ./gen-nodejs - f_service_ << indent() << "this._seqid = this.new_seqid();" << endl << indent() - << "if (callback === undefined) {" << endl; + f_service_ << indent() << "this._seqid = this.new_seqid();" << '\n' << indent() + << "if (callback === undefined) {" << '\n'; indent_up(); - f_service_ << indent() << js_const_type_ << "_defer = Q.defer();" << endl << indent() - << "this._reqs[this.seqid()] = function(error, result) {" << endl; + f_service_ << indent() << js_const_type_ << "_defer = Q.defer();" << '\n' << indent() + << "this._reqs[this.seqid()] = function(error, result) {" << '\n'; indent_up(); - indent(f_service_) << "if (error) {" << endl; + indent(f_service_) << "if (error) {" << '\n'; indent_up(); - indent(f_service_) << "_defer.reject(error);" << endl; + indent(f_service_) << "_defer.reject(error);" << '\n'; indent_down(); - indent(f_service_) << "} else {" << endl; + indent(f_service_) << "} else {" << '\n'; indent_up(); - indent(f_service_) << "_defer.resolve(result);" << endl; + indent(f_service_) << "_defer.resolve(result);" << '\n'; indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; indent_down(); - indent(f_service_) << "};" << endl; - f_service_ << indent() << "this.send_" << funname << "(" << arglist << ");" << endl - << indent() << "return _defer.promise;" << endl; + indent(f_service_) << "};" << '\n'; + f_service_ << indent() << "this.send_" << funname << "(" << arglist << ");" << '\n' + << indent() << "return _defer.promise;" << '\n'; indent_down(); - indent(f_service_) << "} else {" << endl; + indent(f_service_) << "} else {" << '\n'; indent_up(); - f_service_ << indent() << "this._reqs[this.seqid()] = callback;" << endl << indent() - << "this.send_" << funname << "(" << arglist << ");" << endl; + f_service_ << indent() << "this._reqs[this.seqid()] = callback;" << '\n' << indent() + << "this.send_" << funname << "(" << arglist << ");" << '\n'; indent_down(); - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } else if (gen_es6_) { - f_service_ << indent() << js_const_type_ << "self = this;" << endl << indent() - << "return new Promise((resolve, reject) => {" << endl; + f_service_ << indent() << js_const_type_ << "self = this;" << '\n' << indent() + << "return new Promise((resolve, reject) => {" << '\n'; indent_up(); f_service_ << indent() << "self.send_" << funname << "(" << arglist - << (arglist.empty() ? "" : ", ") << "(error, result) => {" << endl; + << (arglist.empty() ? "" : ", ") << "(error, result) => {" << '\n'; indent_up(); - indent(f_service_) << "return error ? reject(error) : resolve(result);" << endl; + indent(f_service_) << "return error ? reject(error) : resolve(result);" << '\n'; indent_down(); - f_service_ << indent() << "});" << endl; + f_service_ << indent() << "});" << '\n'; indent_down(); - f_service_ << indent() << "});" << endl; + f_service_ << indent() << "});" << '\n'; } else if (gen_jquery_) { // jQuery output ./gen-js - f_service_ << indent() << "if (callback === undefined) {" << endl; + f_service_ << indent() << "if (callback === undefined) {" << '\n'; indent_up(); - f_service_ << indent() << "this.send_" << funname << "(" << arglist << ");" << endl; + f_service_ << indent() << "this.send_" << funname << "(" << arglist << ");" << '\n'; if (!(*f_iter)->is_oneway()) { f_service_ << indent(); if (!(*f_iter)->get_returntype()->is_void()) { f_service_ << "return "; } - f_service_ << "this.recv_" << funname << "();" << endl; + f_service_ << "this.recv_" << funname << "();" << '\n'; } indent_down(); - f_service_ << indent() << "} else {" << endl; + f_service_ << indent() << "} else {" << '\n'; indent_up(); f_service_ << indent() << js_const_type_ << "postData = this.send_" << funname << "(" << arglist - << (arglist.empty() ? "" : ", ") << "true);" << endl; - f_service_ << indent() << "return this.output.getTransport()" << endl; + << (arglist.empty() ? "" : ", ") << "true);" << '\n'; + f_service_ << indent() << "return this.output.getTransport()" << '\n'; indent_up(); f_service_ << indent() << ".jqRequest(this, postData, arguments, this.recv_" << funname - << ");" << endl; + << ");" << '\n'; indent_down(); indent_down(); - f_service_ << indent() << "}" << endl; + f_service_ << indent() << "}" << '\n'; } else { // Standard JavaScript ./gen-js f_service_ << indent() << "this.send_" << funname << "(" << arglist - << (arglist.empty() ? "" : ", ") << "callback); " << endl; + << (arglist.empty() ? "" : ", ") << "callback); " << '\n'; if (!(*f_iter)->is_oneway()) { - f_service_ << indent() << "if (!callback) {" << endl; + f_service_ << indent() << "if (!callback) {" << '\n'; f_service_ << indent(); if (!(*f_iter)->get_returntype()->is_void()) { f_service_ << " return "; } - f_service_ << "this.recv_" << funname << "();" << endl; - f_service_ << indent() << "}" << endl; + f_service_ << "this.recv_" << funname << "();" << '\n'; + f_service_ << indent() << "}" << '\n'; } } indent_down(); if (gen_es6_) { - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; } else { - indent(f_service_) << "};" << endl << endl; + indent(f_service_) << "};" << '\n' << '\n'; } // Send function if (gen_es6_) { if (gen_node_) { - indent(f_service_) << "send_" << funname << " (" << arglist << ") {" << endl; + indent(f_service_) << "send_" << funname << " (" << arglist << ") {" << '\n'; } else { // ES6 js still uses callbacks here. Should refactor this to promise style later.. - indent(f_service_) << "send_" << funname << " (" << argument_list(arg_struct, true) << ") {" << endl; + indent(f_service_) << "send_" << funname << " (" << argument_list(arg_struct, true) << ") {" << '\n'; } } else { indent(f_service_) << js_namespace(tservice->get_program()) << service_name_ << "Client.prototype.send_" - << function_signature(*f_iter, "", !gen_node_) << " {" << endl; + << function_signature(*f_iter, "", !gen_node_) << " {" << '\n'; } indent_up(); std::string outputVar; if (gen_node_) { - f_service_ << indent() << js_const_type_ << "output = new this.pClass(this.output);" << endl; + f_service_ << indent() << js_const_type_ << "output = new this.pClass(this.output);" << '\n'; outputVar = "output"; } else { outputVar = "this.output"; @@ -1980,127 +1979,127 @@ void t_js_generator::generate_service_client(t_service* tservice) { // It is possible that a method argument is named "params", we need to ensure the locally // generated identifier "params" is uniquely named std::string params_identifier = this->next_identifier_name(fields, "params"); - f_service_ << indent() << js_const_type_ << params_identifier << " = {" << endl; + f_service_ << indent() << js_const_type_ << params_identifier << " = {" << '\n'; indent_up(); for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { indent(f_service_) << (*fld_iter)->get_name() << ": " << (*fld_iter)->get_name(); if (fld_iter != fields.end()-1) { - f_service_ << "," << endl; + f_service_ << "," << '\n'; } else { - f_service_ << endl; + f_service_ << '\n'; } } indent_down(); - indent(f_service_) << "};" << endl; + indent(f_service_) << "};" << '\n'; // NOTE: "args" is a reserved keyword, so no need to generate a unique identifier - indent(f_service_) << js_const_type_ << "args = new " << argsname << "(" << params_identifier << ");" << endl; + indent(f_service_) << js_const_type_ << "args = new " << argsname << "(" << params_identifier << ");" << '\n'; } else { - indent(f_service_) << js_const_type_ << "args = new " << argsname << "();" << endl; + indent(f_service_) << js_const_type_ << "args = new " << argsname << "();" << '\n'; } // Serialize the request header within try/catch - indent(f_service_) << "try {" << endl; + indent(f_service_) << "try {" << '\n'; indent_up(); if (gen_node_) { f_service_ << indent() << outputVar << ".writeMessageBegin('" << (*f_iter)->get_name() - << "', " << messageType << ", this.seqid());" << endl; + << "', " << messageType << ", this.seqid());" << '\n'; } else { f_service_ << indent() << outputVar << ".writeMessageBegin('" << (*f_iter)->get_name() - << "', " << messageType << ", this.seqid);" << endl; + << "', " << messageType << ", this.seqid);" << '\n'; } // Write to the stream - f_service_ << indent() << "args.write(" << outputVar << ");" << endl << indent() << outputVar - << ".writeMessageEnd();" << endl; + f_service_ << indent() << "args.write(" << outputVar << ");" << '\n' << indent() << outputVar + << ".writeMessageEnd();" << '\n'; if (gen_node_) { if((*f_iter)->is_oneway()) { - f_service_ << indent() << "this.output.flush();" << endl; - f_service_ << indent() << js_const_type_ << "callback = this._reqs[this.seqid()] || function() {};" << endl; - f_service_ << indent() << "delete this._reqs[this.seqid()];" << endl; - f_service_ << indent() << "callback(null);" << endl; + f_service_ << indent() << "this.output.flush();" << '\n'; + f_service_ << indent() << js_const_type_ << "callback = this._reqs[this.seqid()] || function() {};" << '\n'; + f_service_ << indent() << "delete this._reqs[this.seqid()];" << '\n'; + f_service_ << indent() << "callback(null);" << '\n'; } else { - f_service_ << indent() << "return this.output.flush();" << endl; + f_service_ << indent() << "return this.output.flush();" << '\n'; } } else { if (gen_jquery_) { - f_service_ << indent() << "return this.output.getTransport().flush(callback);" << endl; + f_service_ << indent() << "return this.output.getTransport().flush(callback);" << '\n'; } else if (gen_es6_) { - f_service_ << indent() << js_const_type_ << "self = this;" << endl; + f_service_ << indent() << js_const_type_ << "self = this;" << '\n'; if((*f_iter)->is_oneway()) { - f_service_ << indent() << "this.output.getTransport().flush(true, null);" << endl; - f_service_ << indent() << "callback();" << endl; + f_service_ << indent() << "this.output.getTransport().flush(true, null);" << '\n'; + f_service_ << indent() << "callback();" << '\n'; } else { - f_service_ << indent() << "this.output.getTransport().flush(true, () => {" << endl; + f_service_ << indent() << "this.output.getTransport().flush(true, () => {" << '\n'; indent_up(); - f_service_ << indent() << js_let_type_ << "error = null, result = null;" << endl; - f_service_ << indent() << "try {" << endl; - f_service_ << indent() << " result = self.recv_" << funname << "();" << endl; - f_service_ << indent() << "} catch (e) {" << endl; - f_service_ << indent() << " error = e;" << endl; - f_service_ << indent() << "}" << endl; - f_service_ << indent() << "callback(error, result);" << endl; + f_service_ << indent() << js_let_type_ << "error = null, result = null;" << '\n'; + f_service_ << indent() << "try {" << '\n'; + f_service_ << indent() << " result = self.recv_" << funname << "();" << '\n'; + f_service_ << indent() << "} catch (e) {" << '\n'; + f_service_ << indent() << " error = e;" << '\n'; + f_service_ << indent() << "}" << '\n'; + f_service_ << indent() << "callback(error, result);" << '\n'; indent_down(); - f_service_ << indent() << "});" << endl; + f_service_ << indent() << "});" << '\n'; } } else { - f_service_ << indent() << "if (callback) {" << endl; + f_service_ << indent() << "if (callback) {" << '\n'; indent_up(); if((*f_iter)->is_oneway()) { - f_service_ << indent() << "this.output.getTransport().flush(true, null);" << endl; - f_service_ << indent() << "callback();" << endl; + f_service_ << indent() << "this.output.getTransport().flush(true, null);" << '\n'; + f_service_ << indent() << "callback();" << '\n'; } else { - f_service_ << indent() << js_const_type_ << "self = this;" << endl; - f_service_ << indent() << "this.output.getTransport().flush(true, function() {" << endl; + f_service_ << indent() << js_const_type_ << "self = this;" << '\n'; + f_service_ << indent() << "this.output.getTransport().flush(true, function() {" << '\n'; indent_up(); - f_service_ << indent() << js_let_type_ << "result = null;" << endl; - f_service_ << indent() << "try {" << endl; - f_service_ << indent() << " result = self.recv_" << funname << "();" << endl; - f_service_ << indent() << "} catch (e) {" << endl; - f_service_ << indent() << " result = e;" << endl; - f_service_ << indent() << "}" << endl; - f_service_ << indent() << "callback(result);" << endl; + f_service_ << indent() << js_let_type_ << "result = null;" << '\n'; + f_service_ << indent() << "try {" << '\n'; + f_service_ << indent() << " result = self.recv_" << funname << "();" << '\n'; + f_service_ << indent() << "} catch (e) {" << '\n'; + f_service_ << indent() << " result = e;" << '\n'; + f_service_ << indent() << "}" << '\n'; + f_service_ << indent() << "callback(result);" << '\n'; indent_down(); - f_service_ << indent() << "});" << endl; + f_service_ << indent() << "});" << '\n'; } indent_down(); - f_service_ << indent() << "} else {" << endl; - f_service_ << indent() << " return this.output.getTransport().flush();" << endl; - f_service_ << indent() << "}" << endl; + f_service_ << indent() << "} else {" << '\n'; + f_service_ << indent() << " return this.output.getTransport().flush();" << '\n'; + f_service_ << indent() << "}" << '\n'; } } indent_down(); - f_service_ << indent() << "}" << endl; + f_service_ << indent() << "}" << '\n'; // Reset the transport and delete registered callback if there was a serialization error - f_service_ << indent() << "catch (e) {" << endl; + f_service_ << indent() << "catch (e) {" << '\n'; indent_up(); if (gen_node_) { - f_service_ << indent() << "delete this._reqs[this.seqid()];" << endl; - f_service_ << indent() << "if (typeof " << outputVar << ".reset === 'function') {" << endl; - f_service_ << indent() << " " << outputVar << ".reset();" << endl; - f_service_ << indent() << "}" << endl; + f_service_ << indent() << "delete this._reqs[this.seqid()];" << '\n'; + f_service_ << indent() << "if (typeof " << outputVar << ".reset === 'function') {" << '\n'; + f_service_ << indent() << " " << outputVar << ".reset();" << '\n'; + f_service_ << indent() << "}" << '\n'; } else { - f_service_ << indent() << "if (typeof " << outputVar << ".getTransport().reset === 'function') {" << endl; - f_service_ << indent() << " " << outputVar << ".getTransport().reset();" << endl; - f_service_ << indent() << "}" << endl; + f_service_ << indent() << "if (typeof " << outputVar << ".getTransport().reset === 'function') {" << '\n'; + f_service_ << indent() << " " << outputVar << ".getTransport().reset();" << '\n'; + f_service_ << indent() << "}" << '\n'; } - f_service_ << indent() << "throw e;" << endl; + f_service_ << indent() << "throw e;" << '\n'; indent_down(); - f_service_ << indent() << "}" << endl; + f_service_ << indent() << "}" << '\n'; indent_down(); // Close send function if (gen_es6_) { - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } else { - indent(f_service_) << "};" << endl; + indent(f_service_) << "};" << '\n'; } // Receive function @@ -2108,19 +2107,19 @@ void t_js_generator::generate_service_client(t_service* tservice) { std::string resultname = js_namespace(tservice->get_program()) + service_name_ + "_" + (*f_iter)->get_name() + "_result"; - f_service_ << endl; + f_service_ << '\n'; // Open receive function if (gen_node_) { if (gen_es6_) { - indent(f_service_) << "recv_" << (*f_iter)->get_name() << " (input, mtype, rseqid) {" << endl; + indent(f_service_) << "recv_" << (*f_iter)->get_name() << " (input, mtype, rseqid) {" << '\n'; } else { indent(f_service_) << js_namespace(tservice->get_program()) << service_name_ << "Client.prototype.recv_" << (*f_iter)->get_name() - << " = function(input,mtype,rseqid) {" << endl; + << " = function(input,mtype,rseqid) {" << '\n'; } } else { if (gen_es6_) { - indent(f_service_) << "recv_" << (*f_iter)->get_name() << " () {" << endl; + indent(f_service_) << "recv_" << (*f_iter)->get_name() << " () {" << '\n'; } else { t_struct noargs(program_); @@ -2128,7 +2127,7 @@ void t_js_generator::generate_service_client(t_service* tservice) { string("recv_") + (*f_iter)->get_name(), &noargs); indent(f_service_) << js_namespace(tservice->get_program()) << service_name_ - << "Client.prototype." << function_signature(&recv_function) << " {" << endl; + << "Client.prototype." << function_signature(&recv_function) << " {" << '\n'; } } @@ -2142,68 +2141,68 @@ void t_js_generator::generate_service_client(t_service* tservice) { } if (gen_node_) { - f_service_ << indent() << js_const_type_ << "callback = this._reqs[rseqid] || function() {};" << endl - << indent() << "delete this._reqs[rseqid];" << endl; + f_service_ << indent() << js_const_type_ << "callback = this._reqs[rseqid] || function() {};" << '\n' + << indent() << "delete this._reqs[rseqid];" << '\n'; } else { - f_service_ << indent() << js_const_type_ << "ret = this.input.readMessageBegin();" << endl - << indent() << js_const_type_ << "mtype = ret.mtype;" << endl; + f_service_ << indent() << js_const_type_ << "ret = this.input.readMessageBegin();" << '\n' + << indent() << js_const_type_ << "mtype = ret.mtype;" << '\n'; } - f_service_ << indent() << "if (mtype == Thrift.MessageType.EXCEPTION) {" << endl; + f_service_ << indent() << "if (mtype == Thrift.MessageType.EXCEPTION) {" << '\n'; indent_up(); - f_service_ << indent() << js_const_type_ << "x = new Thrift.TApplicationException();" << endl - << indent() << "x.read(" << inputVar << ");" << endl - << indent() << inputVar << ".readMessageEnd();" << endl - << indent() << render_recv_throw("x") << endl; + f_service_ << indent() << js_const_type_ << "x = new Thrift.TApplicationException();" << '\n' + << indent() << "x.read(" << inputVar << ");" << '\n' + << indent() << inputVar << ".readMessageEnd();" << '\n' + << indent() << render_recv_throw("x") << '\n'; scope_down(f_service_); - f_service_ << indent() << js_const_type_ << "result = new " << resultname << "();" << endl << indent() - << "result.read(" << inputVar << ");" << endl; + f_service_ << indent() << js_const_type_ << "result = new " << resultname << "();" << '\n' << indent() + << "result.read(" << inputVar << ");" << '\n'; - f_service_ << indent() << inputVar << ".readMessageEnd();" << endl << endl; + f_service_ << indent() << inputVar << ".readMessageEnd();" << '\n' << '\n'; t_struct* xs = (*f_iter)->get_xceptions(); const std::vector& xceptions = xs->get_members(); vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { - f_service_ << indent() << "if (null !== result." << (*x_iter)->get_name() << ") {" << endl + f_service_ << indent() << "if (null !== result." << (*x_iter)->get_name() << ") {" << '\n' << indent() << " " << render_recv_throw("result." + (*x_iter)->get_name()) - << endl << indent() << "}" << endl; + << '\n' << indent() << "}" << '\n'; } // Careful, only return result if not a void function if (!(*f_iter)->get_returntype()->is_void()) { - f_service_ << indent() << "if (null !== result.success) {" << endl << indent() << " " - << render_recv_return("result.success") << endl << indent() << "}" << endl; + f_service_ << indent() << "if (null !== result.success) {" << '\n' << indent() << " " + << render_recv_return("result.success") << '\n' << indent() << "}" << '\n'; f_service_ << indent() << render_recv_throw("'" + (*f_iter)->get_name() + " failed: unknown result'") - << endl; + << '\n'; } else { if (gen_node_) { - indent(f_service_) << "callback(null);" << endl; + indent(f_service_) << "callback(null);" << '\n'; } else { - indent(f_service_) << "return;" << endl; + indent(f_service_) << "return;" << '\n'; } } // Close receive function indent_down(); if (gen_es6_) { - indent(f_service_) << "}" << endl; + indent(f_service_) << "}" << '\n'; } else { - indent(f_service_) << "};" << endl; + indent(f_service_) << "};" << '\n'; } } } // Finish class definitions if (gen_ts_) { - f_service_ts_ << ts_indent() << "}" << endl; + f_service_ts_ << ts_indent() << "}" << '\n'; } if (gen_es6_) { indent_down(); - f_service_ << "};" << endl; + f_service_ << "};" << '\n'; } } @@ -2284,7 +2283,7 @@ void t_js_generator::generate_deserialize_field(ostream& out, out << ".value"; } - out << ";" << endl; + out << ";" << '\n'; } else { printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", tfield->get_name().c_str(), @@ -2300,7 +2299,7 @@ void t_js_generator::generate_deserialize_field(ostream& out, */ void t_js_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) { out << indent() << prefix << " = new " << js_type_namespace(tstruct->get_program()) - << tstruct->get_name() << "();" << endl << indent() << prefix << ".read(input);" << endl; + << tstruct->get_name() << "();" << '\n' << indent() << prefix << ".read(input);" << '\n'; } void t_js_generator::generate_deserialize_container(ostream& out, t_type* ttype, string prefix) { @@ -2311,36 +2310,36 @@ void t_js_generator::generate_deserialize_container(ostream& out, t_type* ttype, // Declare variables, read header if (ttype->is_map()) { - out << indent() << prefix << " = {};" << endl; + out << indent() << prefix << " = {};" << '\n'; - out << indent() << js_const_type_ << rtmp3 << " = input.readMapBegin();" << endl; - out << indent() << js_const_type_ << size << " = " << rtmp3 << ".size || 0;" << endl; + out << indent() << js_const_type_ << rtmp3 << " = input.readMapBegin();" << '\n'; + out << indent() << js_const_type_ << size << " = " << rtmp3 << ".size || 0;" << '\n'; } else if (ttype->is_set()) { - out << indent() << prefix << " = [];" << endl - << indent() << js_const_type_ << rtmp3 << " = input.readSetBegin();" << endl - << indent() << js_const_type_ << size << " = " << rtmp3 << ".size || 0;" << endl; + out << indent() << prefix << " = [];" << '\n' + << indent() << js_const_type_ << rtmp3 << " = input.readSetBegin();" << '\n' + << indent() << js_const_type_ << size << " = " << rtmp3 << ".size || 0;" << '\n'; } else if (ttype->is_list()) { - out << indent() << prefix << " = [];" << endl - << indent() << js_const_type_ << rtmp3 << " = input.readListBegin();" << endl - << indent() << js_const_type_ << size << " = " << rtmp3 << ".size || 0;" << endl; + out << indent() << prefix << " = [];" << '\n' + << indent() << js_const_type_ << rtmp3 << " = input.readListBegin();" << '\n' + << indent() << js_const_type_ << size << " = " << rtmp3 << ".size || 0;" << '\n'; } // For loop iterates over elements string i = tmp("_i"); - indent(out) << "for (" << js_let_type_ << i << " = 0; " << i << " < " << size << "; ++" << i << ") {" << endl; + indent(out) << "for (" << js_let_type_ << i << " = 0; " << i << " < " << size << "; ++" << i << ") {" << '\n'; indent_up(); if (ttype->is_map()) { if (!gen_node_) { - out << indent() << "if (" << i << " > 0 ) {" << endl << indent() - << " if (input.rstack.length > input.rpos[input.rpos.length -1] + 1) {" << endl - << indent() << " input.rstack.pop();" << endl << indent() << " }" << endl << indent() - << "}" << endl; + out << indent() << "if (" << i << " > 0 ) {" << '\n' << indent() + << " if (input.rstack.length > input.rpos[input.rpos.length -1] + 1) {" << '\n' + << indent() << " input.rstack.pop();" << '\n' << indent() << " }" << '\n' << indent() + << "}" << '\n'; } generate_deserialize_map_element(out, (t_map*)ttype, prefix); @@ -2354,11 +2353,11 @@ void t_js_generator::generate_deserialize_container(ostream& out, t_type* ttype, // Read container end if (ttype->is_map()) { - indent(out) << "input.readMapEnd();" << endl; + indent(out) << "input.readMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "input.readSetEnd();" << endl; + indent(out) << "input.readSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "input.readListEnd();" << endl; + indent(out) << "input.readListEnd();" << '\n'; } } @@ -2371,24 +2370,24 @@ void t_js_generator::generate_deserialize_map_element(ostream& out, t_map* tmap, t_field fkey(tmap->get_key_type(), key); t_field fval(tmap->get_val_type(), val); - indent(out) << declare_field(&fkey, false, false) << ";" << endl; - indent(out) << declare_field(&fval, false, false) << ";" << endl; + indent(out) << declare_field(&fkey, false, false) << ";" << '\n'; + indent(out) << declare_field(&fval, false, false) << ";" << '\n'; generate_deserialize_field(out, &fkey); generate_deserialize_field(out, &fval); - indent(out) << prefix << "[" << key << "] = " << val << ";" << endl; + indent(out) << prefix << "[" << key << "] = " << val << ";" << '\n'; } void t_js_generator::generate_deserialize_set_element(ostream& out, t_set* tset, string prefix) { string elem = tmp("elem"); t_field felem(tset->get_elem_type(), elem); - indent(out) << js_let_type_ << elem << " = null;" << endl; + indent(out) << js_let_type_ << elem << " = null;" << '\n'; generate_deserialize_field(out, &felem); - indent(out) << prefix << ".push(" << elem << ");" << endl; + indent(out) << prefix << ".push(" << elem << ");" << '\n'; } void t_js_generator::generate_deserialize_list_element(ostream& out, @@ -2397,11 +2396,11 @@ void t_js_generator::generate_deserialize_list_element(ostream& out, string elem = tmp("elem"); t_field felem(tlist->get_elem_type(), elem); - indent(out) << js_let_type_ << elem << " = null;" << endl; + indent(out) << js_let_type_ << elem << " = null;" << '\n'; generate_deserialize_field(out, &felem); - indent(out) << prefix << ".push(" << elem << ");" << endl; + indent(out) << prefix << ".push(" << elem << ");" << '\n'; } /** @@ -2465,7 +2464,7 @@ void t_js_generator::generate_serialize_field(ostream& out, t_field* tfield, str } else if (type->is_enum()) { out << "writeI32(" << name << ")"; } - out << ";" << endl; + out << ";" << '\n'; } else { printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n", @@ -2483,7 +2482,7 @@ void t_js_generator::generate_serialize_field(ostream& out, t_field* tfield, str */ void t_js_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) { (void)tstruct; - indent(out) << prefix << ".write(output);" << endl; + indent(out) << prefix << ".write(output);" << '\n'; } /** @@ -2493,58 +2492,58 @@ void t_js_generator::generate_serialize_container(ostream& out, t_type* ttype, s if (ttype->is_map()) { indent(out) << "output.writeMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " - << "Thrift.objectLength(" << prefix << "));" << endl; + << "Thrift.objectLength(" << prefix << "));" << '\n'; } else if (ttype->is_set()) { indent(out) << "output.writeSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " - << prefix << ".length);" << endl; + << prefix << ".length);" << '\n'; } else if (ttype->is_list()) { indent(out) << "output.writeListBegin(" << type_to_enum(((t_list*)ttype)->get_elem_type()) - << ", " << prefix << ".length);" << endl; + << ", " << prefix << ".length);" << '\n'; } if (ttype->is_map()) { string kiter = tmp("kiter"); string viter = tmp("viter"); - indent(out) << "for (" << js_let_type_ << kiter << " in " << prefix << ") {" << endl; + indent(out) << "for (" << js_let_type_ << kiter << " in " << prefix << ") {" << '\n'; indent_up(); - indent(out) << "if (" << prefix << ".hasOwnProperty(" << kiter << ")) {" << endl; + indent(out) << "if (" << prefix << ".hasOwnProperty(" << kiter << ")) {" << '\n'; indent_up(); - indent(out) << js_let_type_ << viter << " = " << prefix << "[" << kiter << "];" << endl; + indent(out) << js_let_type_ << viter << " = " << prefix << "[" << kiter << "];" << '\n'; generate_serialize_map_element(out, (t_map*)ttype, kiter, viter); scope_down(out); scope_down(out); } else if (ttype->is_set()) { string iter = tmp("iter"); - indent(out) << "for (" << js_let_type_ << iter << " in " << prefix << ") {" << endl; + indent(out) << "for (" << js_let_type_ << iter << " in " << prefix << ") {" << '\n'; indent_up(); - indent(out) << "if (" << prefix << ".hasOwnProperty(" << iter << ")) {" << endl; + indent(out) << "if (" << prefix << ".hasOwnProperty(" << iter << ")) {" << '\n'; indent_up(); - indent(out) << iter << " = " << prefix << "[" << iter << "];" << endl; + indent(out) << iter << " = " << prefix << "[" << iter << "];" << '\n'; generate_serialize_set_element(out, (t_set*)ttype, iter); scope_down(out); scope_down(out); } else if (ttype->is_list()) { string iter = tmp("iter"); - indent(out) << "for (" << js_let_type_ << iter << " in " << prefix << ") {" << endl; + indent(out) << "for (" << js_let_type_ << iter << " in " << prefix << ") {" << '\n'; indent_up(); - indent(out) << "if (" << prefix << ".hasOwnProperty(" << iter << ")) {" << endl; + indent(out) << "if (" << prefix << ".hasOwnProperty(" << iter << ")) {" << '\n'; indent_up(); - indent(out) << iter << " = " << prefix << "[" << iter << "];" << endl; + indent(out) << iter << " = " << prefix << "[" << iter << "];" << '\n'; generate_serialize_list_element(out, (t_list*)ttype, iter); scope_down(out); scope_down(out); } if (ttype->is_map()) { - indent(out) << "output.writeMapEnd();" << endl; + indent(out) << "output.writeMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "output.writeSetEnd();" << endl; + indent(out) << "output.writeSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "output.writeListEnd();" << endl; + indent(out) << "output.writeListEnd();" << '\n'; } } diff --git a/compiler/cpp/src/thrift/generate/t_json_generator.cc b/compiler/cpp/src/thrift/generate/t_json_generator.cc index e91d65ad5db..3fb973a4f37 100644 --- a/compiler/cpp/src/thrift/generate/t_json_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_json_generator.cc @@ -42,8 +42,6 @@ using std::stringstream; using std::vector; using std::stack; -static const string endl = "\n"; -static const string quot = "\""; static const bool NO_INDENT = false; static const bool FORCE_STRING = true; @@ -182,20 +180,20 @@ string t_json_generator::escape_json_string(const string& input) { } void t_json_generator::start_object(bool should_indent) { - f_json_ << (should_indent ? indent() : "") << "{" << endl; + f_json_ << (should_indent ? indent() : "") << "{" << '\n'; indent_up(); comma_needed_.push(false); } void t_json_generator::start_array() { - f_json_ << "[" << endl; + f_json_ << "[" << '\n'; indent_up(); comma_needed_.push(false); } void t_json_generator::write_comma_if_needed() { if (comma_needed_.top()) { - f_json_ << "," << endl; + f_json_ << "," << '\n'; } } @@ -230,14 +228,14 @@ void t_json_generator::write_key_and_bool(string key, bool val) { void t_json_generator::end_object() { indent_down(); - f_json_ << endl << indent() << "}"; + f_json_ << '\n' << indent() << "}"; comma_needed_.pop(); } void t_json_generator::end_array() { indent_down(); if (comma_needed_.top()) { - f_json_ << endl; + f_json_ << '\n'; } indent(f_json_) << "]"; comma_needed_.pop(); @@ -296,7 +294,7 @@ void t_json_generator::write_type_spec(t_type* ttype) { } void t_json_generator::close_generator() { - f_json_ << endl; + f_json_ << '\n'; f_json_.close(); } @@ -471,7 +469,7 @@ void t_json_generator::generate_typedef(t_typedef* ttypedef) { } void t_json_generator::write_string(const string& value) { - f_json_ << quot << escape_json_string(value) << quot; + f_json_ << '\"' << escape_json_string(value) << '\"'; } void t_json_generator::write_const_value(t_const_value* value, bool should_force_string) { @@ -537,7 +535,7 @@ void t_json_generator::write_const_value(t_const_value* value, bool should_force } string t_json_generator::json_str(const string& str) { - return quot + escape_json_string(str) + quot; + return string("\"") + escape_json_string(str) + string("\""); } void t_json_generator::generate_constant(t_const* con) { diff --git a/compiler/cpp/src/thrift/generate/t_kotlin_generator.cc b/compiler/cpp/src/thrift/generate/t_kotlin_generator.cc index 78917d99f95..2e81909c48b 100644 --- a/compiler/cpp/src/thrift/generate/t_kotlin_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_kotlin_generator.cc @@ -45,8 +45,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - static const string KOTLIN_RESERVED_WORDS[] = { "as", "as?", "break", "class", "continue", "do", "else", "false", "for", "fun", "if", "in", "!in", "interface", @@ -209,7 +207,7 @@ void t_kotlin_generator::init_generator() { * Nothing in Kotlin generator */ void t_kotlin_generator::close_generator() { - f_types_ << endl; + f_types_ << '\n'; f_types_.close(); } @@ -222,7 +220,7 @@ void t_kotlin_generator::close_generator() { */ void t_kotlin_generator::generate_typedef(t_typedef* ttypedef) { f_types_ << "typealias " << ttypedef->get_symbolic() << " = " - << type_name(ttypedef->get_type(), true) << endl; + << type_name(ttypedef->get_type(), true) << '\n'; } void t_kotlin_generator::generate_enum(t_enum* tenum) { @@ -241,32 +239,32 @@ void t_kotlin_generator::generate_enum(t_enum* tenum) { auto first = true; auto enum_values = tenum->get_constants(); for (auto& enum_value : enum_values) { - f_enum << (first ? "" : ",") << endl; + f_enum << (first ? "" : ",") << '\n'; first = false; indent(f_enum) << enum_value->get_name() << "(" << enum_value->get_value() << ")"; } if (first) { indent(f_enum); } - f_enum << ";" << endl << endl; - indent(f_enum) << "override fun getValue() = value" << endl << endl; + f_enum << ";" << '\n' << '\n'; + indent(f_enum) << "override fun getValue() = value" << '\n' << '\n'; { - indent(f_enum) << "companion object {" << endl; + indent(f_enum) << "companion object {" << '\n'; indent_up(); { - indent(f_enum) << "@kotlin.jvm.JvmStatic" << endl; + indent(f_enum) << "@kotlin.jvm.JvmStatic" << '\n'; indent(f_enum) << "fun findByValue(i: kotlin.Int): " << kotlin_safe_name(tenum->get_name()) - << "? {" << endl; + << "? {" << '\n'; indent_up(); { - indent(f_enum) << "return when (i) {" << endl; + indent(f_enum) << "return when (i) {" << '\n'; indent_up(); { auto enum_values = tenum->get_constants(); for (auto& enum_value : enum_values) { - indent(f_enum) << enum_value->get_value() << " -> " << enum_value->get_name() << endl; + indent(f_enum) << enum_value->get_value() << " -> " << enum_value->get_name() << '\n'; } - indent(f_enum) << "else -> null" << endl; + indent(f_enum) << "else -> null" << '\n'; } scope_down(f_enum); } @@ -322,7 +320,7 @@ void t_kotlin_generator::generate_consts(std::vector consts) { } else { // TODO } - f_types_ << endl; + f_types_ << '\n'; } } @@ -442,7 +440,7 @@ void t_kotlin_generator::generate_struct_field_name_constants(std::ostream& out, t_struct* tstruct) { indent(out) << "enum class _Fields(private val thriftFieldId: kotlin.Short, private val " "fieldName: kotlin.String) : org.apache.thrift.TFieldIdEnum {" - << endl; + << '\n'; indent_up(); { // fields @@ -450,7 +448,7 @@ void t_kotlin_generator::generate_struct_field_name_constants(std::ostream& out, bool first = true; for (auto& field : tstruct->get_members()) { if (!first) { - out << "," << endl; + out << "," << '\n'; } first = false; indent(out) << constant_name(field->get_name()) << "(" << field->get_key() << ", \"" @@ -459,49 +457,49 @@ void t_kotlin_generator::generate_struct_field_name_constants(std::ostream& out, if (first) { indent(out); } - out << ";" << endl << endl; + out << ";" << '\n' << '\n'; } // methods - indent(out) << "override fun getThriftFieldId() = thriftFieldId" << endl << endl; - indent(out) << "override fun getFieldName() = fieldName" << endl << endl; + indent(out) << "override fun getThriftFieldId() = thriftFieldId" << '\n' << '\n'; + indent(out) << "override fun getFieldName() = fieldName" << '\n' << '\n'; // companion object - indent(out) << "companion object {" << endl; + indent(out) << "companion object {" << '\n'; indent_up(); { - indent(out) << "@kotlin.jvm.JvmStatic" << endl; - indent(out) << "fun findByValue(value: kotlin.Int): _Fields? {" << endl; + indent(out) << "@kotlin.jvm.JvmStatic" << '\n'; + indent(out) << "fun findByValue(value: kotlin.Int): _Fields? {" << '\n'; indent_up(); { - indent(out) << "return when (value) {" << endl; + indent(out) << "return when (value) {" << '\n'; indent_up(); { for (auto& field : tstruct->get_members()) { - indent(out) << field->get_key() << " -> " << constant_name(field->get_name()) << endl; + indent(out) << field->get_key() << " -> " << constant_name(field->get_name()) << '\n'; } - indent(out) << "else -> null" << endl; + indent(out) << "else -> null" << '\n'; } scope_down(out); } scope_down(out); } - out << endl; + out << '\n'; { - indent(out) << "@kotlin.jvm.JvmStatic" << endl; - indent(out) << "fun findByName(name: kotlin.String): _Fields? {" << endl; + indent(out) << "@kotlin.jvm.JvmStatic" << '\n'; + indent(out) << "fun findByName(name: kotlin.String): _Fields? {" << '\n'; indent_up(); { - indent(out) << "return when (name) {" << endl; + indent(out) << "return when (name) {" << '\n'; indent_up(); { for (auto& field : tstruct->get_members()) { indent(out) << "\"" << field->get_name() << "\"" - << " -> " << constant_name(field->get_name()) << endl; + << " -> " << constant_name(field->get_name()) << '\n'; } - indent(out) << "else -> null" << endl; + indent(out) << "else -> null" << '\n'; } scope_down(out); } @@ -511,16 +509,16 @@ void t_kotlin_generator::generate_struct_field_name_constants(std::ostream& out, scope_down(out); } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_struct_companion_object(std::ostream& out, t_struct* tstruct) { - indent(out) << "companion object {" << endl; + indent(out) << "companion object {" << '\n'; indent_up(); { indent(out) << "private val STRUCT_DESC: org.apache.thrift.protocol.TStruct = " "org.apache.thrift.protocol.TStruct(\"" - << tstruct->get_name() << "\")" << endl; + << tstruct->get_name() << "\")" << '\n'; { for (auto& field : tstruct->get_members()) { // field desc @@ -528,15 +526,15 @@ void t_kotlin_generator::generate_struct_companion_object(std::ostream& out, t_s << "_FIELD_DESC: org.apache.thrift.protocol.TField = " "org.apache.thrift.protocol.TField(\"" << field->get_name() << "\", " << type_to_enum(field->get_type()) << ", " - << field->get_key() << ")" << endl; + << field->get_key() << ")" << '\n'; // field metadata indent(out) << "private val " << constant_name(field->get_name()) << "_FIELD_META_DATA: org.apache.thrift.meta_data.FieldMetaData = " "org.apache.thrift.meta_data.FieldMetaData(" - << endl; + << '\n'; indent_up(); { - indent(out) << '"' << field->get_name() << '"' << ',' << endl; + indent(out) << '"' << field->get_name() << '"' << ',' << '\n'; indent(out) << "org.apache.thrift.TFieldRequirementType."; if (field->get_req() == t_field::T_REQUIRED) { out << "REQUIRED"; @@ -545,12 +543,12 @@ void t_kotlin_generator::generate_struct_companion_object(std::ostream& out, t_s } else { out << "DEFAULT"; } - out << ',' << endl; + out << ',' << '\n'; generate_field_value_meta_data(indent(out), field->get_type()); - out << ',' << endl; + out << ',' << '\n'; generate_metadata_for_field_annotations(indent(out), field); } - out << ")" << endl; + out << ")" << '\n'; indent_down(); } } @@ -558,23 +556,23 @@ void t_kotlin_generator::generate_struct_companion_object(std::ostream& out, t_s // all fields in a map indent(out) << "private val metadata: Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> = mapOf(" - << endl; + << '\n'; indent_up(); for (auto& field : tstruct->get_members()) { indent(out) << "_Fields." << constant_name(field->get_name()) << " to " - << constant_name(field->get_name()) << "_FIELD_META_DATA," << endl; + << constant_name(field->get_name()) << "_FIELD_META_DATA," << '\n'; } indent_down(); - indent(out) << ")" << endl; + indent(out) << ")" << '\n'; - indent(out) << "init {" << endl; + indent(out) << "init {" << '\n'; indent_up(); indent(out) << "org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(" - << tstruct->get_name() << "::class.java, metadata)" << endl; + << tstruct->get_name() << "::class.java, metadata)" << '\n'; scope_down(out); } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_metadata_for_field_annotations(std::ostream& out, @@ -582,10 +580,10 @@ void t_kotlin_generator::generate_metadata_for_field_annotations(std::ostream& o if (field->annotations_.size() == 0) { out << "emptyMap()"; } else { - out << "mapOf(" << endl; + out << "mapOf(" << '\n'; indent_up(); for (auto& annotation : field->annotations_) { - indent(out) << "\"" + annotation.first + "\" to \"" + annotation.second.back() + "\"," << endl; + indent(out) << "\"" + annotation.first + "\" to \"" + annotation.second.back() + "\"," << '\n'; } indent_down(); indent(out) << ")"; @@ -600,24 +598,24 @@ void t_kotlin_generator::generate_field_value_meta_data(std::ostream& out, t_typ out << "StructMetaData(" << ttype_class << "STRUCT, " << type_name(type) << "::class.java"; } else if (type->is_container()) { if (type->is_list()) { - out << "ListMetaData(" << ttype_class << "LIST," << endl; + out << "ListMetaData(" << ttype_class << "LIST," << '\n'; indent_up(); t_type* elem_type = ((t_list*)type)->get_elem_type(); generate_field_value_meta_data(indent(out), elem_type); indent_down(); } else if (type->is_set()) { - out << "SetMetaData(" << ttype_class << "SET," << endl; + out << "SetMetaData(" << ttype_class << "SET," << '\n'; indent_up(); t_type* elem_type = ((t_set*)type)->get_elem_type(); generate_field_value_meta_data(indent(out), elem_type); indent_down(); } else { - out << "MapMetaData(" << ttype_class << "MAP," << endl; + out << "MapMetaData(" << ttype_class << "MAP," << '\n'; indent_up(); t_type* key_type = ((t_map*)type)->get_key_type(); t_type* val_type = ((t_map*)type)->get_val_type(); generate_field_value_meta_data(indent(out), key_type); - out << "," << endl; + out << "," << '\n'; generate_field_value_meta_data(indent(out), val_type); indent_down(); } @@ -635,30 +633,30 @@ void t_kotlin_generator::generate_field_value_meta_data(std::ostream& out, t_typ } void t_kotlin_generator::generate_struct_method_deep_copy(std::ostream& out, t_struct* tstruct) { - indent(out) << "override fun deepCopy(): " << tstruct->get_name() << " {" << endl; + indent(out) << "override fun deepCopy(): " << tstruct->get_name() << " {" << '\n'; indent_up(); { - indent(out) << "return " << tstruct->get_name() << " (" << endl; + indent(out) << "return " << tstruct->get_name() << " (" << '\n'; indent_up(); { for (auto& field : tstruct->get_members()) { - indent(out) << kotlin_safe_name(field->get_name()) << "," << endl; + indent(out) << kotlin_safe_name(field->get_name()) << "," << '\n'; } } indent_down(); - indent(out) << ")" << endl; + indent(out) << ")" << '\n'; } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_struct_method_compare_to(std::ostream& out, t_struct* tstruct) { indent(out) << "override fun compareTo(other: " << tstruct->get_name() << "?): kotlin.Int {" - << endl; + << '\n'; indent_up(); { indent(out) << "val comparator = compareBy<" << tstruct->get_name() - << "> { it::class.java.name }" << endl; + << "> { it::class.java.name }" << '\n'; indent_up(); for (auto& field : tstruct->get_members()) { indent(out) << ".thenBy"; @@ -667,33 +665,33 @@ void t_kotlin_generator::generate_struct_method_compare_to(std::ostream& out, t_ || field_type->is_binary()) { out << "(org.apache.thrift.TBaseHelper::compareTo)"; } - out << " { it." << kotlin_safe_name(field->get_name()) << " } " << endl; + out << " { it." << kotlin_safe_name(field->get_name()) << " } " << '\n'; } indent_down(); - indent(out) << "return nullsFirst(comparator).compare(this, other)" << endl; + indent(out) << "return nullsFirst(comparator).compare(this, other)" << '\n'; } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_struct_method_field_for_id(std::ostream& out, t_struct* /*tstruct*/) { - indent(out) << "override fun fieldForId(fieldId: kotlin.Int): _Fields {" << endl; + indent(out) << "override fun fieldForId(fieldId: kotlin.Int): _Fields {" << '\n'; indent_up(); { indent(out) << "return _Fields.findByValue(fieldId) ?: throw " "kotlin.IllegalArgumentException(\"invalid fieldId $fieldId\")" - << endl; + << '\n'; } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_struct_method_is_set(std::ostream& out, t_struct* tstruct) { - indent(out) << "override fun isSet(field: _Fields): kotlin.Boolean {" << endl; + indent(out) << "override fun isSet(field: _Fields): kotlin.Boolean {" << '\n'; indent_up(); { - indent(out) << "return when (field) {" << endl; + indent(out) << "return when (field) {" << '\n'; indent_up(); { auto members = tstruct->get_members(); @@ -705,67 +703,67 @@ void t_kotlin_generator::generate_struct_method_is_set(std::ostream& out, t_stru } else { out << "this." << kotlin_safe_name(field->get_name()) << " != null"; } - out << endl; + out << '\n'; } } else { - indent(out) << "else -> false" << endl; + indent(out) << "else -> false" << '\n'; } } scope_down(out); } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_struct_method_clear(std::ostream& out, t_struct* tstruct) { - indent(out) << "override fun clear(): kotlin.Unit {" << endl; + indent(out) << "override fun clear(): kotlin.Unit {" << '\n'; indent_up(); { for (auto& field : tstruct->get_members()) { auto is_required = field->get_req() == t_field::T_REQUIRED; indent(out) << (is_required ? "_" + field->get_name() : kotlin_safe_name(field->get_name())) - << " = null" << endl; + << " = null" << '\n'; } } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_struct_method_validate(std::ostream& out, t_struct* tstruct) { - indent(out) << "@kotlin.jvm.Throws(org.apache.thrift.TException::class)" << endl; - indent(out) << "fun validate(): kotlin.Unit {" << endl; + indent(out) << "@kotlin.jvm.Throws(org.apache.thrift.TException::class)" << '\n'; + indent(out) << "fun validate(): kotlin.Unit {" << '\n'; indent_up(); { for (auto& field : tstruct->get_members()) { bool is_required = field->get_req() == t_field::T_REQUIRED; if (is_required) { - indent(out) << "if (_" << field->get_name() << " == null) {" << endl; + indent(out) << "if (_" << field->get_name() << " == null) {" << '\n'; indent_up(); { indent(out) << "throw org.apache.thrift.TException(\"Required field `" << field->get_name() << "' is null, " "struct is: $this\")" - << endl; + << '\n'; } scope_down(out); } } } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_struct_method_set_field_value(std::ostream& out, t_struct* tstruct) { - indent(out) << "@Suppress(\"UNCHECKED_CAST\")" << endl; + indent(out) << "@Suppress(\"UNCHECKED_CAST\")" << '\n'; indent(out) << "override fun setFieldValue(field: _Fields, value: kotlin.Any?): kotlin.Unit {" - << endl; + << '\n'; indent_up(); { const vector& members = tstruct->get_members(); if (members.size() > 0) { - indent(out) << "when (field) {" << endl; + indent(out) << "when (field) {" << '\n'; indent_up(); { for (auto& field : tstruct->get_members()) { @@ -773,155 +771,155 @@ void t_kotlin_generator::generate_struct_method_set_field_value(std::ostream& ou indent(out) << "_Fields." << constant_name(field->get_name()) << " -> this." << (is_required ? "_" + field->get_name() : kotlin_safe_name(field->get_name())) - << " = value as " << type_name(field->get_type()) << "?" << endl; + << " = value as " << type_name(field->get_type()) << "?" << '\n'; } } scope_down(out); } else { - indent(out) << "return" << endl; + indent(out) << "return" << '\n'; } } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_struct_method_get_field_value(std::ostream& out, t_struct* tstruct) { - indent(out) << "override fun getFieldValue(field: _Fields): kotlin.Any? {" << endl; + indent(out) << "override fun getFieldValue(field: _Fields): kotlin.Any? {" << '\n'; indent_up(); { auto members = tstruct->get_members(); if (members.size() > 0) { - indent(out) << "return when (field) {" << endl; + indent(out) << "return when (field) {" << '\n'; indent_up(); { for (auto& field : tstruct->get_members()) { indent(out) << "_Fields." << constant_name(field->get_name()) << " -> this." - << kotlin_safe_name(field->get_name()) << endl; + << kotlin_safe_name(field->get_name()) << '\n'; } } scope_down(out); } else { - indent(out) << "return null" << endl; + indent(out) << "return null" << '\n'; } } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_struct_method_read(std::ostream& out, t_struct* tstruct) { indent(out) << "override fun read(iproto: org.apache.thrift.protocol.TProtocol): kotlin.Unit {" - << endl; + << '\n'; indent_up(); { indent(out) << "require(org.apache.thrift.scheme.StandardScheme::class.java == iproto.scheme) { " "\"only standard scheme is " "supported for now\" }" - << endl; - indent(out) << tstruct->get_name() << "StandardScheme.read(iproto, this)" << endl; + << '\n'; + indent(out) << tstruct->get_name() << "StandardScheme.read(iproto, this)" << '\n'; } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_struct_method_write(std::ostream& out, t_struct* tstruct) { indent(out) << "override fun write(oproto: org.apache.thrift.protocol.TProtocol): kotlin.Unit {" - << endl; + << '\n'; indent_up(); { indent(out) << "require(org.apache.thrift.scheme.StandardScheme::class.java == oproto.scheme) { " "\"only standard scheme is " "supported for now\" }" - << endl; - indent(out) << tstruct->get_name() << "StandardScheme.write(oproto, this)" << endl; + << '\n'; + indent(out) << tstruct->get_name() << "StandardScheme.write(oproto, this)" << '\n'; } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_struct_standard_scheme_read(std::ostream& out, t_struct* tstruct) { indent(out) << "override fun read(iproto: org.apache.thrift.protocol.TProtocol, struct: " - << tstruct->get_name() << ") {" << endl; + << tstruct->get_name() << ") {" << '\n'; indent_up(); { - indent(out) << "iproto.apply {" << endl; + indent(out) << "iproto.apply {" << '\n'; indent_up(); { - indent(out) << "readStruct {" << endl; + indent(out) << "readStruct {" << '\n'; indent_up(); { - indent(out) << "var stopped = false" << endl; - indent(out) << "while (!stopped) {" << endl; + indent(out) << "var stopped = false" << '\n'; + indent(out) << "while (!stopped) {" << '\n'; indent_up(); { - indent(out) << "stopped = readField {" << endl; + indent(out) << "stopped = readField {" << '\n'; indent_up(); { indent(out) << "val skipNext = { " "org.apache.thrift.protocol.TProtocolUtil.skip(iproto, it.type) }" - << endl; + << '\n'; - indent(out) << "when (it.id.toInt()) {" << endl; + indent(out) << "when (it.id.toInt()) {" << '\n'; indent_up(); { for (auto& field : tstruct->get_members()) { - indent(out) << field->get_key() << " -> {" << endl; + indent(out) << field->get_key() << " -> {" << '\n'; indent_up(); { indent(out) << "if (it.type == " << type_to_enum(field->get_type()) << ") {" - << endl; + << '\n'; indent_up(); generate_deserialize_field(out, field, "struct."); indent_down(); - indent(out) << "} else {" << endl; + indent(out) << "} else {" << '\n'; indent_up(); - indent(out) << "skipNext()" << endl; + indent(out) << "skipNext()" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } scope_down(out); } - indent(out) << "else -> skipNext()" << endl; + indent(out) << "else -> skipNext()" << '\n'; } scope_down(out); } scope_down(out); } scope_down(out); - indent(out) << "struct.validate()" << endl; + indent(out) << "struct.validate()" << '\n'; } scope_down(out); } scope_down(out); } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_struct_standard_scheme_write(std::ostream& out, t_struct* tstruct) { indent(out) << "override fun write(oproto: org.apache.thrift.protocol.TProtocol, struct: " - << tstruct->get_name() << ") {" << endl; + << tstruct->get_name() << ") {" << '\n'; indent_up(); { - indent(out) << "struct.validate()" << endl; - indent(out) << "oproto.apply {" << endl; + indent(out) << "struct.validate()" << '\n'; + indent(out) << "oproto.apply {" << '\n'; indent_up(); { - indent(out) << "writeStruct(STRUCT_DESC) {" << endl; + indent(out) << "writeStruct(STRUCT_DESC) {" << '\n'; indent_up(); { for (auto& field : tstruct->get_members()) { auto is_required = field->get_req() == t_field::T_REQUIRED; indent(out) << "struct." << kotlin_safe_name(field->get_name()) << (is_required ? "" : "?") << ".let { " - << kotlin_safe_name(field->get_name()) << " ->" << endl; + << kotlin_safe_name(field->get_name()) << " ->" << '\n'; indent_up(); { indent(out) << "writeField(" << constant_name(field->get_name()) << "_FIELD_DESC) {" - << endl; + << '\n'; indent_up(); generate_serialize_field(out, field); scope_down(out); @@ -929,36 +927,36 @@ void t_kotlin_generator::generate_struct_standard_scheme_write(std::ostream& out scope_down(out); } } - indent(out) << "writeFieldStop()" << endl; + indent(out) << "writeFieldStop()" << '\n'; scope_down(out); } scope_down(out); } scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_struct_standard_scheme(std::ostream& out, t_struct* tstruct) { indent(out) << "private object " << tstruct->get_name() << "StandardScheme : org.apache.thrift.scheme.StandardScheme<" << tstruct->get_name() - << ">() {" << endl; + << ">() {" << '\n'; indent_up(); generate_struct_standard_scheme_read(out, tstruct); generate_struct_standard_scheme_write(out, tstruct); scope_down(out); - out << endl; + out << '\n'; } void t_kotlin_generator::generate_union_tuple_scheme(std::ostream& out, t_struct* /*tunion*/) { indent(out) << "override fun tupleSchemeReadValue(iproto: org.apache.thrift.protocol.TProtocol, " "fieldID: kotlin.Short) = throw kotlin.UnsupportedOperationException(\"only " "standard scheme is supported for now\")" - << endl; + << '\n'; indent(out) << "override fun tupleSchemeWriteValue(oproto: org.apache.thrift.protocol.TProtocol) = " "throw kotlin.UnsupportedOperationException(\"only standard scheme is supported for " "now\")" - << endl; + << '\n'; } void t_kotlin_generator::generate_union_standard_scheme(std::ostream& out, t_struct* tunion) { @@ -970,61 +968,61 @@ void t_kotlin_generator::generate_union_standard_scheme_read(std::ostream& out, indent(out) << "override fun standardSchemeReadValue(iproto: org.apache.thrift.protocol.TProtocol, " "field: org.apache.thrift.protocol.TField): Any? =" - << endl; + << '\n'; indent_up(); - indent(out) << "when (_Fields.findByValue(field.id.toInt())) {" << endl; + indent(out) << "when (_Fields.findByValue(field.id.toInt())) {" << '\n'; indent_up(); for (auto& member : tunion->get_members()) { auto expect_type = type_name(member->get_type()); - indent(out) << "_Fields." << constant_name(member->get_name()) << " -> {" << endl; + indent(out) << "_Fields." << constant_name(member->get_name()) << " -> {" << '\n'; indent_up(); { indent(out) << "if (field.type == " << constant_name(member->get_name()) - << "_FIELD_DESC.type) {" << endl; + << "_FIELD_DESC.type) {" << '\n'; indent_up(); - indent(out) << "iproto.run {" << endl; + indent(out) << "iproto.run {" << '\n'; indent_up(); indent(out); generate_deserialize_value(out, member->get_type()); - out << endl; + out << '\n'; scope_down(out); indent_down(); - indent(out) << "} else {" << endl; + indent(out) << "} else {" << '\n'; indent_up(); - indent(out) << "org.apache.thrift.protocol.TProtocolUtil.skip(iproto, field.type)" << endl; - indent(out) << "null" << endl; + indent(out) << "org.apache.thrift.protocol.TProtocolUtil.skip(iproto, field.type)" << '\n'; + indent(out) << "null" << '\n'; scope_down(out); } scope_down(out); } - indent(out) << "null -> {" << endl; + indent(out) << "null -> {" << '\n'; indent_up(); - indent(out) << "org.apache.thrift.protocol.TProtocolUtil.skip(iproto, field.type)" << endl; - indent(out) << "null" << endl; + indent(out) << "org.apache.thrift.protocol.TProtocolUtil.skip(iproto, field.type)" << '\n'; + indent(out) << "null" << '\n'; scope_down(out); scope_down(out); indent_down(); } void t_kotlin_generator::generate_union_standard_scheme_write(std::ostream& out, t_struct* tunion) { - indent(out) << "@Suppress(\"UNCHECKED_CAST\")" << endl; + indent(out) << "@Suppress(\"UNCHECKED_CAST\")" << '\n'; indent(out) << "override fun standardSchemeWriteValue(oproto: org.apache.thrift.protocol.TProtocol) {" - << endl; + << '\n'; indent_up(); - indent(out) << "when (setField_) {" << endl; + indent(out) << "when (setField_) {" << '\n'; indent_up(); for (auto& member : tunion->get_members()) { - indent(out) << "_Fields." << constant_name(member->get_name()) << " -> {" << endl; + indent(out) << "_Fields." << constant_name(member->get_name()) << " -> {" << '\n'; indent_up(); { - indent(out) << "val it = value_ as " << type_name(member->get_type()) << endl; - indent(out) << "oproto.apply {" << endl; + indent(out) << "val it = value_ as " << type_name(member->get_type()) << '\n'; + indent(out) << "oproto.apply {" << '\n'; indent_up(); { indent(out); generate_serialize_value(out, member->get_type()); - out << endl; + out << '\n'; } scope_down(out); } @@ -1032,7 +1030,7 @@ void t_kotlin_generator::generate_union_standard_scheme_write(std::ostream& out, } indent(out) << "null -> throw kotlin.IllegalStateException(\"Cannot write union with unknown " "field $setField_\")" - << endl; + << '\n'; scope_down(out); scope_down(out); } @@ -1052,25 +1050,25 @@ void t_kotlin_generator::generate_union_methods_definitions(std::ostream& out, t } auto union_class_name = kotlin_safe_name(tunion->get_name()); - { indent(out) << "override fun deepCopy() = " << union_class_name << "(this)" << endl; } - { indent(out) << "override fun enumForId(id: kotlin.Short) = fieldForId(id.toInt())" << endl; } - { indent(out) << "override fun getStructDesc() = STRUCT_DESC" << endl; } + { indent(out) << "override fun deepCopy() = " << union_class_name << "(this)" << '\n'; } + { indent(out) << "override fun enumForId(id: kotlin.Short) = fieldForId(id.toInt())" << '\n'; } + { indent(out) << "override fun getStructDesc() = STRUCT_DESC" << '\n'; } { - indent(out) << "override fun getFieldDesc(setField: _Fields) = when (setField) {" << endl; + indent(out) << "override fun getFieldDesc(setField: _Fields) = when (setField) {" << '\n'; indent_up(); for (auto& member : tunion->get_members()) { indent(out) << "_Fields." << constant_name(member->get_name()) << " -> " - << constant_name(member->get_name()) << "_FIELD_DESC" << endl; + << constant_name(member->get_name()) << "_FIELD_DESC" << '\n'; } scope_down(out); } } void t_kotlin_generator::generate_union_method_check_type(std::ostream& out, t_struct* tunion) { - indent(out) << "@Suppress(\"UNCHECKED_CAST\")" << endl; - indent(out) << "override fun checkType(setField: _Fields, value: kotlin.Any?) {" << endl; + indent(out) << "@Suppress(\"UNCHECKED_CAST\")" << '\n'; + indent(out) << "override fun checkType(setField: _Fields, value: kotlin.Any?) {" << '\n'; indent_up(); - indent(out) << "when (setField) {" << endl; + indent(out) << "when (setField) {" << '\n'; indent_up(); for (auto& member : tunion->get_members()) { auto expect_type = type_name(member->get_type()); @@ -1078,7 +1076,7 @@ void t_kotlin_generator::generate_union_method_check_type(std::ostream& out, t_s << expect_type << " ?: throw kotlin.ClassCastException(\"Was expecting value of type `" << expect_type << "' for field `" << member->get_name() - << "', but got ${value?.javaClass}\")" << endl; + << "', but got ${value?.javaClass}\")" << '\n'; } scope_down(out); scope_down(out); @@ -1089,12 +1087,12 @@ void t_kotlin_generator::generate_union_definition(std::ostream& out, string /*additional interface*/) { auto union_class_name = kotlin_safe_name(tunion->get_name()); indent(out) << "class " << union_class_name << " : org.apache.thrift.TUnion<" << union_class_name - << ", " << union_class_name << "._Fields> {" << endl; + << ", " << union_class_name << "._Fields> {" << '\n'; indent_up(); indent(out) << "constructor(setField: _Fields, value: kotlin.Any) : super(setField, value)" - << endl; - indent(out) << "constructor(other: " << union_class_name << ") : super(other)" << endl; - indent(out) << "constructor() : super()" << endl; + << '\n'; + indent(out) << "constructor(other: " << union_class_name << ") : super(other)" << '\n'; + indent(out) << "constructor() : super()" << '\n'; generate_struct_field_name_constants(out, tunion); generate_struct_companion_object(out, tunion); @@ -1104,7 +1102,7 @@ void t_kotlin_generator::generate_union_definition(std::ostream& out, generate_union_standard_scheme(out, tunion); generate_union_tuple_scheme(out, tunion); indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_kotlin_generator::generate_struct_definition(std::ostream& out, @@ -1123,7 +1121,7 @@ void t_kotlin_generator::generate_struct_definition(std::ostream& out, indent_up(); auto sep = ""; for (auto field : members) { - out << sep << endl; + out << sep << '\n'; sep = ","; generate_kdoc_comment(out, field); auto is_required = field->get_req() == t_field::T_REQUIRED; @@ -1141,7 +1139,7 @@ void t_kotlin_generator::generate_struct_definition(std::ostream& out, out << ": " << type_name(field->get_type()) << "? = null"; } indent_down(); - out << endl; + out << '\n'; indent(out) << ") : "; if (is_exception) { out << "org.apache.thrift.TException(), "; @@ -1150,7 +1148,7 @@ void t_kotlin_generator::generate_struct_definition(std::ostream& out, additional_interface = ", " + additional_interface; } out << "org.apache.thrift.TBase<" << tstruct->get_name() << ", " << tstruct->get_name() - << "._Fields>" << additional_interface << " {" << endl; + << "._Fields>" << additional_interface << " {" << '\n'; indent_up(); @@ -1162,7 +1160,7 @@ void t_kotlin_generator::generate_struct_definition(std::ostream& out, out << "override "; } out << "val " << kotlin_safe_name(field->get_name()) << ": " << type_name(field->get_type()) - << " get() = _" + kotlin_safe_name(field->get_name()) << "!!" << endl; + << " get() = _" + kotlin_safe_name(field->get_name()) << "!!" << '\n'; } } @@ -1181,7 +1179,7 @@ void t_kotlin_generator::generate_struct_definition(std::ostream& out, generate_struct_method_write(out, tstruct); indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } string t_kotlin_generator::base_type_write_expression(t_base_type* tbase, string it) { @@ -1286,7 +1284,7 @@ void t_kotlin_generator::generate_serialize_field(ostream& out, t_field* tfield) } indent(out); generate_serialize_value(out, type, kotlin_safe_name(tfield->get_name())); - out << endl; + out << '\n'; } /** @@ -1305,7 +1303,7 @@ void t_kotlin_generator::generate_deserialize_field(ostream& out, t_field* tfiel = prefix + (is_required ? "_" + tfield->get_name() : kotlin_safe_name(tfield->get_name())); indent(out) << name << " = "; generate_deserialize_value(out, type); - out << endl; + out << '\n'; } /** @@ -1315,33 +1313,33 @@ void t_kotlin_generator::generate_serialize_container(ostream& out, t_type* ttyp if (ttype->is_map()) { out << "writeMap(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << it << ") { (key, value) ->" - << endl; + << '\n'; indent_up(); { generate_serialize_value(indent(out), ((t_map*)ttype)->get_key_type(), "key"); - out << endl; + out << '\n'; generate_serialize_value(indent(out), ((t_map*)ttype)->get_val_type(), "value"); - out << endl; + out << '\n'; indent_down(); } indent(out) << "}"; } else if (ttype->is_set()) { out << "writeSet(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " << it << ") {" - << endl; + << '\n'; indent_up(); { generate_serialize_value(indent(out), ((t_set*)ttype)->get_elem_type()); - out << endl; + out << '\n'; indent_down(); } indent(out) << "}"; } else if (ttype->is_list()) { out << "writeList(" << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << it << ") {" - << endl; + << '\n'; { indent_up(); generate_serialize_value(indent(out), ((t_list*)ttype)->get_elem_type()); - out << endl; + out << '\n'; indent_down(); } indent(out) << "}"; @@ -1355,41 +1353,41 @@ void t_kotlin_generator::generate_serialize_container(ostream& out, t_type* ttyp */ void t_kotlin_generator::generate_deserialize_container(ostream& out, t_type* ttype) { if (ttype->is_map()) { - out << "readMap { tmap ->" << endl; + out << "readMap { tmap ->" << '\n'; indent_up(); - indent(out) << "kotlin.collections.List(tmap.size) {" << endl; + indent(out) << "kotlin.collections.List(tmap.size) {" << '\n'; indent_up(); indent(out); generate_deserialize_value(out, ((t_map*)ttype)->get_key_type()); out << " to "; generate_deserialize_value(out, ((t_map*)ttype)->get_val_type()); - out << endl; + out << '\n'; indent_down(); - indent(out) << "}.associate { it }" << endl; + indent(out) << "}.associate { it }" << '\n'; indent_down(); indent(out) << "}"; } else if (ttype->is_set()) { - out << "readSet { tset ->" << endl; + out << "readSet { tset ->" << '\n'; indent_up(); - indent(out) << "kotlin.collections.List(tset.size) {" << endl; + indent(out) << "kotlin.collections.List(tset.size) {" << '\n'; indent_up(); indent(out); generate_deserialize_value(out, ((t_set*)ttype)->get_elem_type()); - out << endl; + out << '\n'; indent_down(); - indent(out) << "}.toSet()" << endl; + indent(out) << "}.toSet()" << '\n'; indent_down(); indent(out) << "}"; } else if (ttype->is_list()) { - out << "readList { tlist ->" << endl; + out << "readList { tlist ->" << '\n'; indent_up(); - indent(out) << "kotlin.collections.List(tlist.size) {" << endl; + indent(out) << "kotlin.collections.List(tlist.size) {" << '\n'; indent_up(); indent(out); generate_deserialize_value(out, ((t_list*)ttype)->get_elem_type()); - out << endl; + out << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; indent_down(); indent(out) << "}"; } else { @@ -1419,14 +1417,14 @@ void t_kotlin_generator::generate_service_interface(t_service* tservice) { ofstream_with_content_based_conditional_update out; out.open(f_service_name.c_str()); out << autogen_comment() << kotlin_package(); - out << "interface " << tservice->get_name() << " {" << endl; + out << "interface " << tservice->get_name() << " {" << '\n'; indent_up(); for (auto tfunc : tservice->get_functions()) { generate_kdoc_comment(out, tfunc); - indent(out) << function_signature(tfunc) << endl; + indent(out) << function_signature(tfunc) << '\n'; } scope_down(out); - out << endl << endl; + out << '\n' << '\n'; out.close(); } @@ -1437,22 +1435,22 @@ void t_kotlin_generator::generate_service_client(t_service* tservice) { out << autogen_comment() << warning_surpressions() << kotlin_package(); generate_docstring_comment(out, "/**\n", " * ", "client implementation for [" + tservice->get_name() + "]", " */\n"); - indent(out) << "class " << tservice->get_name() << "Client(" << endl; + indent(out) << "class " << tservice->get_name() << "Client(" << '\n'; indent_up(); - indent(out) << "protocolFactory: org.apache.thrift.protocol.TProtocolFactory," << endl; - indent(out) << "clientManager: org.apache.thrift.async.TAsyncClientManager," << endl; - indent(out) << "transport: org.apache.thrift.transport.TNonblockingTransport" << endl; + indent(out) << "protocolFactory: org.apache.thrift.protocol.TProtocolFactory," << '\n'; + indent(out) << "clientManager: org.apache.thrift.async.TAsyncClientManager," << '\n'; + indent(out) << "transport: org.apache.thrift.transport.TNonblockingTransport" << '\n'; indent_down(); out << "): org.apache.thrift.async.TAsyncClient(protocolFactory, clientManager, transport), " - << tservice->get_name() << " {" << endl - << endl; + << tservice->get_name() << " {" << '\n' + << '\n'; indent_up(); { - indent(out) << "private val seqId = java.util.concurrent.atomic.AtomicInteger()" << endl - << endl; + indent(out) << "private val seqId = java.util.concurrent.atomic.AtomicInteger()" << '\n' + << '\n'; for (auto tfunc : tservice->get_functions()) { - indent(out) << "override " << function_signature(tfunc) << " {" << endl; + indent(out) << "override " << function_signature(tfunc) << " {" << '\n'; indent_up(); { string args_name = tservice->get_name() + "FunctionArgs." + tfunc->get_name() + "_args"; @@ -1465,16 +1463,16 @@ void t_kotlin_generator::generate_service_client(t_service* tservice) { first = false; out << tfield->get_name(); } - out << ")" << endl; - indent(out) << "return transformCallback {" << endl; + out << ")" << '\n'; + indent(out) << "return transformCallback {" << '\n'; indent_up(); { - indent(out) << "checkReady()" << endl; + indent(out) << "checkReady()" << '\n'; indent(out) << "___currentMethod = ProcessCall." << tfunc->get_name() << "Call(args, seqId.getAndIncrement(), this, ___protocolFactory, ___transport, it)" - << endl; - indent(out) << "___manager.call(___currentMethod)" << endl; + << '\n'; + indent(out) << "___manager.call(___currentMethod)" << '\n'; } scope_down(out); } @@ -1484,22 +1482,22 @@ void t_kotlin_generator::generate_service_client(t_service* tservice) { indent(out) << "private suspend fun " "org.apache.thrift.async.TAsyncClient.transformCallback(action: " "(org.apache.thrift.async.AsyncMethodCallback) -> Unit): R {" - << endl; + << '\n'; indent_up(); - indent(out) << "val deferred = kotlinx.coroutines.CompletableDeferred()" << endl; + indent(out) << "val deferred = kotlinx.coroutines.CompletableDeferred()" << '\n'; indent(out) << "val callback = object : org.apache.thrift.async.AsyncMethodCallback {" - << endl; + << '\n'; indent_up(); - indent(out) << "override fun onComplete(response: R) { deferred.complete(response) }" << endl; + indent(out) << "override fun onComplete(response: R) { deferred.complete(response) }" << '\n'; indent(out) << "override fun onError(exception: java.lang.Exception) { " "deferred.completeExceptionally(exception) }" - << endl; + << '\n'; scope_down(out); - indent(out) << "action(callback)" << endl; - indent(out) << "return deferred.await()" << endl; + indent(out) << "action(callback)" << '\n'; + indent(out) << "return deferred.await()" << '\n'; scope_down(out); - indent(out) << "sealed interface ProcessCall {" << endl; + indent(out) << "sealed interface ProcessCall {" << '\n'; indent_up(); for (auto tfunc : tservice->get_functions()) { generate_client_call(out, tservice, tfunc); @@ -1507,7 +1505,7 @@ void t_kotlin_generator::generate_service_client(t_service* tservice) { scope_down(out); } scope_down(out); - out << endl << endl; + out << '\n' << '\n'; out.close(); } @@ -1518,74 +1516,74 @@ void t_kotlin_generator::generate_client_call(std::ostream& out, string funclassname = funname + "Call"; string rtype = type_name(tfunc->get_returntype(), true); - indent(out) << "class " + funclassname + "(" << endl; + indent(out) << "class " + funclassname + "(" << '\n'; indent_up(); string args_name = tservice->get_name() + "FunctionArgs." + tfunc->get_name() + "_args"; - indent(out) << "val args: " << args_name << "," << endl; - indent(out) << "val seqId: kotlin.Int," << endl; - indent(out) << "client: org.apache.thrift.async.TAsyncClient," << endl; - indent(out) << "protocolFactory: org.apache.thrift.protocol.TProtocolFactory," << endl; - indent(out) << "transport: org.apache.thrift.transport.TNonblockingTransport," << endl; + indent(out) << "val args: " << args_name << "," << '\n'; + indent(out) << "val seqId: kotlin.Int," << '\n'; + indent(out) << "client: org.apache.thrift.async.TAsyncClient," << '\n'; + indent(out) << "protocolFactory: org.apache.thrift.protocol.TProtocolFactory," << '\n'; + indent(out) << "transport: org.apache.thrift.transport.TNonblockingTransport," << '\n'; indent(out) << "resultHandler: org.apache.thrift.async.AsyncMethodCallback<" << rtype << ">," - << endl; + << '\n'; indent_down(); indent(out) << ") : org.apache.thrift.async.TAsyncMethodCall<" << rtype << ">(client, protocolFactory, transport, resultHandler, " - << (tfunc->is_oneway() ? "true" : "false") << "), ProcessCall {" << endl; + << (tfunc->is_oneway() ? "true" : "false") << "), ProcessCall {" << '\n'; indent_up(); indent(out) << "override fun write_args(protocol: org.apache.thrift.protocol.TProtocol) {" - << endl; + << '\n'; indent_up(); indent(out) << "val marker = org.apache.thrift.protocol.TMessage(\"" << tfunc->get_name() - << "\", org.apache.thrift.protocol.TMessageType.CALL, seqId)" << endl; - indent(out) << "protocol.writeMessage(marker) { args.write(protocol) }" << endl; + << "\", org.apache.thrift.protocol.TMessageType.CALL, seqId)" << '\n'; + indent(out) << "protocol.writeMessage(marker) { args.write(protocol) }" << '\n'; scope_down(out); - indent(out) << "override fun getResult(): " << rtype << " {" << endl; + indent(out) << "override fun getResult(): " << rtype << " {" << '\n'; indent_up(); indent(out) << "check(state == org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) { " "\"Method call not finished!\" }" - << endl; + << '\n'; indent(out) << "val memoryTransport = " "org.apache.thrift.transport.TMemoryInputTransport(frameBuffer.array())" - << endl; - indent(out) << "val protocol = client.protocolFactory.getProtocol(memoryTransport)" << endl; + << '\n'; + indent(out) << "val protocol = client.protocolFactory.getProtocol(memoryTransport)" << '\n'; if (tfunc->is_oneway()) { - indent(out) << "// one way function, nothing to read" << endl; + indent(out) << "// one way function, nothing to read" << '\n'; } else { - indent(out) << "return protocol.readMessage {" << endl; + indent(out) << "return protocol.readMessage {" << '\n'; indent_up(); { - indent(out) << "if (it.type == org.apache.thrift.protocol.TMessageType.EXCEPTION) {" << endl; + indent(out) << "if (it.type == org.apache.thrift.protocol.TMessageType.EXCEPTION) {" << '\n'; indent_up(); indent(out) << "val ex = org.apache.thrift.TApplicationException().apply { read(protocol) }" - << endl; - indent(out) << "throw ex" << endl; + << '\n'; + indent(out) << "throw ex" << '\n'; scope_down(out); - indent(out) << "if (it.seqid != seqId) {" << endl; + indent(out) << "if (it.seqid != seqId) {" << '\n'; indent_up(); - indent(out) << "throw org.apache.thrift.TApplicationException(" << endl; + indent(out) << "throw org.apache.thrift.TApplicationException(" << '\n'; indent_up(); - indent(out) << "org.apache.thrift.TApplicationException.BAD_SEQUENCE_ID," << endl; + indent(out) << "org.apache.thrift.TApplicationException.BAD_SEQUENCE_ID," << '\n'; indent(out) << "\"" << funname << " failed: out of sequence response: expected $seqId but got ${it.seqid}\"" - << endl; + << '\n'; indent_down(); - indent(out) << ")" << endl; + indent(out) << ")" << '\n'; scope_down(out); string result_name = tservice->get_name() + "FunctionResult." + tfunc->get_name() + "_result"; - indent(out) << "val result = " << result_name << "().apply { read(protocol) }" << endl; + indent(out) << "val result = " << result_name << "().apply { read(protocol) }" << '\n'; for (auto xception : tfunc->get_xceptions()->get_members()) { - indent(out) << "result." << xception->get_name() << "?.let { throw it }" << endl; + indent(out) << "result." << xception->get_name() << "?.let { throw it }" << '\n'; } if (!tfunc->get_returntype()->is_void()) { indent(out) << "result.success ?: throw " "org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException." "MISSING_RESULT, \"returnString failed: unknown result\")" - << endl; + << '\n'; } } scope_down(out); @@ -1601,43 +1599,43 @@ void t_kotlin_generator::generate_service_processor(t_service* tservice) { out << autogen_comment() << warning_surpressions() << kotlin_package(); auto service_imports = {"import kotlinx.coroutines.future.future"}; for (auto service_import : service_imports) { - out << service_import << endl; + out << service_import << '\n'; } - out << endl; + out << '\n'; generate_docstring_comment(out, "/**\n", " * ", "server implementation for [" + tservice->get_name() + "]", " */\n"); - indent(out) << "class " << tservice->get_name() << "Processor(" << endl; + indent(out) << "class " << tservice->get_name() << "Processor(" << '\n'; indent_up(); - indent(out) << "handler: " << tservice->get_name() << "," << endl; - indent(out) << "private val scope: kotlinx.coroutines.CoroutineScope," << endl; + indent(out) << "handler: " << tservice->get_name() << "," << '\n'; + indent(out) << "private val scope: kotlinx.coroutines.CoroutineScope," << '\n'; indent(out) << "private val processMap: kotlin.collections.Mapget_name() << ", out org.apache.thrift.TBase<*, " "*>, out kotlin.Any, out org.apache.thrift.TBase<*, *>>> = mapOf(" - << endl; + << '\n'; indent_up(); { for (auto tfunc : tservice->get_functions()) { indent(out) << '"' << tfunc->get_name() << '"' << " to ProcessFunction." << tfunc->get_name() - << "(scope)," << endl; + << "(scope)," << '\n'; } } indent_down(); - indent(out) << ")" << endl; + indent(out) << ")" << '\n'; indent_down(); out << "): org.apache.thrift.TBaseAsyncProcessor<" << tservice->get_name() - << ">(handler, processMap) {" << endl; + << ">(handler, processMap) {" << '\n'; indent_up(); - indent(out) << "companion object {" << endl; + indent(out) << "companion object {" << '\n'; indent_up(); indent(out) << "internal val logger: org.slf4j.Logger = " "org.slf4j.LoggerFactory.getLogger(" - << tservice->get_name() << "Processor::class.java)" << endl; + << tservice->get_name() << "Processor::class.java)" << '\n'; scope_down(out); - indent(out) << "sealed interface ProcessFunction {" << endl; + indent(out) << "sealed interface ProcessFunction {" << '\n'; indent_up(); { @@ -1647,7 +1645,7 @@ void t_kotlin_generator::generate_service_processor(t_service* tservice) { } scope_down(out); scope_down(out); - out << endl << endl; + out << '\n' << '\n'; out.close(); } @@ -1663,25 +1661,25 @@ void t_kotlin_generator::generate_service_process_function(ostream& out, "org.apache.thrift.AsyncProcessFunctionis_oneway() ? "org.apache.thrift.TBase<*, *>" : resultname) - << ">(\"" << tfunc->get_name() << "\"), ProcessFunction {" - << endl; + << ">(\"" << tfunc->get_name() << "\"), ProcessFunction {" + << '\n'; indent_up(); { - indent(out) << "override fun isOneway() = " << (tfunc->is_oneway() ? "true" : "false") << endl; - indent(out) << "override fun getEmptyArgsInstance() = " << args_name << "()" << endl; + indent(out) << "override fun isOneway() = " << (tfunc->is_oneway() ? "true" : "false") << '\n'; + indent(out) << "override fun getEmptyArgsInstance() = " << args_name << "()" << '\n'; indent(out) << "override fun getEmptyResultInstance() = "; if (tfunc->is_oneway()) { - out << "null" << endl; + out << "null" << '\n'; } else { - out << resultname << "()" << endl; + out << resultname << "()" << '\n'; } - indent(out) << endl; + indent(out) << '\n'; indent(out) << "override fun start(iface: I, args: " << args_name << ", resultHandler: org.apache.thrift.async.AsyncMethodCallback<" << rtype - << ">) {" << endl; + << ">) {" << '\n'; indent_up(); - indent(out) << "scope.future {" << endl; + indent(out) << "scope.future {" << '\n'; indent_up(); indent(out) << "iface." << tfunc->get_name() << "("; { @@ -1696,18 +1694,18 @@ void t_kotlin_generator::generate_service_process_function(ostream& out, out << "args." << tfield->get_name() << "!!"; } } - out << ")" << endl; + out << ")" << '\n'; indent_down(); - indent(out) << "}.whenComplete { r, t ->" << endl; + indent(out) << "}.whenComplete { r, t ->" << '\n'; { indent_up(); - indent(out) << "if (t != null) {" << endl; + indent(out) << "if (t != null) {" << '\n'; indent_up(); - indent(out) << "resultHandler.onError(t as java.lang.Exception)" << endl; + indent(out) << "resultHandler.onError(t as java.lang.Exception)" << '\n'; indent_down(); - indent(out) << "} else {" << endl; + indent(out) << "} else {" << '\n'; indent_up(); - indent(out) << "resultHandler.onComplete(r)" << endl; + indent(out) << "resultHandler.onComplete(r)" << '\n'; } scope_down(out); scope_down(out); @@ -1716,106 +1714,106 @@ void t_kotlin_generator::generate_service_process_function(ostream& out, indent(out) << "override fun getResultHandler(fb: " "org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer, seqid: " "Int) =" - << endl; + << '\n'; indent_up(); { indent(out) << "object : org.apache.thrift.async.AsyncMethodCallback<" << rtype << ">{" - << endl; + << '\n'; indent_up(); { - indent(out) << "override fun onComplete(response: " << rtype << ") {" << endl; + indent(out) << "override fun onComplete(response: " << rtype << ") {" << '\n'; indent_up(); if (tfunc->is_oneway()) { - indent(out) << "// one way function, no result handling" << endl; + indent(out) << "// one way function, no result handling" << '\n'; } else { string result_name = tservice->get_name() + "FunctionResult." + tfunc->get_name() + "_result"; - indent(out) << "val result = " << result_name << "()" << endl; + indent(out) << "val result = " << result_name << "()" << '\n'; if (!tfunc->get_returntype()->is_void()) { - indent(out) << "result.success = response" << endl; + indent(out) << "result.success = response" << '\n'; } - indent(out) << "try {" << endl; + indent(out) << "try {" << '\n'; indent_up(); indent(out) << "sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY, seqid)" - << endl; + << '\n'; indent_down(); - indent(out) << "} catch (e: org.apache.thrift.transport.TTransportException) {" << endl; + indent(out) << "} catch (e: org.apache.thrift.transport.TTransportException) {" << '\n'; indent_up(); indent(out) << "logger.error(\"TTransportException writing to internal frame buffer\", e)" - << endl; - indent(out) << "fb.close()" << endl; + << '\n'; + indent(out) << "fb.close()" << '\n'; indent_down(); - indent(out) << "} catch (e: Exception) {" << endl; + indent(out) << "} catch (e: Exception) {" << '\n'; indent_up(); - indent(out) << "logger.error(\"Exception writing to internal frame buffer\", e)" << endl; - indent(out) << "onError(e)" << endl; + indent(out) << "logger.error(\"Exception writing to internal frame buffer\", e)" << '\n'; + indent(out) << "onError(e)" << '\n'; scope_down(out); } scope_down(out); } { - indent(out) << "override fun onError(exception: kotlin.Exception) {" << endl; + indent(out) << "override fun onError(exception: kotlin.Exception) {" << '\n'; indent_up(); if (tfunc->is_oneway()) { indent(out) << "if (exception is org.apache.thrift.transport.TTransportException) {" - << endl; + << '\n'; indent_up(); - indent(out) << "logger.error(\"TTransportException inside handler\", exception)" << endl; - indent(out) << "fb.close()" << endl; + indent(out) << "logger.error(\"TTransportException inside handler\", exception)" << '\n'; + indent(out) << "fb.close()" << '\n'; indent_down(); - indent(out) << "} else {" << endl; + indent(out) << "} else {" << '\n'; indent_up(); - indent(out) << "logger.error(\"Exception inside oneway handler\", exception)" << endl; + indent(out) << "logger.error(\"Exception inside oneway handler\", exception)" << '\n'; scope_down(out); } else { - indent(out) << "val (msgType, msg) = when (exception) {" << endl; + indent(out) << "val (msgType, msg) = when (exception) {" << '\n'; indent_up(); auto xceptions = tfunc->get_xceptions()->get_members(); for (auto xception : xceptions) { - indent(out) << "is " << type_name(xception->get_type()) << " -> {" << endl; + indent(out) << "is " << type_name(xception->get_type()) << " -> {" << '\n'; indent_up(); string result_name = tservice->get_name() + "FunctionResult." + tfunc->get_name() + "_result"; - indent(out) << "val result = " << result_name << "()" << endl; - indent(out) << "result." << xception->get_name() << " = exception" << endl; - indent(out) << "org.apache.thrift.protocol.TMessageType.REPLY to result" << endl; + indent(out) << "val result = " << result_name << "()" << '\n'; + indent(out) << "result." << xception->get_name() << " = exception" << '\n'; + indent(out) << "org.apache.thrift.protocol.TMessageType.REPLY to result" << '\n'; scope_down(out); } - indent(out) << "is org.apache.thrift.transport.TTransportException -> {" << endl; + indent(out) << "is org.apache.thrift.transport.TTransportException -> {" << '\n'; indent_up(); - indent(out) << "logger.error(\"TTransportException inside handler\", exception)" << endl; - indent(out) << "fb.close()" << endl; - indent(out) << "return" << endl; + indent(out) << "logger.error(\"TTransportException inside handler\", exception)" << '\n'; + indent(out) << "fb.close()" << '\n'; + indent(out) << "return" << '\n'; scope_down(out); - indent(out) << "is org.apache.thrift.TApplicationException -> {" << endl; + indent(out) << "is org.apache.thrift.TApplicationException -> {" << '\n'; indent_up(); indent(out) << "logger.error(\"TApplicationException inside handler\", exception)" - << endl; - indent(out) << "org.apache.thrift.protocol.TMessageType.EXCEPTION to exception" << endl; + << '\n'; + indent(out) << "org.apache.thrift.protocol.TMessageType.EXCEPTION to exception" << '\n'; scope_down(out); - indent(out) << "else -> {" << endl; + indent(out) << "else -> {" << '\n'; indent_up(); - indent(out) << "logger.error(\"Exception inside handler\", exception)" << endl; + indent(out) << "logger.error(\"Exception inside handler\", exception)" << '\n'; indent(out) << "org.apache.thrift.protocol.TMessageType.EXCEPTION to " "org.apache.thrift.TApplicationException(org.apache.thrift." "TApplicationException.INTERNAL_ERROR, exception.message)" - << endl; + << '\n'; scope_down(out); scope_down(out); - indent(out) << "try {" << endl; + indent(out) << "try {" << '\n'; indent_up(); - indent(out) << "sendResponse(fb, msg, msgType, seqid)" << endl; + indent(out) << "sendResponse(fb, msg, msgType, seqid)" << '\n'; indent_down(); - indent(out) << "} catch (ex: java.lang.Exception) {" << endl; + indent(out) << "} catch (ex: java.lang.Exception) {" << '\n'; indent_up(); - indent(out) << "logger.error(\"Exception writing to internal frame buffer\", ex)" << endl; - indent(out) << "fb.close()" << endl; + indent(out) << "logger.error(\"Exception writing to internal frame buffer\", ex)" << '\n'; + indent(out) << "fb.close()" << '\n'; scope_down(out); } @@ -1836,7 +1834,7 @@ void t_kotlin_generator::generate_service_result_helpers(t_service* tservice) { generate_docstring_comment(out, "/**\n", " * ", "function result for [" + tservice->get_name() + "]", " */\n"); - indent(out) << "sealed interface " << tservice->get_name() << "FunctionResult {" << endl; + indent(out) << "sealed interface " << tservice->get_name() << "FunctionResult {" << '\n'; indent_up(); for (auto func : tservice->get_functions()) { if (func->is_oneway()) { @@ -1863,12 +1861,12 @@ void t_kotlin_generator::generate_service_args_helpers(t_service* tservice) { out << autogen_comment() << warning_surpressions() << kotlin_package(); generate_docstring_comment(out, "/**\n", " * ", "function arguments for [" + tservice->get_name() + "]", " */\n"); - indent(out) << "sealed interface " << tservice->get_name() << "FunctionArgs {" << endl; + indent(out) << "sealed interface " << tservice->get_name() << "FunctionArgs {" << '\n'; indent_up(); for (auto func : tservice->get_functions()) { t_struct* ts = func->get_arglist(); generate_struct_definition(out, ts, false, tservice->get_name() + "FunctionArgs"); - out << endl; + out << '\n'; } scope_down(out); out.close(); @@ -1972,7 +1970,7 @@ bool t_kotlin_generator::is_enum_map(t_type* ttype) { */ string t_kotlin_generator::kotlin_package() { if (!package_name_.empty()) { - return string("package ") + package_name_ + endl + endl; + return string("package ") + package_name_ + "\n" + "\n"; } return ""; } @@ -1980,8 +1978,7 @@ string t_kotlin_generator::kotlin_package() { string t_kotlin_generator::warning_surpressions() { return "@file:Suppress(\"ClassName\", \"PropertyName\", \"RedundantUnitReturnType\", " "\"NestedLambdaShadowedImplicitParameter\", " - "\"RemoveRedundantQualifierName\")" - + endl; + "\"RemoveRedundantQualifierName\")\n"; } string t_kotlin_generator::constant_name(string name) { diff --git a/compiler/cpp/src/thrift/generate/t_lua_generator.cc b/compiler/cpp/src/thrift/generate/t_lua_generator.cc index 0dc7743f479..642dd9c3c68 100644 --- a/compiler/cpp/src/thrift/generate/t_lua_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_lua_generator.cc @@ -26,8 +26,6 @@ using std::string; using std::vector; using std::map; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /** * LUA code generator. * @@ -190,7 +188,7 @@ void t_lua_generator::init_generator() { f_consts_ << autogen_comment() << lua_includes(); f_types_ << autogen_comment() << lua_includes(); if (gen_requires_) { - f_types_ << endl << "require '" << cur_namespace << "constants'"; + f_types_ << '\n' << "require '" << cur_namespace << "constants'"; } } @@ -207,7 +205,7 @@ void t_lua_generator::generate_typedef(t_typedef* ttypedef) { if (ttypedef->get_type()->get_name().empty()) { return; } - f_types_ << endl << endl << indent() << ttypedef->get_symbolic() << " = " + f_types_ << '\n' << '\n' << indent() << ttypedef->get_symbolic() << " = " << ttypedef->get_type()->get_name(); } @@ -215,7 +213,7 @@ void t_lua_generator::generate_typedef(t_typedef* ttypedef) { * Generates code for an enumerated type (table) */ void t_lua_generator::generate_enum(t_enum* tenum) { - f_types_ << endl << endl << tenum->get_name() << " = {" << endl; + f_types_ << '\n' << '\n' << tenum->get_name() << " = {" << '\n'; vector constants = tenum->get_constants(); vector::iterator c_iter; @@ -227,7 +225,7 @@ void t_lua_generator::generate_enum(t_enum* tenum) { if (c_iter != constants.end()) { f_types_ << ","; } - f_types_ << endl; + f_types_ << '\n'; } f_types_ << "}"; } @@ -240,7 +238,7 @@ void t_lua_generator::generate_const(t_const* tconst) { string name = tconst->get_name(); t_const_value* value = tconst->get_value(); - f_consts_ << endl << endl << name << " = "; + f_consts_ << '\n' << '\n' << name << " = "; f_consts_ << render_const_value(type, value); } @@ -281,7 +279,7 @@ string t_lua_generator::render_const_value(t_type* type, t_const_value* value) { } else if (type->is_enum()) { out << value->get_integer(); } else if (type->is_struct() || type->is_xception()) { - out << type->get_name() << " = {" << endl; + out << type->get_name() << " = {" << '\n'; indent_up(); const vector& fields = ((t_struct*)type)->get_members(); @@ -312,7 +310,7 @@ string t_lua_generator::render_const_value(t_type* type, t_const_value* value) { out << "}"; indent_down(); } else if (type->is_map()) { - out << type->get_name() << "{" << endl; + out << type->get_name() << "{" << '\n'; indent_up(); t_type* ktype = ((t_map*)type)->get_key_type(); @@ -327,7 +325,7 @@ string t_lua_generator::render_const_value(t_type* type, t_const_value* value) { if (v_iter != val.end()) { out << ","; } - out << endl; + out << '\n'; } indent_down(); indent(out) << "}"; @@ -338,7 +336,7 @@ string t_lua_generator::render_const_value(t_type* type, t_const_value* value) { } else { etype = ((t_set*)type)->get_elem_type(); } - out << type->get_name() << " = {" << endl; + out << type->get_name() << " = {" << '\n'; const vector& val = value->get_list(); vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end();) { @@ -351,7 +349,7 @@ string t_lua_generator::render_const_value(t_type* type, t_const_value* value) { } ++v_iter; if (v_iter != val.end()) { - out << "," << endl; + out << "," << '\n'; } } out << "}"; @@ -382,15 +380,15 @@ void t_lua_generator::generate_lua_struct_definition(ostream& out, vector::const_iterator m_iter; const vector& members = tstruct->get_members(); - indent(out) << endl << endl << tstruct->get_name(); + indent(out) << '\n' << '\n' << tstruct->get_name(); if (is_exception) { - out << " = TException:new{" << endl << indent() << " __type = '" << tstruct->get_name() << "'"; + out << " = TException:new{" << '\n' << indent() << " __type = '" << tstruct->get_name() << "'"; if (members.size() > 0) { out << ","; } - out << endl; + out << '\n'; } else { - out << " = __TObject:new{" << endl; + out << " = __TObject:new{" << '\n'; } indent_up(); for (m_iter = members.begin(); m_iter != members.end();) { @@ -398,12 +396,12 @@ void t_lua_generator::generate_lua_struct_definition(ostream& out, out << (*m_iter)->get_name(); ++m_iter; if (m_iter != members.end()) { - out << "," << endl; + out << "," << '\n'; } } indent_down(); indent(out); - out << endl << "}"; + out << '\n' << "}"; generate_lua_struct_reader(out, tstruct); generate_lua_struct_writer(out, tstruct); @@ -417,48 +415,48 @@ void t_lua_generator::generate_lua_struct_reader(ostream& out, t_struct* tstruct vector::const_iterator f_iter; // function - indent(out) << endl << endl << "function " << tstruct->get_name() << ":read(iprot)" << endl; + indent(out) << '\n' << '\n' << "function " << tstruct->get_name() << ":read(iprot)" << '\n'; indent_up(); - indent(out) << "iprot:readStructBegin()" << endl; + indent(out) << "iprot:readStructBegin()" << '\n'; // while: Read in fields - indent(out) << "while true do" << endl; + indent(out) << "while true do" << '\n'; indent_up(); // if: Check what to read - indent(out) << "local fname, ftype, fid = iprot:readFieldBegin()" << endl; - indent(out) << "if ftype == TType.STOP then" << endl; + indent(out) << "local fname, ftype, fid = iprot:readFieldBegin()" << '\n'; + indent(out) << "if ftype == TType.STOP then" << '\n'; indent_up(); - indent(out) << "break" << endl; + indent(out) << "break" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { indent_down(); - indent(out) << "elseif fid == " << (*f_iter)->get_key() << " then" << endl; + indent(out) << "elseif fid == " << (*f_iter)->get_key() << " then" << '\n'; indent_up(); - indent(out) << "if ftype == " << type_to_enum((*f_iter)->get_type()) << " then" << endl; + indent(out) << "if ftype == " << type_to_enum((*f_iter)->get_type()) << " then" << '\n'; indent_up(); // Read field contents generate_deserialize_field(out, *f_iter, false, "self."); indent_down(); - indent(out) << "else" << endl; - indent(out) << " iprot:skip(ftype)" << endl; - indent(out) << "end" << endl; + indent(out) << "else" << '\n'; + indent(out) << " iprot:skip(ftype)" << '\n'; + indent(out) << "end" << '\n'; } // end if indent_down(); - indent(out) << "else" << endl; - indent(out) << " iprot:skip(ftype)" << endl; - indent(out) << "end" << endl; - indent(out) << "iprot:readFieldEnd()" << endl; + indent(out) << "else" << '\n'; + indent(out) << " iprot:skip(ftype)" << '\n'; + indent(out) << "end" << '\n'; + indent(out) << "iprot:readFieldEnd()" << '\n'; // end while indent_down(); - indent(out) << "end" << endl; - indent(out) << "iprot:readStructEnd()" << endl; + indent(out) << "end" << '\n'; + indent(out) << "iprot:readStructEnd()" << '\n'; // end function indent_down(); @@ -474,28 +472,28 @@ void t_lua_generator::generate_lua_struct_writer(ostream& out, t_struct* tstruct vector::const_iterator f_iter; // function - indent(out) << endl << endl << "function " << tstruct->get_name() << ":write(oprot)" << endl; + indent(out) << '\n' << '\n' << "function " << tstruct->get_name() << ":write(oprot)" << '\n'; indent_up(); - indent(out) << "oprot:writeStructBegin('" << tstruct->get_name() << "')" << endl; + indent(out) << "oprot:writeStructBegin('" << tstruct->get_name() << "')" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { // To check element of self whether nil or not. // avoid the value(false) of BOOL is lost. - indent(out) << "if self." << (*f_iter)->get_name() << " ~= nil then" << endl; + indent(out) << "if self." << (*f_iter)->get_name() << " ~= nil then" << '\n'; indent_up(); indent(out) << "oprot:writeFieldBegin('" << (*f_iter)->get_name() << "', " << type_to_enum((*f_iter)->get_type()) << ", " << (*f_iter)->get_key() << ")" - << endl; + << '\n'; // Write field contents generate_serialize_field(out, *f_iter, "self."); - indent(out) << "oprot:writeFieldEnd()" << endl; + indent(out) << "oprot:writeFieldEnd()" << '\n'; indent_down(); - indent(out) << "end" << endl; + indent(out) << "end" << '\n'; } - indent(out) << "oprot:writeFieldStop()" << endl; - indent(out) << "oprot:writeStructEnd()" << endl; + indent(out) << "oprot:writeFieldStop()" << '\n'; + indent(out) << "oprot:writeStructEnd()" << '\n'; // end function indent_down(); @@ -518,15 +516,15 @@ void t_lua_generator::generate_service(t_service* tservice) { // Headers f_service_ << autogen_comment() << lua_includes(); if (gen_requires_) { - f_service_ << endl << "require '" << cur_ns << "ttypes'" << endl; + f_service_ << '\n' << "require '" << cur_ns << "ttypes'" << '\n'; if (tservice->get_extends() != nullptr) { f_service_ << "require '" << get_namespace(tservice->get_extends()->get_program()) - << tservice->get_extends()->get_name() << "'" << endl; + << tservice->get_extends()->get_name() << "'" << '\n'; } } - f_service_ << endl; + f_service_ << '\n'; generate_service_client(f_service_, tservice); generate_service_interface(f_service_, tservice); @@ -544,11 +542,11 @@ void t_lua_generator::generate_service_interface(ostream& out, t_service* tservi // Interface object definition out << classname << " = "; if (extends_s) { - out << extends_s->get_name() << "Iface:new{" << endl; + out << extends_s->get_name() << "Iface:new{" << '\n'; } else { - out << "__TObject:new{" << endl; + out << "__TObject:new{" << '\n'; } - out << " __type = '" << classname << "'" << endl << "}" << endl << endl; + out << " __type = '" << classname << "'" << '\n' << "}" << '\n' << '\n'; } void t_lua_generator::generate_service_client(ostream& out, t_service* tservice) { @@ -562,7 +560,7 @@ void t_lua_generator::generate_service_client(ostream& out, t_service* tservice) } else { out << "__TClient"; } - out << ", {" << endl << " __type = '" << classname << "'" << endl << "})" << endl; + out << ", {" << '\n' << " __type = '" << classname << "'" << '\n' << "})" << '\n'; // Send/Recv functions vector functions = tservice->get_functions(); @@ -572,28 +570,28 @@ void t_lua_generator::generate_service_client(ostream& out, t_service* tservice) string funcname = (*f_iter)->get_name(); // Wrapper function - indent(out) << endl << "function " << classname << ":" << sig << endl; + indent(out) << '\n' << "function " << classname << ":" << sig << '\n'; indent_up(); - indent(out) << "self:send_" << sig << endl << indent(); + indent(out) << "self:send_" << sig << '\n' << indent(); if (!(*f_iter)->is_oneway()) { if (!(*f_iter)->get_returntype()->is_void()) { out << "return "; } - out << "self:recv_" << sig << endl; + out << "self:recv_" << sig << '\n'; } indent_down(); - indent(out) << "end" << endl; + indent(out) << "end" << '\n'; // Send function - indent(out) << endl << "function " << classname << ":send_" << sig << endl; + indent(out) << '\n' << "function " << classname << ":send_" << sig << '\n'; indent_up(); indent(out) << "self.oprot:writeMessageBegin('" << funcname << "', " << ((*f_iter)->is_oneway() ? "TMessageType.ONEWAY" : "TMessageType.CALL") - << ", self._seqid)" << endl; - indent(out) << "local args = " << funcname << "_args:new{}" << endl; + << ", self._seqid)" << '\n'; + indent(out) << "local args = " << funcname << "_args:new{}" << '\n'; // Set the args const vector& args = (*f_iter)->get_arglist()->get_members(); @@ -603,60 +601,60 @@ void t_lua_generator::generate_service_client(ostream& out, t_service* tservice) if ((*fld_iter)->get_value() != nullptr) { // Insert default value for nil arguments t_type* type = get_true_type((*fld_iter)->get_type()); - indent(out) << "if " << argname << " ~= nil then" << endl; + indent(out) << "if " << argname << " ~= nil then" << '\n'; indent_up(); - indent(out) << "args." << argname << " = " << argname << endl; + indent(out) << "args." << argname << " = " << argname << '\n'; indent_down(); - indent(out) << "else" << endl; + indent(out) << "else" << '\n'; indent_up(); - indent(out) << "args." << argname << " = " << render_const_value(type, (*fld_iter)->get_value()) << endl; + indent(out) << "args." << argname << " = " << render_const_value(type, (*fld_iter)->get_value()) << '\n'; indent_down(); - indent(out) << "end" << endl; + indent(out) << "end" << '\n'; } else { - indent(out) << "args." << argname << " = " << argname << endl; + indent(out) << "args." << argname << " = " << argname << '\n'; } } - indent(out) << "args:write(self.oprot)" << endl; - indent(out) << "self.oprot:writeMessageEnd()" << endl; - indent(out) << "self.oprot.trans:flush()" << endl; + indent(out) << "args:write(self.oprot)" << '\n'; + indent(out) << "self.oprot:writeMessageEnd()" << '\n'; + indent(out) << "self.oprot.trans:flush()" << '\n'; indent_down(); - indent(out) << "end" << endl; + indent(out) << "end" << '\n'; // Recv function if (!(*f_iter)->is_oneway()) { - indent(out) << endl << "function " << classname << ":recv_" << sig << endl; + indent(out) << '\n' << "function " << classname << ":recv_" << sig << '\n'; indent_up(); out << indent() << "local fname, mtype, rseqid = self.iprot:" - << "readMessageBegin()" << endl << indent() << "if mtype == TMessageType.EXCEPTION then" - << endl << indent() << " local x = TApplicationException:new{}" << endl << indent() - << " x:read(self.iprot)" << endl << indent() << " self.iprot:readMessageEnd()" << endl - << indent() << " error(x)" << endl << indent() << "end" << endl << indent() - << "local result = " << funcname << "_result:new{}" << endl << indent() - << "result:read(self.iprot)" << endl << indent() << "self.iprot:readMessageEnd()" << endl; + << "readMessageBegin()" << '\n' << indent() << "if mtype == TMessageType.EXCEPTION then" + << '\n' << indent() << " local x = TApplicationException:new{}" << '\n' << indent() + << " x:read(self.iprot)" << '\n' << indent() << " self.iprot:readMessageEnd()" << '\n' + << indent() << " error(x)" << '\n' << indent() << "end" << '\n' << indent() + << "local result = " << funcname << "_result:new{}" << '\n' << indent() + << "result:read(self.iprot)" << '\n' << indent() << "self.iprot:readMessageEnd()" << '\n'; // Return the result if it's not a void function if (!(*f_iter)->get_returntype()->is_void()) { - out << indent() << "if result.success ~= nil then" << endl << indent() << " return result.success" - << endl; + out << indent() << "if result.success ~= nil then" << '\n' << indent() << " return result.success" + << '\n'; // Throw custom exceptions const std::vector& xf = (*f_iter)->get_xceptions()->get_members(); vector::const_iterator x_iter; for (x_iter = xf.begin(); x_iter != xf.end(); ++x_iter) { - out << indent() << "elseif result." << (*x_iter)->get_name() << " then" << endl - << indent() << " error(result." << (*x_iter)->get_name() << ")" << endl; + out << indent() << "elseif result." << (*x_iter)->get_name() << " then" << '\n' + << indent() << " error(result." << (*x_iter)->get_name() << ")" << '\n'; } - out << indent() << "end" << endl << indent() + out << indent() << "end" << '\n' << indent() << "error(TApplicationException:new{errorCode = " - << "TApplicationException.MISSING_RESULT})" << endl; + << "TApplicationException.MISSING_RESULT})" << '\n'; } indent_down(); - indent(out) << "end" << endl; + indent(out) << "end" << '\n'; } } } @@ -666,40 +664,40 @@ void t_lua_generator::generate_service_processor(ostream& out, t_service* tservi t_service* extends_s = tservice->get_extends(); // Define processor table - out << endl << classname << " = __TObject.new("; + out << '\n' << classname << " = __TObject.new("; if (extends_s != nullptr) { - out << extends_s->get_name() << "Processor" << endl; + out << extends_s->get_name() << "Processor" << '\n'; } else { - out << "__TProcessor" << endl; + out << "__TProcessor" << '\n'; } - out << ", {" << endl << " __type = '" << classname << "'" << endl << "})" << endl; + out << ", {" << '\n' << " __type = '" << classname << "'" << '\n' << "})" << '\n'; // Process function - indent(out) << endl << "function " << classname << ":process(iprot, oprot, server_ctx)" << endl; + indent(out) << '\n' << "function " << classname << ":process(iprot, oprot, server_ctx)" << '\n'; indent_up(); - indent(out) << "local name, mtype, seqid = iprot:readMessageBegin()" << endl; - indent(out) << "local func_name = 'process_' .. name" << endl; - indent(out) << "if not self[func_name] or ttype(self[func_name]) ~= 'function' then" << endl; + indent(out) << "local name, mtype, seqid = iprot:readMessageBegin()" << '\n'; + indent(out) << "local func_name = 'process_' .. name" << '\n'; + indent(out) << "if not self[func_name] or ttype(self[func_name]) ~= 'function' then" << '\n'; indent_up(); indent(out) << "if oprot ~= nil then"; indent_up(); - out << endl << indent() << "iprot:skip(TType.STRUCT)" << endl << indent() - << "iprot:readMessageEnd()" << endl << indent() << "x = TApplicationException:new{" << endl - << indent() << " errorCode = TApplicationException.UNKNOWN_METHOD" << endl << indent() << "}" - << endl << indent() << "oprot:writeMessageBegin(name, TMessageType.EXCEPTION, " - << "seqid)" << endl << indent() << "x:write(oprot)" << endl << indent() - << "oprot:writeMessageEnd()" << endl << indent() << "oprot.trans:flush()" << endl; + out << '\n' << indent() << "iprot:skip(TType.STRUCT)" << '\n' << indent() + << "iprot:readMessageEnd()" << '\n' << indent() << "x = TApplicationException:new{" << '\n' + << indent() << " errorCode = TApplicationException.UNKNOWN_METHOD" << '\n' << indent() << "}" + << '\n' << indent() << "oprot:writeMessageBegin(name, TMessageType.EXCEPTION, " + << "seqid)" << '\n' << indent() << "x:write(oprot)" << '\n' << indent() + << "oprot:writeMessageEnd()" << '\n' << indent() << "oprot.trans:flush()" << '\n'; indent_down(); - out << indent() << "end" << endl << indent() - << "return false, 'Unknown function '..name" << endl; + out << indent() << "end" << '\n' << indent() + << "return false, 'Unknown function '..name" << '\n'; indent_down(); - indent(out) << "else" << endl << indent() - << " return self[func_name](self, seqid, iprot, oprot, server_ctx)" << endl << indent() - << "end" << endl; + indent(out) << "else" << '\n' << indent() + << " return self[func_name](self, seqid, iprot, oprot, server_ctx)" << '\n' << indent() + << "end" << '\n'; indent_down(); - indent(out) << "end" << endl; + indent(out) << "end" << '\n'; // Generate the process subfunctions vector functions = tservice->get_functions(); @@ -717,18 +715,18 @@ void t_lua_generator::generate_process_function(ostream& out, string resultname = tfunction->get_name() + "_result"; string fn_name = tfunction->get_name(); - indent(out) << endl << "function " << classname << ":process_" << fn_name - << "(seqid, iprot, oprot, server_ctx)" << endl; + indent(out) << '\n' << "function " << classname << ":process_" << fn_name + << "(seqid, iprot, oprot, server_ctx)" << '\n'; indent_up(); // Read the request - out << indent() << "local args = " << argsname << ":new{}" << endl << indent() - << "local reply_type = TMessageType.REPLY" << endl << indent() << "args:read(iprot)" << endl - << indent() << "iprot:readMessageEnd()" << endl; + out << indent() << "local args = " << argsname << ":new{}" << '\n' << indent() + << "local reply_type = TMessageType.REPLY" << '\n' << indent() << "args:read(iprot)" << '\n' + << indent() << "iprot:readMessageEnd()" << '\n'; if (!tfunction->is_oneway()) { out << indent() << "local result = " << resultname - << ":new{}" << endl; + << ":new{}" << '\n'; } out << indent() << "local status, res = pcall(self.handler." << fn_name @@ -738,13 +736,13 @@ void t_lua_generator::generate_process_function(ostream& out, if (args->get_members().size() > 0) { out << ", " << argument_list(args, "args."); } - out << ")" << endl; + out << ")" << '\n'; if (!tfunction->is_oneway()) { // Check for errors - out << indent() << "if not status then" << endl << indent() - << " reply_type = TMessageType.EXCEPTION" << endl << indent() - << " result = TApplicationException:new{message = res}" << endl; + out << indent() << "if not status then" << '\n' << indent() + << " reply_type = TMessageType.EXCEPTION" << '\n' << indent() + << " result = TApplicationException:new{message = res}" << '\n'; // Handle custom exceptions const std::vector& xf = tfunction->get_xceptions()->get_members(); @@ -752,19 +750,19 @@ void t_lua_generator::generate_process_function(ostream& out, vector::const_iterator x_iter; for (x_iter = xf.begin(); x_iter != xf.end(); ++x_iter) { out << indent() << "elseif ttype(res) == '" << (*x_iter)->get_type()->get_name() << "' then" - << endl << indent() << " result." << (*x_iter)->get_name() << " = res" << endl; + << '\n' << indent() << " result." << (*x_iter)->get_name() << " = res" << '\n'; } } // Set the result and write the reply - out << indent() << "else" << endl << indent() << " result.success = res" << endl << indent() - << "end" << endl << indent() << "oprot:writeMessageBegin('" << fn_name << "', reply_type, " - << "seqid)" << endl << indent() << "result:write(oprot)" << endl << indent() - << "oprot:writeMessageEnd()" << endl << indent() << "oprot.trans:flush()" << endl; + out << indent() << "else" << '\n' << indent() << " result.success = res" << '\n' << indent() + << "end" << '\n' << indent() << "oprot:writeMessageBegin('" << fn_name << "', reply_type, " + << "seqid)" << '\n' << indent() << "result:write(oprot)" << '\n' << indent() + << "oprot:writeMessageEnd()" << '\n' << indent() << "oprot.trans:flush()" << '\n'; } - out << indent() << "return status, res" << endl; + out << indent() << "return status, res" << '\n'; indent_down(); - indent(out) << "end" << endl; + indent(out) << "end" << '\n'; } // Service helpers @@ -772,7 +770,7 @@ void t_lua_generator::generate_service_helpers(ostream& out, t_service* tservice vector functions = tservice->get_functions(); vector::iterator f_iter; - out << endl << "-- HELPER FUNCTIONS AND STRUCTURES"; + out << '\n' << "-- HELPER FUNCTIONS AND STRUCTURES"; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { t_struct* ts = (*f_iter)->get_arglist(); generate_lua_struct_definition(out, ts, false); @@ -853,7 +851,7 @@ void t_lua_generator::generate_deserialize_field(ostream& out, } else if (type->is_enum()) { out << "readI32()"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", @@ -867,7 +865,7 @@ void t_lua_generator::generate_deserialize_struct(ostream& out, bool local, string prefix) { indent(out) << (local ? "local " : "") << prefix << " = " << tstruct->get_name() << ":new{}" - << endl << indent() << prefix << ":read(iprot)" << endl; + << '\n' << indent() << prefix << ":read(iprot)" << '\n'; } void t_lua_generator::generate_deserialize_container(ostream& out, @@ -885,18 +883,18 @@ void t_lua_generator::generate_deserialize_container(ostream& out, t_field fetype(g_type_i8, etype); // Declare variables, read header - indent(out) << (local ? "local " : "") << prefix << " = {}" << endl; + indent(out) << (local ? "local " : "") << prefix << " = {}" << '\n'; if (ttype->is_map()) { indent(out) << "local " << ktype << ", " << vtype << ", " << size << " = iprot:readMapBegin() " - << endl; + << '\n'; } else if (ttype->is_set()) { - indent(out) << "local " << etype << ", " << size << " = iprot:readSetBegin()" << endl; + indent(out) << "local " << etype << ", " << size << " = iprot:readSetBegin()" << '\n'; } else if (ttype->is_list()) { - indent(out) << "local " << etype << ", " << size << " = iprot:readListBegin()" << endl; + indent(out) << "local " << etype << ", " << size << " = iprot:readListBegin()" << '\n'; } // Deserialize - indent(out) << "for _i=1," << size << " do" << endl; + indent(out) << "for _i=1," << size << " do" << '\n'; indent_up(); if (ttype->is_map()) { @@ -908,15 +906,15 @@ void t_lua_generator::generate_deserialize_container(ostream& out, } indent_down(); - indent(out) << "end" << endl; + indent(out) << "end" << '\n'; // Read container end if (ttype->is_map()) { - indent(out) << "iprot:readMapEnd()" << endl; + indent(out) << "iprot:readMapEnd()" << '\n'; } else if (ttype->is_set()) { - indent(out) << "iprot:readSetEnd()" << endl; + indent(out) << "iprot:readSetEnd()" << '\n'; } else if (ttype->is_list()) { - indent(out) << "iprot:readListEnd()" << endl; + indent(out) << "iprot:readListEnd()" << '\n'; } } @@ -930,7 +928,7 @@ void t_lua_generator::generate_deserialize_map_element(ostream& out, t_map* tmap generate_deserialize_field(out, &fkey, true); generate_deserialize_field(out, &fval, true); - indent(out) << prefix << "[" << key << "] = " << val << endl; + indent(out) << prefix << "[" << key << "] = " << val << '\n'; } void t_lua_generator::generate_deserialize_set_element(ostream& out, t_set* tset, string prefix) { @@ -940,7 +938,7 @@ void t_lua_generator::generate_deserialize_set_element(ostream& out, t_set* tset generate_deserialize_field(out, &felem, true); - indent(out) << prefix << "[" << elem << "] = " << elem << endl; + indent(out) << prefix << "[" << elem << "] = " << elem << '\n'; } void t_lua_generator::generate_deserialize_list_element(ostream& out, @@ -953,7 +951,7 @@ void t_lua_generator::generate_deserialize_list_element(ostream& out, generate_deserialize_field(out, &felem, true); - indent(out) << "table.insert(" << prefix << ", " << elem << ")" << endl; + indent(out) << "table.insert(" << prefix << ", " << elem << ")" << '\n'; } /** @@ -1008,7 +1006,7 @@ void t_lua_generator::generate_serialize_field(ostream& out, t_field* tfield, st } else if (type->is_enum()) { out << "writeI32(" << name << ")"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s' TYPE '%s'\n", name.c_str(), @@ -1018,7 +1016,7 @@ void t_lua_generator::generate_serialize_field(ostream& out, t_field* tfield, st void t_lua_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) { (void)tstruct; - indent(out) << prefix << ":write(oprot)" << endl; + indent(out) << prefix << ":write(oprot)" << '\n'; } void t_lua_generator::generate_serialize_container(ostream& out, t_type* ttype, string prefix) { @@ -1026,48 +1024,48 @@ void t_lua_generator::generate_serialize_container(ostream& out, t_type* ttype, if (ttype->is_map()) { indent(out) << "oprot:writeMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " - << "ttable_size(" << prefix << "))" << endl; + << "ttable_size(" << prefix << "))" << '\n'; } else if (ttype->is_set()) { indent(out) << "oprot:writeSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " - << "ttable_size(" << prefix << "))" << endl; + << "ttable_size(" << prefix << "))" << '\n'; } else if (ttype->is_list()) { indent(out) << "oprot:writeListBegin(" << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " - << "#" << prefix << ")" << endl; + << "#" << prefix << ")" << '\n'; } // Serialize if (ttype->is_map()) { string kiter = tmp("kiter"); string viter = tmp("viter"); - indent(out) << "for " << kiter << "," << viter << " in pairs(" << prefix << ") do" << endl; + indent(out) << "for " << kiter << "," << viter << " in pairs(" << prefix << ") do" << '\n'; indent_up(); generate_serialize_map_element(out, (t_map*)ttype, kiter, viter); indent_down(); - indent(out) << "end" << endl; + indent(out) << "end" << '\n'; } else if (ttype->is_set()) { string iter = tmp("iter"); - indent(out) << "for " << iter << ",_ in pairs(" << prefix << ") do" << endl; + indent(out) << "for " << iter << ",_ in pairs(" << prefix << ") do" << '\n'; indent_up(); generate_serialize_set_element(out, (t_set*)ttype, iter); indent_down(); - indent(out) << "end" << endl; + indent(out) << "end" << '\n'; } else if (ttype->is_list()) { string iter = tmp("iter"); - indent(out) << "for _," << iter << " in ipairs(" << prefix << ") do" << endl; + indent(out) << "for _," << iter << " in ipairs(" << prefix << ") do" << '\n'; indent_up(); generate_serialize_list_element(out, (t_list*)ttype, iter); indent_down(); - indent(out) << "end" << endl; + indent(out) << "end" << '\n'; } // Finish writing if (ttype->is_map()) { - indent(out) << "oprot:writeMapEnd()" << endl; + indent(out) << "oprot:writeMapEnd()" << '\n'; } else if (ttype->is_set()) { - indent(out) << "oprot:writeSetEnd()" << endl; + indent(out) << "oprot:writeSetEnd()" << '\n'; } else if (ttype->is_list()) { - indent(out) << "oprot:writeListEnd()" << endl; + indent(out) << "oprot:writeListEnd()" << '\n'; } } diff --git a/compiler/cpp/src/thrift/generate/t_markdown_generator.cc b/compiler/cpp/src/thrift/generate/t_markdown_generator.cc index 76fe98b4e53..fbcaccca02e 100644 --- a/compiler/cpp/src/thrift/generate/t_markdown_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_markdown_generator.cc @@ -38,9 +38,6 @@ using std::string; using std::stringstream; using std::vector; -static const char endl = '\n'; // avoid ostream << std::endl flushes - - /** * MARKDOWN code generator * @@ -55,7 +52,7 @@ enum input_type { INPUT_UNKNOWN, INPUT_UTF8, INPUT_PLAIN }; const std::map& parsed_options, const std::string& option_string) : t_generator(program) { - + (void)option_string; std::map::const_iterator iter; @@ -128,14 +125,14 @@ enum input_type { INPUT_UNKNOWN, INPUT_UTF8, INPUT_PLAIN }; /** - * string to markdown-id link reference + * string to markdown-id link reference */ std::string t_markdown_generator::str_to_id(const std::string& s) { std::string id; for(auto chr=s.begin();chr<=s.end(); ++chr) { if(*chr == '.' || *chr == 0) continue; - id += tolower(*chr); + id += tolower(*chr); } return id; } @@ -144,10 +141,10 @@ std::string t_markdown_generator::str_to_id(const std::string& s) { * Emits the Table of Contents links at the top of the module's page */ void t_markdown_generator::generate_program_toc() { - f_out_ << "| Module | Services & Functions | Data types | Constants |" << endl - << "| --- | --- | --- | --- |" << endl; + f_out_ << "| Module | Services & Functions | Data types | Constants |" << '\n' + << "| --- | --- | --- | --- |" << '\n'; generate_program_toc_row(program_); - f_out_ << endl; + f_out_ << '\n'; } /** @@ -191,24 +188,24 @@ void t_markdown_generator::generate_program_toc_row(t_program* tprog) { fill = &filling.back(); } string name = get_service_name(*sv_iter); - (*fill)[1] = "[" + name + "](" - + make_file_link(fname) + (*fill)[1] = "[" + name + "](" + + make_file_link(fname) + "#service-" + str_to_id(name) + ")"; - + vector functions = (*sv_iter)->get_functions(); vector::iterator fn_iter; - for (fn_iter = functions.begin(); fn_iter != functions.end(); ++fn_iter) { - string fn_name = (*fn_iter)->get_name(); + for (fn_iter = functions.begin(); fn_iter != functions.end(); ++fn_iter) { + string fn_name = (*fn_iter)->get_name(); filling.emplace_back(); fill = &filling.back(); - (*fill)[1] = " [ • " + fn_name + "](" - + make_file_link(fname) + (*fill)[1] = " [ • " + fn_name + "](" + + make_file_link(fname) + "#function-" + str_to_id(name + fn_name) + ")"; } } } - - // Data Types Column + + // Data Types Column auto it_fill = filling.begin(); if (!tprog->get_enums().empty()) { @@ -224,8 +221,8 @@ void t_markdown_generator::generate_program_toc_row(t_program* tprog) { ++it_fill; } string name = (*en_iter)->get_name(); - (*fill)[2] = "[" + name + "](" - + make_file_link(fname) + (*fill)[2] = "[" + name + "](" + + make_file_link(fname) + "#enumeration-" + str_to_id(name) + ")"; } } @@ -242,15 +239,15 @@ void t_markdown_generator::generate_program_toc_row(t_program* tprog) { ++it_fill; } string name = (*td_iter)->get_symbolic(); - (*fill)[2] = "[" + name + "](" - + make_file_link(fname) + (*fill)[2] = "[" + name + "](" + + make_file_link(fname) + "#typedef-" + str_to_id(name) + ")"; } } if (!tprog->get_objects().empty()) { vector objects = tprog->get_objects(); vector::iterator o_iter; - for (o_iter = objects.begin(); o_iter != objects.end(); ++o_iter) { + for (o_iter = objects.begin(); o_iter != objects.end(); ++o_iter) { if(it_fill == filling.end()) { filling.emplace_back(); fill = &filling.back(); @@ -261,7 +258,7 @@ void t_markdown_generator::generate_program_toc_row(t_program* tprog) { } string name = (*o_iter)->get_name(); (*fill)[2] = "[" + name + "](" + make_file_link(fname); - + if ((*o_iter)->is_xception()) { (*fill)[2] += "#exception-"; } else if ((*o_iter)->is_struct() && (*o_iter)->is_union()) { @@ -270,11 +267,11 @@ void t_markdown_generator::generate_program_toc_row(t_program* tprog) { (*fill)[2] += "#struct-"; } (*fill)[2] += str_to_id(name) + ")"; - + } } - - // Constants Column + + // Constants Column it_fill = filling.begin(); if (!tprog->get_consts().empty()) { @@ -291,19 +288,19 @@ void t_markdown_generator::generate_program_toc_row(t_program* tprog) { ++it_fill; } string name = (*con_iter)->get_name(); - (*fill)[3] = "[" + name + "](" - + make_file_link(fname) + (*fill)[3] = "[" + name + "](" + + make_file_link(fname) + "#constant-" + str_to_id(name) + ")"; } - + } - + for(auto& fill : filling) { for(auto& c : fill) - f_out_ << '|' << c; - f_out_ << '|' << endl; + f_out_ << '|' << c; + f_out_ << '|' << '\n'; } - f_out_ << endl; + f_out_ << '\n'; } /** @@ -318,24 +315,24 @@ void t_markdown_generator::generate_program() { current_file_ = make_file_name(pname); string fname = get_out_dir() + current_file_; f_out_.open(fname.c_str()); - f_out_ << "# Thrift module: " << pname << endl << endl; + f_out_ << "# Thrift module: " << pname << '\n' << '\n'; print_doc(program_); - f_out_ << endl << endl; + f_out_ << '\n' << '\n'; generate_program_toc(); if (!program_->get_consts().empty()) { - f_out_ << "***" << endl << "## Constants" << endl << endl; + f_out_ << "***" << '\n' << "## Constants" << '\n' << '\n'; vector consts = program_->get_consts(); - f_out_ << "|Constant|Type|Value||" << endl - << "|---|---|---|---|" << endl; + f_out_ << "|Constant|Type|Value||" << '\n' + << "|---|---|---|---|" << '\n'; generate_consts(consts); - f_out_ << endl; + f_out_ << '\n'; } if (!program_->get_enums().empty()) { - f_out_ << "***" << endl << "## Enumerations" << endl << endl; + f_out_ << "***" << '\n' << "## Enumerations" << '\n' << '\n'; // Generate enums vector enums = program_->get_enums(); vector::iterator en_iter; @@ -345,7 +342,7 @@ void t_markdown_generator::generate_program() { } if (!program_->get_typedefs().empty()) { - f_out_ << "***" << endl << "## Type declarations" << endl << endl; + f_out_ << "***" << '\n' << "## Type declarations" << '\n' << '\n'; // Generate typedefs vector typedefs = program_->get_typedefs(); vector::iterator td_iter; @@ -355,7 +352,7 @@ void t_markdown_generator::generate_program() { } if (!program_->get_objects().empty()) { - f_out_ << "***" << endl << "## Data structures" << endl << endl; + f_out_ << "***" << '\n' << "## Data structures" << '\n' << '\n'; // Generate structs and exceptions in declared order vector objects = program_->get_objects(); vector::iterator o_iter; @@ -369,7 +366,7 @@ void t_markdown_generator::generate_program() { } if (!program_->get_services().empty()) { - f_out_ << "***" << endl << "## Services" << endl << endl; + f_out_ << "***" << '\n' << "## Services" << '\n' << '\n'; // Generate services vector services = program_->get_services(); vector::iterator sv_iter; @@ -379,7 +376,7 @@ void t_markdown_generator::generate_program() { } } - f_out_ << endl; + f_out_ << '\n'; f_out_.close(); generate_index(); @@ -392,15 +389,15 @@ void t_markdown_generator::generate_index() { current_file_ = make_file_name("index"); string index_fname = get_out_dir() + current_file_; f_out_.open(index_fname.c_str()); - - f_out_ << "# Thrift declarations" << endl; - f_out_ << "| Module | Services & Functions | Data types | Constants |" - << endl - << "| --- | --- | --- | --- |" - << endl; + + f_out_ << "# Thrift declarations" << '\n'; + f_out_ << "| Module | Services & Functions | Data types | Constants |" + << '\n' + << "| --- | --- | --- | --- |" + << '\n'; vector programs; generate_program_toc_rows(program_, programs); - f_out_ << endl; + f_out_ << '\n'; f_out_.close(); } @@ -716,13 +713,13 @@ int t_markdown_generator::print_type(t_type* ttype) { f_out_ << ">"; } } else if (ttype->is_base_type()) { - f_out_ << "```" << (ttype->is_binary() ? "binary" : ttype->get_name()) + f_out_ << "```" << (ttype->is_binary() ? "binary" : ttype->get_name()) << "```"; len = ttype->get_name().size(); } else { string prog_name = ttype->get_program()->get_name(); string type_name = ttype->get_name(); - f_out_ << "[```" << type_name << "```](" + f_out_ << "[```" << type_name << "```](" << make_file_link(make_file_name(prog_name)) << "#"; if (ttype->is_typedef()) { f_out_ << "typedef-"; @@ -740,7 +737,7 @@ int t_markdown_generator::print_type(t_type* ttype) { } len = type_name.size(); if (ttype->get_program() != program_) { - f_out_ << str_to_id(prog_name); + f_out_ << str_to_id(prog_name); len += prog_name.size() + 1; } f_out_ << str_to_id(type_name) << ')'; @@ -757,8 +754,8 @@ void t_markdown_generator::print_const_value(t_type* type, t_const_value* tvalue if (tvalue->get_type() == t_const_value::CV_IDENTIFIER) { string fname = make_file_name(program_->get_name()); string name = escape_html(tvalue->get_identifier()); - f_out_ << "[```" << name << "```](" - + make_file_link(fname) + f_out_ << "[```" << name << "```](" + + make_file_link(fname) + "#constant-" + str_to_id(name) + ")"; return; } @@ -773,7 +770,7 @@ void t_markdown_generator::print_const_value(t_type* type, t_const_value* tvalue t_base_type::t_base tbase = ((t_base_type*)truetype)->get_base(); f_out_ << "```"; switch (tbase) { - case t_base_type::TYPE_STRING: + case t_base_type::TYPE_STRING: f_out_ << escape_html(get_escaped_string(tvalue)); break; case t_base_type::TYPE_BOOL: @@ -893,17 +890,17 @@ void t_markdown_generator::print_fn_args_doc(t_function* tfunction) { } if (has_docs) { arg_iter = args.begin(); - f_out_ << endl << "* parameters:" << endl; + f_out_ << '\n' << "* parameters:" << '\n'; for (int n = 1; arg_iter != args.end(); ++arg_iter, ++n ) { f_out_ << n << ". " << (*arg_iter)->get_name(); f_out_ << " - " << escape_html((*arg_iter)->get_doc()); - f_out_ << endl; + f_out_ << '\n'; } - f_out_ << endl; + f_out_ << '\n'; } } - if(!has_docs) - f_out_ << endl; + if(!has_docs) + f_out_ << '\n'; has_docs = false; vector excepts = tfunction->get_xceptions()->get_members(); @@ -917,14 +914,14 @@ void t_markdown_generator::print_fn_args_doc(t_function* tfunction) { } if (has_docs) { ex_iter = excepts.begin(); - f_out_ << "* exceptions:" << endl; + f_out_ << "* exceptions:" << '\n'; for (; ex_iter != excepts.end(); ex_iter++) { f_out_ << " * " << (*ex_iter)->get_type()->get_name(); f_out_ << " - "; f_out_ << escape_html((*ex_iter)->get_doc()); - f_out_ << endl; + f_out_ << '\n'; } - f_out_ << endl; + f_out_ << '\n'; } } } @@ -936,13 +933,13 @@ void t_markdown_generator::print_fn_args_doc(t_function* tfunction) { */ void t_markdown_generator::generate_typedef(t_typedef* ttypedef) { string name = ttypedef->get_name(); - f_out_ << "### Typedef: " << name << endl; + f_out_ << "### Typedef: " << name << '\n'; print_doc(ttypedef); - f_out_ << endl << endl; + f_out_ << '\n' << '\n'; f_out_ << "_Base type_: **"; print_type(ttypedef->get_type()); - f_out_ << "**" << endl << endl; - f_out_ << endl; + f_out_ << "**" << '\n' << '\n'; + f_out_ << '\n'; } /** @@ -952,10 +949,10 @@ void t_markdown_generator::generate_typedef(t_typedef* ttypedef) { */ void t_markdown_generator::generate_enum(t_enum* tenum) { string name = tenum->get_name(); - f_out_ << "### Enumeration: " << name << endl; + f_out_ << "### Enumeration: " << name << '\n'; print_doc(tenum); - f_out_ << endl << endl << "|Name|Value|Description|" << endl - << "|---|---|---|" << endl; + f_out_ << '\n' << '\n' << "|Name|Value|Description|" << '\n' + << "|---|---|---|" << '\n'; vector values = tenum->get_constants(); vector::iterator val_iter; for (val_iter = values.begin(); val_iter != values.end(); ++val_iter) { @@ -965,9 +962,9 @@ void t_markdown_generator::generate_enum(t_enum* tenum) { f_out_ << (*val_iter)->get_value(); f_out_ << "```|"; print_doc((*val_iter)); - f_out_ << "|" << endl; + f_out_ << "|" << '\n'; } - f_out_ << endl; + f_out_ << '\n'; } /** @@ -984,7 +981,7 @@ void t_markdown_generator::generate_const(t_const* tconst) { if (tconst->has_doc()) { print_doc(tconst); } - f_out_ << '|' << endl; + f_out_ << '|' << '\n'; } /** @@ -1002,14 +999,14 @@ void t_markdown_generator::generate_struct(t_struct* tstruct) { } else { f_out_ << "Struct: "; } - f_out_ << name << endl; + f_out_ << name << '\n'; print_doc(tstruct); - f_out_ << endl << endl; + f_out_ << '\n' << '\n'; vector members = tstruct->get_members(); vector::iterator mem_iter = members.begin(); f_out_ << "| Key | Field | Type | Description | Requiredness " - "| Default value |" << endl - << "| --- | --- | --- | --- | --- | --- |" << endl; + "| Default value |" << '\n' + << "| --- | --- | --- | --- | --- | --- |" << '\n'; for (; mem_iter != members.end(); mem_iter++) { f_out_ << '|' << (*mem_iter)->get_key(); f_out_ << '|' << (*mem_iter)->get_name(); @@ -1030,9 +1027,9 @@ void t_markdown_generator::generate_struct(t_struct* tstruct) { print_const_value((*mem_iter)->get_type(), default_val); f_out_ << "```"; } - f_out_ << '|' << endl; + f_out_ << '|' << '\n'; } - f_out_ << endl; + f_out_ << '\n'; } /** @@ -1050,32 +1047,32 @@ void t_markdown_generator::generate_xception(t_struct* txception) { * @param tservice The service definition */ void t_markdown_generator::generate_service(t_service* tservice) { - f_out_ << "### Service: " << service_name_ << endl; + f_out_ << "### Service: " << service_name_ << '\n'; if (tservice->get_extends()) { f_out_ << "**extends ** _"; print_type(tservice->get_extends()); - f_out_ << "_" << endl; + f_out_ << "_" << '\n'; } print_doc(tservice); - f_out_ << endl; + f_out_ << '\n'; vector functions = tservice->get_functions(); vector::iterator fn_iter = functions.begin(); for (; fn_iter != functions.end(); fn_iter++) { string fn_name = (*fn_iter)->get_name(); - f_out_ << "#### Function: " << service_name_ << "." << fn_name << endl; + f_out_ << "#### Function: " << service_name_ << "." << fn_name << '\n'; print_doc(*fn_iter); - f_out_ << endl << endl; + f_out_ << '\n' << '\n'; print_type((*fn_iter)->get_returntype()); bool first = true; - f_out_ << endl << " _" << fn_name << "_("; + f_out_ << '\n' << " _" << fn_name << "_("; vector args = (*fn_iter)->get_arglist()->get_members(); vector::iterator arg_iter = args.begin(); for (; arg_iter != args.end(); arg_iter++) { if (!first) { - f_out_ << "," << endl; + f_out_ << "," << '\n'; } first = false; print_type((*arg_iter)->get_type()); @@ -1085,7 +1082,7 @@ void t_markdown_generator::generate_service(t_service* tservice) { print_const_value((*arg_iter)->get_type(), (*arg_iter)->get_value()); } } - f_out_ << ")" << endl; + f_out_ << ")" << '\n'; first = true; vector excepts = (*fn_iter)->get_xceptions()->get_members(); vector::iterator ex_iter = excepts.begin(); @@ -1098,10 +1095,10 @@ void t_markdown_generator::generate_service(t_service* tservice) { first = false; print_type((*ex_iter)->get_type()); } - f_out_ << endl; + f_out_ << '\n'; } print_fn_args_doc(*fn_iter); - f_out_ << endl; + f_out_ << '\n'; } } diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc index 1a27c0c3b2f..6e464549784 100644 --- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc @@ -203,26 +203,26 @@ void t_netstd_generator::reset_indent() { void t_netstd_generator::pragmas_and_directives(ostream& out) { if( target_net_version >= 6) { - out << "// Thrift code generated for net" << target_net_version << endl; - out << "#nullable enable // requires C# 8.0" << endl; + out << "// Thrift code generated for net" << target_net_version << '\n'; + out << "#nullable enable // requires C# 8.0" << '\n'; } // this one must be first - out << "#pragma warning disable IDE0079 // remove unnecessary pragmas" << endl; + out << "#pragma warning disable IDE0079 // remove unnecessary pragmas" << '\n'; if( target_net_version >= 8) { - out << "#pragma warning disable IDE0290 // use primary CTOR" << endl; + out << "#pragma warning disable IDE0290 // use primary CTOR" << '\n'; } else { - out << "#pragma warning disable IDE0017 // object init can be simplified" << endl; - out << "#pragma warning disable IDE0028 // collection init can be simplified" << endl; + out << "#pragma warning disable IDE0017 // object init can be simplified" << '\n'; + out << "#pragma warning disable IDE0028 // collection init can be simplified" << '\n'; } - out << "#pragma warning disable IDE1006 // parts of the code use IDL spelling" << endl; - out << "#pragma warning disable CA1822 // empty " << DEEP_COPY_METHOD_NAME << "() methods still non-static" << endl; + out << "#pragma warning disable IDE1006 // parts of the code use IDL spelling" << '\n'; + out << "#pragma warning disable CA1822 // empty " << DEEP_COPY_METHOD_NAME << "() methods still non-static" << '\n'; if( target_net_version < 6) { - out << "#pragma warning disable IDE0083 // pattern matching \"that is not SomeType\" requires net5.0 but we still support earlier versions" << endl; + out << "#pragma warning disable IDE0083 // pattern matching \"that is not SomeType\" requires net5.0 but we still support earlier versions" << '\n'; } - out << endl; + out << '\n'; } @@ -230,7 +230,7 @@ void t_netstd_generator::start_netstd_namespace(ostream& out) { if (!namespace_name_.empty()) { - out << "namespace " << namespace_name_ << endl; + out << "namespace " << namespace_name_ << '\n'; scope_up(out); } } @@ -309,13 +309,13 @@ void t_netstd_generator::generate_enum(t_enum* tenum) void t_netstd_generator::generate_enum(ostream& out, t_enum* tenum) { reset_indent(); - out << autogen_comment() << endl; + out << autogen_comment() << '\n'; pragmas_and_directives(out); start_netstd_namespace(out); generate_netstd_doc(out, tenum); - out << indent() << "public enum " << type_name(tenum,false) << endl; + out << indent() << "public enum " << type_name(tenum,false) << '\n'; scope_up(out); vector constants = tenum->get_constants(); @@ -325,7 +325,7 @@ void t_netstd_generator::generate_enum(ostream& out, t_enum* tenum) { generate_netstd_doc(out, *c_iter); int value = (*c_iter)->get_value(); - out << indent() << normalize_name((*c_iter)->get_name()) << " = " << value << "," << endl; + out << indent() << normalize_name((*c_iter)->get_name()) << " = " << value << "," << '\n'; } scope_down(out); @@ -356,12 +356,12 @@ void t_netstd_generator::generate_consts(ostream& out, vector consts) } reset_indent(); - out << autogen_comment() << netstd_type_usings() << endl << endl; + out << autogen_comment() << netstd_type_usings() << '\n' << '\n'; pragmas_and_directives(out); start_netstd_namespace(out); - out << indent() << "public static class " << make_valid_csharp_identifier(program_name_) << "Constants" << endl; + out << indent() << "public static class " << make_valid_csharp_identifier(program_name_) << "Constants" << '\n'; scope_up(out); @@ -416,7 +416,7 @@ void t_netstd_generator::print_const_def_value(ostream& out, string name, t_type t_type* field_type = field->get_type(); string val = render_const_value(out, name, field_type, v_iter->second); - out << indent() << name << "." << prop_name(field) << " = " << val << ";" << endl; + out << indent() << name << "." << prop_name(field) << " = " << val << ";" << '\n'; } cleanup_member_name_mapping(static_cast(type)); @@ -431,7 +431,7 @@ void t_netstd_generator::print_const_def_value(ostream& out, string name, t_type { string key = render_const_value(out, name, ktype, v_iter->first); string val = render_const_value(out, name, vtype, v_iter->second); - out << indent() << name << "[" << key << "]" << " = " << val << ";" << endl; + out << indent() << name << "[" << key << "]" << " = " << val << ";" << '\n'; } } else if (type->is_list() || type->is_set()) @@ -451,14 +451,14 @@ void t_netstd_generator::print_const_def_value(ostream& out, string name, t_type for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string val = render_const_value(out, name, etype, *v_iter); - out << indent() << name << ".Add(" << val << ");" << endl; + out << indent() << name << ".Add(" << val << ");" << '\n'; } } } void t_netstd_generator::print_const_constructor(ostream& out, vector consts) { - out << indent() << "static " << make_valid_csharp_identifier(program_name_).c_str() << "Constants()" << endl; + out << indent() << "static " << make_valid_csharp_identifier(program_name_).c_str() << "Constants()" << '\n'; scope_up(out); vector::iterator c_iter; @@ -494,30 +494,30 @@ bool t_netstd_generator::print_const_value(ostream& out, string name, t_type* ty if (type->is_base_type()) { string v2 = render_const_value(out, name, type, value); - out << name << " = " << v2 << ";" << endl; + out << name << " = " << v2 << ";" << '\n'; need_static_construction = false; } else if (type->is_enum()) { - out << name << " = " << type_name(type) << "." << value->get_identifier_name() << ";" << endl; + out << name << " = " << type_name(type) << "." << value->get_identifier_name() << ";" << '\n'; need_static_construction = false; } else if (type->is_struct() || type->is_xception()) { if(target_net_version >= 6) { - out << name << " = new();" << endl; + out << name << " = new();" << '\n'; } else { - out << name << " = new " << type_name(type) << "();" << endl; + out << name << " = new " << type_name(type) << "();" << '\n'; } } else if (type->is_map() || type->is_list() || type->is_set()) { if(target_net_version >= 8) { - out << name << " = [];" << endl; + out << name << " = [];" << '\n'; } else if(target_net_version >= 6) { - out << name << " = new();" << endl; + out << name << " = new();" << '\n'; } else { - out << name << " = new " << type_name(type) << "();" << endl; + out << name << " = new " << type_name(type) << "();" << '\n'; } } @@ -672,49 +672,49 @@ void t_netstd_generator::generate_extensions(ostream& out, map reset_indent(); out << autogen_comment() << netstd_type_usings() - << "using Thrift.Protocol;" << endl - << endl << endl; + << "using Thrift.Protocol;" << '\n' + << '\n' << '\n'; pragmas_and_directives(out); start_netstd_namespace(out); - out << indent() << "public static class " << make_valid_csharp_identifier(program_name_) << "Extensions" << endl; + out << indent() << "public static class " << make_valid_csharp_identifier(program_name_) << "Extensions" << '\n'; scope_up(out); bool needs_typecast = false; std::map::const_iterator iter; for( iter = types.begin(); iter != types.end(); ++iter) { - out << indent() << "public static bool Equals(this " << iter->first << " instance, object that)" << endl; + out << indent() << "public static bool Equals(this " << iter->first << " instance, object that)" << '\n'; scope_up(out); if( target_net_version >= 6) { - out << indent() << "if (that is not " << iter->first << " other) return false;" << endl; + out << indent() << "if (that is not " << iter->first << " other) return false;" << '\n'; } else { - out << indent() << "if (!(that is " << iter->first << " other)) return false;" << endl; + out << indent() << "if (!(that is " << iter->first << " other)) return false;" << '\n'; } - out << indent() << "if (ReferenceEquals(instance, other)) return true;" << endl; - out << endl; - out << indent() << "return TCollections.Equals(instance, other);" << endl; + out << indent() << "if (ReferenceEquals(instance, other)) return true;" << '\n'; + out << '\n'; + out << indent() << "return TCollections.Equals(instance, other);" << '\n'; scope_down(out); - out << endl << endl; + out << '\n' << '\n'; - out << indent() << "public static int GetHashCode(this " << iter->first << " instance)" << endl; + out << indent() << "public static int GetHashCode(this " << iter->first << " instance)" << '\n'; scope_up(out); - out << indent() << "return TCollections.GetHashCode(instance);" << endl; + out << indent() << "return TCollections.GetHashCode(instance);" << '\n'; scope_down(out); - out << endl << endl; + out << '\n' << '\n'; if(! suppress_deepcopy) { - out << indent() << "public static " << iter->first << nullable_field_suffix(iter->second) << " " << DEEP_COPY_METHOD_NAME << "(this " << iter->first << nullable_field_suffix(iter->second) << " source)" << endl; + out << indent() << "public static " << iter->first << nullable_field_suffix(iter->second) << " " << DEEP_COPY_METHOD_NAME << "(this " << iter->first << nullable_field_suffix(iter->second) << " source)" << '\n'; scope_up(out); - out << indent() << "if (source == null)" << endl; + out << indent() << "if (source == null)" << '\n'; indent_up(); - out << indent() << "return null;" << endl << endl; + out << indent() << "return null;" << '\n' << '\n'; indent_down(); string suffix(""); string tmp_instance = tmp("tmp"); - out << indent() << "var " << tmp_instance << " = new " << iter->first << "(source.Count);" << endl; + out << indent() << "var " << tmp_instance << " = new " << iter->first << "(source.Count);" << '\n'; if( iter->second->is_map()) { t_map* tmap = static_cast(iter->second); @@ -723,7 +723,7 @@ void t_netstd_generator::generate_extensions(ostream& out, map bool null_key = type_can_be_null(tmap->get_key_type()); bool null_val = type_can_be_null(tmap->get_val_type()); - out << indent() << "foreach (var pair in source)" << endl; + out << indent() << "foreach (var pair in source)" << '\n'; indent_up(); if( target_net_version >= 6) { out << indent() << tmp_instance << ".Add(pair.Key" << copy_key; @@ -742,7 +742,7 @@ void t_netstd_generator::generate_extensions(ostream& out, map out << "pair.Value" << copy_val; } } - out << ");" << endl; + out << ");" << '\n'; indent_down(); } else if( iter->second->is_set() || iter->second->is_list()) { @@ -761,7 +761,7 @@ void t_netstd_generator::generate_extensions(ostream& out, map null_elm = type_can_be_null(tlist->get_elem_type()); } - out << indent() << "foreach (var elem in source)" << endl; + out << indent() << "foreach (var elem in source)" << '\n'; indent_up(); if( target_net_version >= 6) { out << indent() << tmp_instance << ".Add(elem" << copy_elm; @@ -774,13 +774,13 @@ void t_netstd_generator::generate_extensions(ostream& out, map out << "elem" << copy_elm; } } - out << ");" << endl; + out << ");" << '\n'; indent_down(); } - out << indent() << "return " << tmp_instance << ";" << endl; + out << indent() << "return " << tmp_instance << ";" << '\n'; scope_down(out); - out << endl << endl; + out << '\n' << '\n'; } } @@ -818,7 +818,7 @@ void t_netstd_generator::generate_netstd_struct(t_struct* tstruct, bool is_excep f_struct.open(f_struct_name.c_str()); reset_indent(); - f_struct << autogen_comment() << netstd_type_usings() << netstd_thrift_usings() << endl << endl; + f_struct << autogen_comment() << netstd_type_usings() << netstd_thrift_usings() << '\n' << '\n'; pragmas_and_directives(f_struct); generate_netstd_struct_definition(f_struct, tstruct, is_exception); @@ -835,7 +835,7 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc start_netstd_namespace(out); } - out << endl; + out << '\n'; generate_netstd_doc(out, tstruct); collect_extensions_types(tstruct); @@ -843,7 +843,7 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc if ((is_serialize_enabled() || is_wcf_enabled()) && !is_exception) { - out << indent() << "[DataContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl; + out << indent() << "[DataContract(Namespace=\"" << wcf_namespace_ << "\")]" << '\n'; } bool is_final = tstruct->annotations_.find("final") != tstruct->annotations_.end(); @@ -857,8 +857,8 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc out << "TException, "; } - out << "TBase" << endl - << indent() << "{" << endl; + out << "TBase" << '\n' + << indent() << "{" << '\n'; indent_up(); const vector& members = tstruct->get_members(); @@ -870,10 +870,10 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc // if the field is required, then we use auto-properties if (!field_is_required((*m_iter))) { - out << indent() << "private " << declare_field(*m_iter, false, true, "_") << endl; + out << indent() << "private " << declare_field(*m_iter, false, true, "_") << '\n'; } } - out << endl; + out << '\n'; bool has_non_required_fields = false; bool has_required_fields = false; @@ -895,19 +895,19 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc bool generate_isset = has_non_required_fields; if (generate_isset) { - out << endl; + out << '\n'; if (is_serialize_enabled() || is_wcf_enabled()) { - out << indent() << "[DataMember(Order = 1)]" << endl; + out << indent() << "[DataMember(Order = 1)]" << '\n'; } - out << indent() << "public Isset __isset;" << endl; + out << indent() << "public Isset __isset;" << '\n'; if (is_serialize_enabled() || is_wcf_enabled()) { - out << indent() << "[DataContract]" << endl; + out << indent() << "[DataContract]" << '\n'; } - out << indent() << "public struct Isset" << endl - << indent() << "{" << endl; + out << indent() << "public struct Isset" << '\n' + << indent() << "{" << '\n'; indent_up(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) @@ -919,18 +919,18 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc { if (is_serialize_enabled() || is_wcf_enabled()) { - out << indent() << "[DataMember]" << endl; + out << indent() << "[DataMember]" << '\n'; } - out << indent() << "public bool " << get_isset_name(normalize_name((*m_iter)->get_name())) << ";" << endl; + out << indent() << "public bool " << get_isset_name(normalize_name((*m_iter)->get_name())) << ";" << '\n'; } } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; if (generate_isset && (is_serialize_enabled() || is_wcf_enabled())) { - out << indent() << "#region XmlSerializer support" << endl << endl; + out << indent() << "#region XmlSerializer support" << '\n' << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -939,22 +939,22 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc // if it is not required, if it has a default value, we need to generate Isset if (!is_required) { - out << indent() << "public bool ShouldSerialize" << prop_name(*m_iter) << "()" << endl - << indent() << "{" << endl; + out << indent() << "public bool ShouldSerialize" << prop_name(*m_iter) << "()" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "return __isset." << get_isset_name(normalize_name((*m_iter)->get_name())) << ";" << endl; + out << indent() << "return __isset." << get_isset_name(normalize_name((*m_iter)->get_name())) << ";" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } } - out << indent() << "#endregion XmlSerializer support" << endl << endl; + out << indent() << "#endregion XmlSerializer support" << '\n' << '\n'; } } // We always want a default, no argument constructor for Reading - out << indent() << "public " << sharp_struct_name << "()" << endl - << indent() << "{" << endl; + out << indent() << "public " << sharp_struct_name << "()" << '\n' + << indent() << "{" << '\n'; indent_up(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) @@ -972,12 +972,12 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc { print_const_value(out, "this._" + (*m_iter)->get_name(), t, (*m_iter)->get_value(), true, true); // Optionals with defaults are marked set - out << indent() << "this.__isset." << get_isset_name(normalize_name((*m_iter)->get_name())) << " = true;" << endl; + out << indent() << "this.__isset." << get_isset_name(normalize_name((*m_iter)->get_name())) << " = true;" << '\n'; } } } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; // if we have required fields, we add that CTOR too if (has_required_fields) @@ -999,20 +999,20 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc out << type_name((*m_iter)->get_type()) << nullable_field_suffix(*m_iter) << " " << normalize_name((*m_iter)->get_name()); } } - out << ") : this()" << endl - << indent() << "{" << endl; + out << ") : this()" << '\n' + << indent() << "{" << '\n'; indent_up(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if (field_is_required(*m_iter)) { - out << indent() << "this." << prop_name(*m_iter) << " = " << normalize_name((*m_iter)->get_name()) << ";" << endl; + out << indent() << "this." << prop_name(*m_iter) << " = " << normalize_name((*m_iter)->get_name()) << ";" << '\n'; } } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } // DeepCopy() @@ -1032,7 +1032,7 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc generate_netstd_struct_tostring(out, tstruct); indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; // generate a corresponding WCF fault to wrap the exception if ((is_serialize_enabled() || is_wcf_enabled()) && is_exception) @@ -1050,13 +1050,13 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc void t_netstd_generator::generate_netstd_wcffault(ostream& out, t_struct* tstruct) { - out << endl; - out << indent() << "[DataContract]" << endl; + out << '\n'; + out << indent() << "[DataContract]" << '\n'; bool is_final = tstruct->annotations_.find("final") != tstruct->annotations_.end(); - out << indent() << "public " << (is_final ? "sealed " : "") << "partial class " << type_name(tstruct,false) << "Fault" << endl - << indent() << "{" << endl; + out << indent() << "public " << (is_final ? "sealed " : "") << "partial class " << type_name(tstruct,false) << "Fault" << '\n' + << indent() << "{" << '\n'; indent_up(); const vector& members = tstruct->get_members(); @@ -1068,10 +1068,10 @@ void t_netstd_generator::generate_netstd_wcffault(ostream& out, t_struct* tstruc // if the field is required, then we use auto-properties if (!field_is_required((*m_iter))) { - out << indent() << "private " << declare_field(*m_iter, false, true, "_") << endl; + out << indent() << "private " << declare_field(*m_iter, false, true, "_") << '\n'; } } - out << endl; + out << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -1079,7 +1079,7 @@ void t_netstd_generator::generate_netstd_wcffault(ostream& out, t_struct* tstruc } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } void t_netstd_generator::generate_netstd_deepcopy_method(ostream& out, t_struct* tstruct, std::string sharp_struct_name) @@ -1091,8 +1091,8 @@ void t_netstd_generator::generate_netstd_deepcopy_method(ostream& out, t_struct* const vector& members = tstruct->get_members(); vector::const_iterator m_iter; - out << indent() << "public " << sharp_struct_name << " " << DEEP_COPY_METHOD_NAME << "()" << endl; - out << indent() << "{" << endl; + out << indent() << "public " << sharp_struct_name << " " << DEEP_COPY_METHOD_NAME << "()" << '\n'; + out << indent() << "{" << '\n'; indent_up(); // return directly if there are only required fields @@ -1100,10 +1100,10 @@ void t_netstd_generator::generate_netstd_deepcopy_method(ostream& out, t_struct* out << indent() << "var " << tmp_instance << " = new " << sharp_struct_name << "()"; bool inline_assignment = (target_net_version >= 6); if(inline_assignment) { - out << endl << indent() << "{" << endl; + out << '\n' << indent() << "{" << '\n'; indent_up(); } else { - out << endl; + out << '\n'; } for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -1118,7 +1118,7 @@ void t_netstd_generator::generate_netstd_deepcopy_method(ostream& out, t_struct* if(inline_assignment) { if( null_allowed || (!is_required)) { // = has isset indent_down(); - out << indent() << "};" << endl; + out << indent() << "};" << '\n'; inline_assignment = false; } } @@ -1134,7 +1134,7 @@ void t_netstd_generator::generate_netstd_deepcopy_method(ostream& out, t_struct* out << "(" << type_name(ttype) << ")"; } out << "this." << prop_name(*m_iter) << copy_op; - out << (inline_assignment ? "," : ";") << endl; + out << (inline_assignment ? "," : ";") << '\n'; generate_null_check_end( out, *m_iter); if( !is_required) { @@ -1144,29 +1144,29 @@ void t_netstd_generator::generate_netstd_deepcopy_method(ostream& out, t_struct* } out << "__isset." << get_isset_name(normalize_name((*m_iter)->get_name())); out << " = this.__isset." << get_isset_name(normalize_name((*m_iter)->get_name())); - out << (inline_assignment ? "," : ";") << endl; + out << (inline_assignment ? "," : ";") << '\n'; } } if(inline_assignment) { indent_down(); - out << indent() << "};" << endl; + out << indent() << "};" << '\n'; } - out << indent() << "return " << tmp_instance << ";" << endl; + out << indent() << "return " << tmp_instance << ";" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } void t_netstd_generator::generate_netstd_struct_reader(ostream& out, t_struct* tstruct) { - out << indent() << "public async global::System.Threading.Tasks.Task ReadAsync(TProtocol iprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl - << indent() << "{" << endl; + out << indent() << "public async global::System.Threading.Tasks.Task ReadAsync(TProtocol iprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "iprot.IncrementRecursionDepth();" << endl - << indent() << "try" << endl - << indent() << "{" << endl; + out << indent() << "iprot.IncrementRecursionDepth();" << '\n' + << indent() << "try" << '\n' + << indent() << "{" << '\n'; indent_up(); const vector& fields = tstruct->get_members(); @@ -1177,90 +1177,90 @@ void t_netstd_generator::generate_netstd_struct_reader(ostream& out, t_struct* t { if (field_is_required(*f_iter)) { - out << indent() << "bool isset_" << (*f_iter)->get_name() << " = false;" << endl; + out << indent() << "bool isset_" << (*f_iter)->get_name() << " = false;" << '\n'; } } - out << indent() << "TField field;" << endl - << indent() << "await iprot.ReadStructBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "while (true)" << endl - << indent() << "{" << endl; + out << indent() << "TField field;" << '\n' + << indent() << "await iprot.ReadStructBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "while (true)" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "field = await iprot.ReadFieldBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "if (field.Type == TType.Stop)" << endl - << indent() << "{" << endl; + out << indent() << "field = await iprot.ReadFieldBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "if (field.Type == TType.Stop)" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "break;" << endl; + out << indent() << "break;" << '\n'; indent_down(); - out << indent() << "}" << endl << endl - << indent() << "switch (field.ID)" << endl - << indent() << "{" << endl; + out << indent() << "}" << '\n' << '\n' + << indent() << "switch (field.ID)" << '\n' + << indent() << "{" << '\n'; indent_up(); for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool is_required = field_is_required(*f_iter); - out << indent() << "case " << (*f_iter)->get_key() << ":" << endl; + out << indent() << "case " << (*f_iter)->get_key() << ":" << '\n'; indent_up(); - out << indent() << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ")" << endl - << indent() << "{" << endl; + out << indent() << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ")" << '\n' + << indent() << "{" << '\n'; indent_up(); generate_deserialize_field(out, *f_iter); if (is_required) { - out << indent() << "isset_" << (*f_iter)->get_name() << " = true;" << endl; + out << indent() << "isset_" << (*f_iter)->get_name() << " = true;" << '\n'; } indent_down(); - out << indent() << "}" << endl - << indent() << "else" << endl - << indent() << "{" << endl; + out << indent() << "}" << '\n' + << indent() << "else" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" << '\n'; indent_down(); - out << indent() << "}" << endl - << indent() << "break;" << endl; + out << indent() << "}" << '\n' + << indent() << "break;" << '\n'; indent_down(); } - out << indent() << "default: " << endl; + out << indent() << "default: " << '\n'; indent_up(); - out << indent() << "await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "break;" << endl; + out << indent() << "await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "break;" << '\n'; indent_down(); indent_down(); - out << indent() << "}" << endl - << endl - << indent() << "await iprot.ReadFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "}" << '\n' + << '\n' + << indent() << "await iprot.ReadFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; indent_down(); - out << indent() << "}" << endl - << endl - << indent() << "await iprot.ReadStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "}" << '\n' + << '\n' + << indent() << "await iprot.ReadStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if (field_is_required((*f_iter))) { - out << indent() << "if (!isset_" << (*f_iter)->get_name() << ")" << endl - << indent() << "{" << endl; + out << indent() << "if (!isset_" << (*f_iter)->get_name() << ")" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "throw new TProtocolException(TProtocolException.INVALID_DATA);" << endl; + out << indent() << "throw new TProtocolException(TProtocolException.INVALID_DATA);" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } indent_down(); - out << indent() << "}" << endl; - out << indent() << "finally" << endl - << indent() << "{" << endl; + out << indent() << "}" << '\n'; + out << indent() << "finally" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "iprot.DecrementRecursionDepth();" << endl; + out << indent() << "iprot.DecrementRecursionDepth();" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } @@ -1284,8 +1284,8 @@ void t_netstd_generator::generate_null_check_begin(ostream& out, t_field* tfield out << "__isset." << get_isset_name(normalize_name(tfield->get_name())); } - out << ")" << endl - << indent() << "{" << endl; + out << ")" << '\n' + << indent() << "{" << '\n'; indent_up(); } } @@ -1297,19 +1297,19 @@ void t_netstd_generator::generate_null_check_end(ostream& out, t_field* tfield) if( null_allowed || (!is_required)) { indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } void t_netstd_generator::generate_netstd_struct_writer(ostream& out, t_struct* tstruct) { - out << indent() << "public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl - << indent() << "{" << endl; + out << indent() << "public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "oprot.IncrementRecursionDepth();" << endl - << indent() << "try" << endl - << indent() << "{" << endl; + out << indent() << "oprot.IncrementRecursionDepth();" << '\n' + << indent() << "try" << '\n' + << indent() << "{" << '\n'; indent_up(); string name = tstruct->get_name(); @@ -1317,57 +1317,57 @@ void t_netstd_generator::generate_netstd_struct_writer(ostream& out, t_struct* t vector::const_iterator f_iter; string tmpvar = tmp("tmp"); - out << indent() << "var " << tmpvar << " = new TStruct(\"" << name << "\");" << endl - << indent() << "await oprot.WriteStructBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "var " << tmpvar << " = new TStruct(\"" << name << "\");" << '\n' + << indent() << "await oprot.WriteStructBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << '\n'; if (fields.size() > 0) { tmpvar = tmp("tmp"); if(target_net_version >= 8) { - out << indent() << "#pragma warning disable IDE0017 // simplified init" << endl; + out << indent() << "#pragma warning disable IDE0017 // simplified init" << '\n'; } - out << indent() << "var " << tmpvar << " = new TField();" << endl; + out << indent() << "var " << tmpvar << " = new TField();" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { generate_null_check_begin( out, *f_iter); - out << indent() << tmpvar << ".Name = \"" << (*f_iter)->get_name() << "\";" << endl - << indent() << tmpvar << ".Type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl - << indent() << tmpvar << ".ID = " << (*f_iter)->get_key() << ";" << endl - << indent() << "await oprot.WriteFieldBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << tmpvar << ".Name = \"" << (*f_iter)->get_name() << "\";" << '\n' + << indent() << tmpvar << ".Type = " << type_to_enum((*f_iter)->get_type()) << ";" << '\n' + << indent() << tmpvar << ".ID = " << (*f_iter)->get_key() << ";" << '\n' + << indent() << "await oprot.WriteFieldBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << '\n'; generate_serialize_field(out, *f_iter); - out << indent() << "await oprot.WriteFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await oprot.WriteFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; generate_null_check_end(out, *f_iter); } if(target_net_version >= 8) { - out << indent() << "#pragma warning restore IDE0017 // simplified init" << endl; + out << indent() << "#pragma warning restore IDE0017 // simplified init" << '\n'; } } - out << indent() << "await oprot.WriteFieldStopAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await oprot.WriteStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await oprot.WriteFieldStopAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await oprot.WriteStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; indent_down(); - out << indent() << "}" << endl - << indent() << "finally" << endl - << indent() << "{" << endl; + out << indent() << "}" << '\n' + << indent() << "finally" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "oprot.DecrementRecursionDepth();" << endl; + out << indent() << "oprot.DecrementRecursionDepth();" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } void t_netstd_generator::generate_netstd_struct_result_writer(ostream& out, t_struct* tstruct) { - out << indent() << "public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl - << indent() << "{" << endl; + out << indent() << "public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "oprot.IncrementRecursionDepth();" << endl - << indent() << "try" << endl - << indent() << "{" << endl; + out << indent() << "oprot.IncrementRecursionDepth();" << '\n' + << indent() << "try" << '\n' + << indent() << "{" << '\n'; indent_up(); string name = tstruct->get_name(); @@ -1375,85 +1375,85 @@ void t_netstd_generator::generate_netstd_struct_result_writer(ostream& out, t_st vector::const_iterator f_iter; string tmpvar = tmp("tmp"); - out << indent() << "var " << tmpvar << " = new TStruct(\"" << name << "\");" << endl - << indent() << "await oprot.WriteStructBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "var " << tmpvar << " = new TStruct(\"" << name << "\");" << '\n' + << indent() << "await oprot.WriteStructBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << '\n'; if (fields.size() > 0) { tmpvar = tmp("tmp"); if(target_net_version >= 8) { - out << indent() << "#pragma warning disable IDE0017 // simplified init" << endl; + out << indent() << "#pragma warning disable IDE0017 // simplified init" << '\n'; } - out << indent() << "var " << tmpvar << " = new TField();" << endl; + out << indent() << "var " << tmpvar << " = new TField();" << '\n'; bool first = true; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if (first) { first = false; - out << endl << indent() << "if"; + out << '\n' << indent() << "if"; } else { out << indent() << "else if"; } - out << "(this.__isset." << get_isset_name(normalize_name((*f_iter)->get_name())) << ")" << endl - << indent() << "{" << endl; + out << "(this.__isset." << get_isset_name(normalize_name((*f_iter)->get_name())) << ")" << '\n' + << indent() << "{" << '\n'; indent_up(); bool null_allowed = type_can_be_null((*f_iter)->get_type()); if (null_allowed) { - out << indent() << "if (" << prop_name(*f_iter) << " != null)" << endl - << indent() << "{" << endl; + out << indent() << "if (" << prop_name(*f_iter) << " != null)" << '\n' + << indent() << "{" << '\n'; indent_up(); } - out << indent() << tmpvar << ".Name = \"" << prop_name(*f_iter) << "\";" << endl - << indent() << tmpvar << ".Type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl - << indent() << tmpvar << ".ID = " << (*f_iter)->get_key() << ";" << endl - << indent() << "await oprot.WriteFieldBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << tmpvar << ".Name = \"" << prop_name(*f_iter) << "\";" << '\n' + << indent() << tmpvar << ".Type = " << type_to_enum((*f_iter)->get_type()) << ";" << '\n' + << indent() << tmpvar << ".ID = " << (*f_iter)->get_key() << ";" << '\n' + << indent() << "await oprot.WriteFieldBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << '\n'; generate_serialize_field(out, *f_iter); - out << indent() << "await oprot.WriteFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await oprot.WriteFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; if (null_allowed) { indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } if(target_net_version >= 8) { - out << indent() << "#pragma warning restore IDE0017 // simplified init" << endl; + out << indent() << "#pragma warning restore IDE0017 // simplified init" << '\n'; } } - out << indent() << "await oprot.WriteFieldStopAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await oprot.WriteStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await oprot.WriteFieldStopAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await oprot.WriteStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; indent_down(); - out << indent() << "}" << endl - << indent() << "finally" << endl - << indent() << "{" << endl; + out << indent() << "}" << '\n' + << indent() << "finally" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "oprot.DecrementRecursionDepth();" << endl; + out << indent() << "oprot.DecrementRecursionDepth();" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } void t_netstd_generator::generate_netstd_struct_tostring(ostream& out, t_struct* tstruct) { string tmpvar = tmp("tmp"); - out << indent() << "public override string ToString()" << endl - << indent() << "{" << endl; + out << indent() << "public override string ToString()" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "var " << tmpvar << " = new StringBuilder(\"" << tstruct->get_name() << "(\");" << endl; + out << indent() << "var " << tmpvar << " = new StringBuilder(\"" << tstruct->get_name() << "(\");" << '\n'; const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; @@ -1464,7 +1464,7 @@ void t_netstd_generator::generate_netstd_struct_tostring(ostream& out, t_struct* { if (!field_is_required((*f_iter))) { - out << indent() << "int " << tmp_count.c_str() << " = 0;" << endl; + out << indent() << "int " << tmp_count.c_str() << " = 0;" << '\n'; useFirstFlag = true; } break; @@ -1479,15 +1479,15 @@ void t_netstd_generator::generate_netstd_struct_tostring(ostream& out, t_struct* if (useFirstFlag && (!had_required)) { - out << indent() << "if(0 < " << tmp_count.c_str() << (is_required ? "" : "++") << ") { " << tmpvar << ".Append(\", \"); }" << endl; - out << indent() << tmpvar << ".Append(\"" << prop_name(*f_iter) << ": \");" << endl; + out << indent() << "if(0 < " << tmp_count.c_str() << (is_required ? "" : "++") << ") { " << tmpvar << ".Append(\", \"); }" << '\n'; + out << indent() << tmpvar << ".Append(\"" << prop_name(*f_iter) << ": \");" << '\n'; } else { - out << indent() << tmpvar << ".Append(\", " << prop_name(*f_iter) << ": \");" << endl; + out << indent() << tmpvar << ".Append(\", " << prop_name(*f_iter) << ": \");" << '\n'; } - out << indent() << prop_name(*f_iter) << ".ToString(" << tmpvar << ");" << endl; + out << indent() << prop_name(*f_iter) << ".ToString(" << tmpvar << ");" << '\n'; generate_null_check_end(out, *f_iter); if (is_required) { @@ -1495,10 +1495,10 @@ void t_netstd_generator::generate_netstd_struct_tostring(ostream& out, t_struct* } } - out << indent() << tmpvar << ".Append(')');" << endl - << indent() << "return " << tmpvar << ".ToString();" << endl; + out << indent() << tmpvar << ".Append(')');" << '\n' + << indent() << "return " << tmpvar << ".ToString();" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } void t_netstd_generator::generate_netstd_union(t_struct* tunion) @@ -1511,7 +1511,7 @@ void t_netstd_generator::generate_netstd_union(t_struct* tunion) f_union.open(f_union_name.c_str()); reset_indent(); - f_union << autogen_comment() << netstd_type_usings() << netstd_thrift_usings() << endl << endl; + f_union << autogen_comment() << netstd_type_usings() << netstd_thrift_usings() << '\n' << '\n'; pragmas_and_directives(f_union); generate_netstd_union_definition(f_union, tunion); @@ -1526,75 +1526,75 @@ void t_netstd_generator::generate_netstd_union_definition(ostream& out, t_struct // Let's define the class first start_netstd_namespace(out); - out << indent() << "public abstract partial class " << normalize_name(tunion->get_name()) << " : TUnionBase" << endl; - out << indent() << "{" << endl; + out << indent() << "public abstract partial class " << normalize_name(tunion->get_name()) << " : TUnionBase" << '\n'; + out << indent() << "{" << '\n'; indent_up(); - out << indent() << "public abstract global::System.Threading.Tasks.Task WriteAsync(TProtocol tProtocol, CancellationToken " << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "public readonly int Isset;" << endl - << indent() << "public abstract object" << nullable_suffix() <<" Data { get; }" << endl - << indent() << "protected " << normalize_name(tunion->get_name()) << "(int isset)" << endl - << indent() << "{" << endl; + out << indent() << "public abstract global::System.Threading.Tasks.Task WriteAsync(TProtocol tProtocol, CancellationToken " << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "public readonly int Isset;" << '\n' + << indent() << "public abstract object" << nullable_suffix() <<" Data { get; }" << '\n' + << indent() << "protected " << normalize_name(tunion->get_name()) << "(int isset)" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "Isset = isset;" << endl; + out << indent() << "Isset = isset;" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; const vector& fields = tunion->get_members(); vector::const_iterator f_iter; - out << indent() << "public override bool Equals(object" << nullable_suffix() << " that)" << endl; + out << indent() << "public override bool Equals(object" << nullable_suffix() << " that)" << '\n'; scope_up(out); if( target_net_version >= 6) { - out << indent() << "if (that is not " << tunion->get_name() << " other) return false;" << endl; + out << indent() << "if (that is not " << tunion->get_name() << " other) return false;" << '\n'; } else { - out << indent() << "if (!(that is " << tunion->get_name() << " other)) return false;" << endl; + out << indent() << "if (!(that is " << tunion->get_name() << " other)) return false;" << '\n'; } - out << indent() << "if (ReferenceEquals(this, other)) return true;" << endl; - out << endl; - out << indent() << "if(this.Isset != other.Isset) return false;" << endl; - out << endl; + out << indent() << "if (ReferenceEquals(this, other)) return true;" << '\n'; + out << '\n'; + out << indent() << "if(this.Isset != other.Isset) return false;" << '\n'; + out << '\n'; if(target_net_version >= 6) { - out << indent() << "return Isset switch" << endl; + out << indent() << "return Isset switch" << '\n'; scope_up(out); for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool needs_typecast = false; string suffix(""); get_deep_copy_method_call((*f_iter)->get_type(), false, needs_typecast, suffix); - out << indent() << (*f_iter)->get_key() << " => Equals(As_" << (*f_iter)->get_name() << ", other.As_" << (*f_iter)->get_name() << ")," << endl; + out << indent() << (*f_iter)->get_key() << " => Equals(As_" << (*f_iter)->get_name() << ", other.As_" << (*f_iter)->get_name() << ")," << '\n'; } - out << indent() << "_ => true," << endl; + out << indent() << "_ => true," << '\n'; indent_down(); - out << indent() << "};" << endl; + out << indent() << "};" << '\n'; } else { - out << indent() << "switch (Isset)" << endl; + out << indent() << "switch (Isset)" << '\n'; scope_up(out); for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool needs_typecast = false; string suffix(""); get_deep_copy_method_call((*f_iter)->get_type(), false, needs_typecast, suffix); - out << indent() << "case " << (*f_iter)->get_key() << ":" << endl; + out << indent() << "case " << (*f_iter)->get_key() << ":" << '\n'; indent_up(); - out << indent() << "return Equals(As_" << (*f_iter)->get_name() << ", other.As_" << (*f_iter)->get_name() << ");" << endl; + out << indent() << "return Equals(As_" << (*f_iter)->get_name() << ", other.As_" << (*f_iter)->get_name() << ");" << '\n'; indent_down(); } - out << indent() << "default:" << endl; + out << indent() << "default:" << '\n'; indent_up(); - out << indent() << "return true;" << endl; + out << indent() << "return true;" << '\n'; indent_down(); scope_down(out); } scope_down(out); - out << endl; + out << '\n'; - out << indent() << "public override int GetHashCode()" << endl; - out << indent() << "{" << endl; + out << indent() << "public override int GetHashCode()" << '\n'; + out << indent() << "{" << '\n'; indent_up(); if(target_net_version >= 6) { - out << indent() << "return Isset switch" << endl; - out << indent() << "{" << endl; + out << indent() << "return Isset switch" << '\n'; + out << indent() << "{" << '\n'; indent_up(); for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { @@ -1603,108 +1603,108 @@ void t_netstd_generator::generate_netstd_union_definition(ostream& out, t_struct if( null_coalesce.size() > 0) { out << " ?? 0"; } - out << "," << endl; + out << "," << '\n'; } - out << indent() << "_ => (new ___undefined()).GetHashCode()" << endl; + out << indent() << "_ => (new ___undefined()).GetHashCode()" << '\n'; indent_down(); - out << indent() << "};" << endl; + out << indent() << "};" << '\n'; } else { - out << indent() << "switch (Isset)" << endl; - out << indent() << "{" << endl; + out << indent() << "switch (Isset)" << '\n'; + out << indent() << "{" << '\n'; indent_up(); for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { string null_coalesce(is_nullable_type((*f_iter)->get_type()) ? "?" : ""); - out << indent() << "case " << (*f_iter)->get_key() << ":" << endl; + out << indent() << "case " << (*f_iter)->get_key() << ":" << '\n'; indent_up(); out << indent() << "return As_" << (*f_iter)->get_name() << null_coalesce << ".GetHashCode()"; if( null_coalesce.size() > 0) { out << " ?? 0"; } - out << ";" << endl; + out << ";" << '\n'; indent_down(); } - out << indent() << "default:" << endl; + out << indent() << "default:" << '\n'; indent_up(); - out << indent() << "return (new ___undefined()).GetHashCode();" << endl; + out << indent() << "return (new ___undefined()).GetHashCode();" << '\n'; indent_down(); indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; if( ! suppress_deepcopy) { - out << indent() << "public " << tunion->get_name() << " " << DEEP_COPY_METHOD_NAME << "()" << endl; - out << indent() << "{" << endl; + out << indent() << "public " << tunion->get_name() << " " << DEEP_COPY_METHOD_NAME << "()" << '\n'; + out << indent() << "{" << '\n'; indent_up(); if(target_net_version >= 6) { - out << indent() << "return Isset switch" << endl; - out << indent() << "{" << endl; + out << indent() << "return Isset switch" << '\n'; + out << indent() << "{" << '\n'; indent_up(); for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool needs_typecast = false; string suffix(""); string copy_op = get_deep_copy_method_call((*f_iter)->get_type(), false, needs_typecast, suffix); - out << indent() << (*f_iter)->get_key() << " => new " << (*f_iter)->get_name() << "(As_" << (*f_iter)->get_name() << suffix << copy_op << ")," << endl; + out << indent() << (*f_iter)->get_key() << " => new " << (*f_iter)->get_name() << "(As_" << (*f_iter)->get_name() << suffix << copy_op << ")," << '\n'; } - out << indent() << "_ => new ___undefined()" << endl; + out << indent() << "_ => new ___undefined()" << '\n'; indent_down(); - out << indent() << "};" << endl; + out << indent() << "};" << '\n'; } else { - out << indent() << "switch (Isset)" << endl; - out << indent() << "{" << endl; + out << indent() << "switch (Isset)" << '\n'; + out << indent() << "{" << '\n'; indent_up(); for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool needs_typecast = false; string suffix(""); string copy_op = get_deep_copy_method_call((*f_iter)->get_type(), false, needs_typecast, suffix); - out << indent() << "case " << (*f_iter)->get_key() << ":" << endl; + out << indent() << "case " << (*f_iter)->get_key() << ":" << '\n'; indent_up(); - out << indent() << "return new " << (*f_iter)->get_name() << "(As_" << (*f_iter)->get_name() << suffix << copy_op << ");" << endl; + out << indent() << "return new " << (*f_iter)->get_name() << "(As_" << (*f_iter)->get_name() << suffix << copy_op << ");" << '\n'; indent_down(); } - out << indent() << "default:" << endl; + out << indent() << "default:" << '\n'; indent_up(); - out << indent() << "return new ___undefined();" << endl; + out << indent() << "return new ___undefined();" << '\n'; indent_down(); indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } - out << indent() << "public class ___undefined : " << tunion->get_name() << endl; - out << indent() << "{" << endl; + out << indent() << "public class ___undefined : " << tunion->get_name() << '\n'; + out << indent() << "{" << '\n'; indent_up(); - out << indent() << "public override object" << nullable_suffix() <<" Data { get { return null; } }" << endl - << indent() << "public ___undefined() : base(0) {}" << endl << endl; + out << indent() << "public override object" << nullable_suffix() <<" Data { get { return null; } }" << '\n' + << indent() << "public ___undefined() : base(0) {}" << '\n' << '\n'; if( ! suppress_deepcopy) { - out << indent() << "public new ___undefined " << DEEP_COPY_METHOD_NAME << "()" << endl; - out << indent() << "{" << endl; + out << indent() << "public new ___undefined " << DEEP_COPY_METHOD_NAME << "()" << '\n'; + out << indent() << "{" << '\n'; indent_up(); - out << indent() << "return new ___undefined();" << endl; + out << indent() << "return new ___undefined();" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } t_struct undefined_struct(program_,"___undefined"); generate_netstd_struct_equals(out, &undefined_struct); generate_netstd_struct_hashcode(out, &undefined_struct); - out << indent() << "public override global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl - << indent() << "{" << endl; + out << indent() << "public override global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "throw new TProtocolException( TProtocolException.INVALID_DATA, \"Cannot persist an union type which is not set.\");" << endl; + out << indent() << "throw new TProtocolException( TProtocolException.INVALID_DATA, \"Cannot persist an union type which is not set.\");" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { @@ -1714,128 +1714,128 @@ void t_netstd_generator::generate_netstd_union_definition(ostream& out, t_struct generate_netstd_union_reader(out, tunion); indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; end_netstd_namespace(out); } void t_netstd_generator::generate_netstd_union_class(ostream& out, t_struct* tunion, t_field* tfield) { - out << indent() << "public " << type_name(tfield->get_type()) << nullable_field_suffix(tfield) << " As_" << tfield->get_name() << endl; - out << indent() << "{" << endl; + out << indent() << "public " << type_name(tfield->get_type()) << nullable_field_suffix(tfield) << " As_" << tfield->get_name() << '\n'; + out << indent() << "{" << '\n'; indent_up(); - out << indent() << "get" << endl; - out << indent() << "{" << endl; + out << indent() << "get" << '\n'; + out << indent() << "{" << '\n'; indent_up(); out << indent() << "return (" << tfield->get_key() << " == Isset) && (Data != null)" << " ? (" << type_name(tfield->get_type()) << nullable_field_suffix(tfield) << ")Data" << " : default" << (target_net_version >= 6 ? "" : ("(" + type_name(tfield->get_type()) + ")")) - << ";" << endl; + << ";" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl - << endl; + out << indent() << "}" << '\n' + << '\n'; - out << indent() << "public class " << normalize_name(tfield->get_name()) << " : " << normalize_name(tunion->get_name()) << endl; - out << indent() << "{" << endl; + out << indent() << "public class " << normalize_name(tfield->get_name()) << " : " << normalize_name(tunion->get_name()) << '\n'; + out << indent() << "{" << '\n'; indent_up(); - out << indent() << "private readonly " << type_name(tfield->get_type()) << " _data;" << endl - << indent() << "public override object" << nullable_suffix() <<" Data { get { return _data; } }" << endl - << indent() << "public " << normalize_name(tfield->get_name()) << "(" << type_name(tfield->get_type()) << " data) : base("<< tfield->get_key() <<")" << endl - << indent() << "{" << endl; + out << indent() << "private readonly " << type_name(tfield->get_type()) << " _data;" << '\n' + << indent() << "public override object" << nullable_suffix() <<" Data { get { return _data; } }" << '\n' + << indent() << "public " << normalize_name(tfield->get_name()) << "(" << type_name(tfield->get_type()) << " data) : base("<< tfield->get_key() <<")" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "this._data = data;" << endl; + out << indent() << "this._data = data;" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; if( ! suppress_deepcopy) { - out << indent() << "public new " << normalize_name(tfield->get_name()) << " " << DEEP_COPY_METHOD_NAME << "()" << endl; - out << indent() << "{" << endl; + out << indent() << "public new " << normalize_name(tfield->get_name()) << " " << DEEP_COPY_METHOD_NAME << "()" << '\n'; + out << indent() << "{" << '\n'; indent_up(); bool needs_typecast = false; string suffix(""); string copy_op = get_deep_copy_method_call(tfield->get_type(), true, needs_typecast, suffix); - out << indent() << "return new " << normalize_name(tfield->get_name()) << "(_data" << copy_op << ");" << endl; + out << indent() << "return new " << normalize_name(tfield->get_name()) << "(_data" << copy_op << ");" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } - out << indent() << "public override bool Equals(object" << nullable_suffix() << " that)" << endl; - out << indent() << "{" << endl; + out << indent() << "public override bool Equals(object" << nullable_suffix() << " that)" << '\n'; + out << indent() << "{" << '\n'; indent_up(); if(target_net_version >= 6) { - out << indent() << "if (that is not " << tunion->get_name() << " other) return false;" << endl; + out << indent() << "if (that is not " << tunion->get_name() << " other) return false;" << '\n'; } else { - out << indent() << "if (!(that is " << tunion->get_name() << " other)) return false;" << endl; + out << indent() << "if (!(that is " << tunion->get_name() << " other)) return false;" << '\n'; } - out << indent() << "if (ReferenceEquals(this, other)) return true;" << endl; - out << endl; - out << indent() << "return Equals( _data, other.As_" << tfield->get_name() << ");" << endl; + out << indent() << "if (ReferenceEquals(this, other)) return true;" << '\n'; + out << '\n'; + out << indent() << "return Equals( _data, other.As_" << tfield->get_name() << ");" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; - out << indent() << "public override int GetHashCode()" << endl; - out << indent() << "{" << endl; + out << indent() << "public override int GetHashCode()" << '\n'; + out << indent() << "{" << '\n'; indent_up(); - out << indent() << "return _data.GetHashCode();" << endl; + out << indent() << "return _data.GetHashCode();" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; - out << indent() << "public override async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ") {" << endl; + out << indent() << "public override async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ") {" << '\n'; indent_up(); - out << indent() << "oprot.IncrementRecursionDepth();" << endl - << indent() << "try" << endl - << indent() << "{" << endl; + out << indent() << "oprot.IncrementRecursionDepth();" << '\n' + << indent() << "try" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "var struc = new TStruct(\"" << tunion->get_name() << "\");" << endl - << indent() << "await oprot.WriteStructBeginAsync(struc, " << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "var struc = new TStruct(\"" << tunion->get_name() << "\");" << '\n' + << indent() << "await oprot.WriteStructBeginAsync(struc, " << CANCELLATION_TOKEN_NAME << ");" << '\n'; - out << indent() << "var field = new TField()" << endl; - out << indent() << "{" << endl; + out << indent() << "var field = new TField()" << '\n'; + out << indent() << "{" << '\n'; indent_up(); - out << indent() << "Name = \"" << tfield->get_name() << "\"," << endl - << indent() << "Type = " << type_to_enum(tfield->get_type()) << "," << endl - << indent() << "ID = " << tfield->get_key() << endl; + out << indent() << "Name = \"" << tfield->get_name() << "\"," << '\n' + << indent() << "Type = " << type_to_enum(tfield->get_type()) << "," << '\n' + << indent() << "ID = " << tfield->get_key() << '\n'; indent_down(); - out << indent() << "};" << endl; - out << indent() << "await oprot.WriteFieldBeginAsync(field, " << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "};" << '\n'; + out << indent() << "await oprot.WriteFieldBeginAsync(field, " << CANCELLATION_TOKEN_NAME << ");" << '\n'; generate_serialize_field(out, tfield, "_data", true, false); - out << indent() << "await oprot.WriteFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await oprot.WriteFieldStopAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await oprot.WriteStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await oprot.WriteFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await oprot.WriteFieldStopAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await oprot.WriteStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; indent_down(); - out << indent() << "}" << endl - << indent() << "finally" << endl - << indent() << "{" << endl; + out << indent() << "}" << '\n' + << indent() << "finally" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "oprot.DecrementRecursionDepth();" << endl; + out << indent() << "oprot.DecrementRecursionDepth();" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } void t_netstd_generator::generate_netstd_struct_equals(ostream& out, t_struct* tstruct) { - out << indent() << "public override bool Equals(object" << nullable_suffix() << " that)" << endl - << indent() << "{" << endl; + out << indent() << "public override bool Equals(object" << nullable_suffix() << " that)" << '\n' + << indent() << "{" << '\n'; indent_up(); if(target_net_version >= 6) { - out << indent() << "if (that is not " << type_name(tstruct,false) << " other) return false;" << endl; + out << indent() << "if (that is not " << type_name(tstruct,false) << " other) return false;" << '\n'; } else { - out << indent() << "if (!(that is " << type_name(tstruct,false) << " other)) return false;" << endl; + out << indent() << "if (!(that is " << type_name(tstruct,false) << " other)) return false;" << '\n'; } - out << indent() << "if (ReferenceEquals(this, other)) return true;" << endl; + out << indent() << "if (ReferenceEquals(this, other)) return true;" << '\n'; const vector& fields = tstruct->get_members(); @@ -1853,7 +1853,7 @@ void t_netstd_generator::generate_netstd_struct_equals(ostream& out, t_struct* t } else { - out << endl; + out << '\n'; out << indent() << "&& "; } if (!field_is_required((*f_iter))) @@ -1879,25 +1879,25 @@ void t_netstd_generator::generate_netstd_struct_equals(ostream& out, t_struct* t } if (first) { - out << indent() << "return true;" << endl; + out << indent() << "return true;" << '\n'; } else { - out << ";" << endl; + out << ";" << '\n'; indent_down(); } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } void t_netstd_generator::generate_netstd_struct_hashcode(ostream& out, t_struct* tstruct) { - out << indent() << "public override int GetHashCode() {" << endl; + out << indent() << "public override int GetHashCode() {" << '\n'; indent_up(); - out << indent() << "int hashcode = 157;" << endl; - out << indent() << "unchecked {" << endl; + out << indent() << "int hashcode = 157;" << '\n'; + out << indent() << "unchecked {" << '\n'; indent_up(); const vector& fields = tstruct->get_members(); @@ -1915,17 +1915,17 @@ void t_netstd_generator::generate_netstd_struct_hashcode(ostream& out, t_struct* else { out << prop_name(*f_iter) << ".GetHashCode()"; } - out << ";" << endl; + out << ";" << '\n'; generate_null_check_end(out, *f_iter); } indent_down(); - out << indent() << "}" << endl; - out << indent() << "return hashcode;" << endl; + out << indent() << "}" << '\n'; + out << indent() << "return hashcode;" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } void t_netstd_generator::generate_service(t_service* tservice) @@ -1937,13 +1937,13 @@ void t_netstd_generator::generate_service(t_service* tservice) f_service.open(f_service_name.c_str()); reset_indent(); - f_service << autogen_comment() << netstd_type_usings() << netstd_thrift_usings() << endl << endl; + f_service << autogen_comment() << netstd_type_usings() << netstd_thrift_usings() << '\n' << '\n'; pragmas_and_directives(f_service); start_netstd_namespace(f_service); - f_service << indent() << "public partial class " << normalize_name(service_name_) << endl - << indent() << "{" << endl; + f_service << indent() << "public partial class " << normalize_name(service_name_) << '\n' + << indent() << "{" << '\n'; indent_up(); generate_service_interface(f_service, tservice); @@ -1952,7 +1952,7 @@ void t_netstd_generator::generate_service(t_service* tservice) generate_service_helpers(f_service, tservice); indent_down(); - f_service << indent() << "}" << endl; + f_service << indent() << "}" << '\n'; end_netstd_namespace(f_service); f_service.close(); @@ -1970,18 +1970,18 @@ void t_netstd_generator::generate_service_interface(ostream& out, t_service* tse extends_iface = " : " + extends + ".IAsync"; } - //out << endl << endl; + //out << '\n' << '\n'; generate_netstd_doc(out, tservice); if (is_wcf_enabled()) { - out << indent() << "[ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl; + out << indent() << "[ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << '\n'; } prepare_member_name_mapping(tservice); - out << indent() << "public interface IAsync" << extends_iface << endl - << indent() << "{" << endl; + out << indent() << "public interface IAsync" << extends_iface << '\n' + << indent() << "{" << '\n'; indent_up(); vector functions = tservice->get_functions(); @@ -1993,21 +1993,21 @@ void t_netstd_generator::generate_service_interface(ostream& out, t_service* tse // if we're using WCF, add the corresponding attributes if (is_wcf_enabled()) { - out << indent() << "[OperationContract]" << endl; + out << indent() << "[OperationContract]" << '\n'; const vector& xceptions = (*f_iter)->get_xceptions()->get_members(); vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { - out << indent() << "[FaultContract(typeof(" + type_name((*x_iter)->get_type()) + "Fault))]" << endl; + out << indent() << "[FaultContract(typeof(" + type_name((*x_iter)->get_type()) + "Fault))]" << '\n'; } } generate_deprecation_attribute(out, *f_iter); - out << indent() << function_signature_async(*f_iter) << ";" << endl << endl; + out << indent() << function_signature_async(*f_iter) << ";" << '\n' << '\n'; } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; cleanup_member_name_mapping(tservice); } @@ -2020,7 +2020,7 @@ void t_netstd_generator::generate_deprecation_attribute(ostream& out, t_function if ((iter->second.back().length() > 0) && (iter->second.back() != "1")) { out << "(" << make_csharp_string_literal(iter->second.back()) << ")"; } - out << "]" << endl; + out << "]" << '\n'; } } @@ -2030,8 +2030,8 @@ void t_netstd_generator::generate_service_helpers(ostream& out, t_service* tserv vector::iterator f_iter; prepare_member_name_mapping(tservice); - out << indent() << "public class InternalStructs" << endl; - out << indent() << "{" << endl; + out << indent() << "public class InternalStructs" << '\n'; + out << indent() << "{" << '\n'; indent_up(); for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) @@ -2043,7 +2043,7 @@ void t_netstd_generator::generate_service_helpers(ostream& out, t_service* tserv } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; cleanup_member_name_mapping(tservice); } @@ -2061,22 +2061,22 @@ void t_netstd_generator::generate_service_client(ostream& out, t_service* tservi extends_client = "TBaseClient, IDisposable, "; } - out << endl; + out << '\n'; generate_netstd_doc(out, tservice); prepare_member_name_mapping(tservice); - out << indent() << "public class Client : " << extends_client << "IAsync" << endl - << indent() << "{" << endl; + out << indent() << "public class Client : " << extends_client << "IAsync" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "public Client(TProtocol protocol) : this(protocol, protocol)" << endl - << indent() << "{" << endl - << indent() << "}" << endl - << endl - << indent() << "public Client(TProtocol inputProtocol, TProtocol outputProtocol) : base(inputProtocol, outputProtocol)" << endl - << indent() << "{" << endl - << indent() << "}" << endl - << endl; + out << indent() << "public Client(TProtocol protocol) : this(protocol, protocol)" << '\n' + << indent() << "{" << '\n' + << indent() << "}" << '\n' + << '\n' + << indent() << "public Client(TProtocol inputProtocol, TProtocol outputProtocol) : base(inputProtocol, outputProtocol)" << '\n' + << indent() << "{" << '\n' + << indent() << "}" << '\n' + << '\n'; vector functions = tservice->get_functions(); vector::const_iterator functions_iterator; @@ -2088,26 +2088,26 @@ void t_netstd_generator::generate_service_client(ostream& out, t_service* tservi // async generate_deprecation_attribute(out, *functions_iterator); - out << indent() << "public async " << function_signature_async(*functions_iterator, "") << endl - << indent() << "{" << endl; + out << indent() << "public async " << function_signature_async(*functions_iterator, "") << '\n' + << indent() << "{" << '\n'; indent_up(); out << indent() << "await send_" << function_name << "("; string call_args = argument_list((*functions_iterator)->get_arglist(),false); if(! call_args.empty()) { out << call_args << ", "; } - out << CANCELLATION_TOKEN_NAME << ");" << endl; + out << CANCELLATION_TOKEN_NAME << ");" << '\n'; if(! (*functions_iterator)->is_oneway()) { out << indent() << ((*functions_iterator)->get_returntype()->is_void() ? "" : "return ") - << "await recv_" << function_name << "(" << CANCELLATION_TOKEN_NAME << ");" << endl; + << "await recv_" << function_name << "(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; // async send generate_deprecation_attribute(out, *functions_iterator); - out << indent() << "public async " << function_signature_async(*functions_iterator, "send_", MODE_NO_RETURN) << endl - << indent() << "{" << endl; + out << indent() << "public async " << function_signature_async(*functions_iterator, "send_", MODE_NO_RETURN) << '\n' + << indent() << "{" << '\n'; indent_up(); string tmpvar = tmp("tmp"); @@ -2115,9 +2115,9 @@ void t_netstd_generator::generate_service_client(ostream& out, t_service* tservi out << indent() << "await OutputProtocol.WriteMessageBeginAsync(new TMessage(\"" << raw_func_name << "\", TMessageType." << ((*functions_iterator)->is_oneway() ? "Oneway" : "Call") - << ", SeqId), " << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << endl - << indent() << "var " << tmpvar << " = new InternalStructs." << argsname << "() {" << endl; + << ", SeqId), " << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << '\n' + << indent() << "var " << tmpvar << " = new InternalStructs." << argsname << "() {" << '\n'; indent_up(); t_struct* arg_struct = (*functions_iterator)->get_arglist(); @@ -2128,27 +2128,27 @@ void t_netstd_generator::generate_service_client(ostream& out, t_service* tservi for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { - out << indent() << prop_name(*fld_iter) << " = " << normalize_name((*fld_iter)->get_name(),true) << "," << endl; + out << indent() << prop_name(*fld_iter) << " = " << normalize_name((*fld_iter)->get_name(),true) << "," << '\n'; } indent_down(); - out << indent() << "};" << endl; + out << indent() << "};" << '\n'; - out << indent() << endl - << indent() << "await " << tmpvar << ".WriteAsync(OutputProtocol, " << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await OutputProtocol.WriteMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await OutputProtocol.Transport.FlushAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << '\n' + << indent() << "await " << tmpvar << ".WriteAsync(OutputProtocol, " << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await OutputProtocol.WriteMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await OutputProtocol.Transport.FlushAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; if (!(*functions_iterator)->is_oneway()) { // async recv generate_deprecation_attribute(out, *functions_iterator); - out << indent() << "public async " << function_signature_async(*functions_iterator, "recv_", MODE_NO_ARGS) << endl - << indent() << "{" << endl; + out << indent() << "public async " << function_signature_async(*functions_iterator, "recv_", MODE_NO_ARGS) << '\n' + << indent() << "{" << '\n'; indent_up(); string resultname = (*functions_iterator)->get_name() + "_result"; @@ -2158,64 +2158,64 @@ void t_netstd_generator::generate_service_client(ostream& out, t_service* tservi prepare_member_name_mapping(xs, xs->get_members(), resultname); tmpvar = tmp("tmp"); - out << indent() << endl - << indent() << "var " << tmpvar << " = await InputProtocol.ReadMessageBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "if (" << tmpvar << ".Type == TMessageType.Exception)" << endl - << indent() << "{" << endl; + out << indent() << '\n' + << indent() << "var " << tmpvar << " = await InputProtocol.ReadMessageBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "if (" << tmpvar << ".Type == TMessageType.Exception)" << '\n' + << indent() << "{" << '\n'; indent_up(); tmpvar = tmp("tmp"); - out << indent() << "var " << tmpvar << " = await TApplicationException.ReadAsync(InputProtocol, " << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await InputProtocol.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "throw " << tmpvar << ";" << endl; + out << indent() << "var " << tmpvar << " = await TApplicationException.ReadAsync(InputProtocol, " << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await InputProtocol.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "throw " << tmpvar << ";" << '\n'; indent_down(); tmpvar = tmp("tmp"); - out << indent() << "}" << endl - << endl - << indent() << "var " << tmpvar << " = new InternalStructs." << resultname << "();" << endl - << indent() << "await " << tmpvar << ".ReadAsync(InputProtocol, " << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await InputProtocol.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "}" << '\n' + << '\n' + << indent() << "var " << tmpvar << " = new InternalStructs." << resultname << "();" << '\n' + << indent() << "await " << tmpvar << ".ReadAsync(InputProtocol, " << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await InputProtocol.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; if (!(*functions_iterator)->get_returntype()->is_void()) { - out << indent() << "if (" << tmpvar << ".__isset.success)" << endl - << indent() << "{" << endl; + out << indent() << "if (" << tmpvar << ".__isset.success)" << '\n' + << indent() << "{" << '\n'; indent_up(); string nullable_value = nullable_value_access((*functions_iterator)->get_returntype()); - out << indent() << "return " << tmpvar << ".Success" << nullable_value << ";" << endl; + out << indent() << "return " << tmpvar << ".Success" << nullable_value << ";" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } const vector& xceptions = xs->get_members(); vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { - out << indent() << "if (" << tmpvar << ".__isset." << get_isset_name(normalize_name((*x_iter)->get_name())) << ")" << endl - << indent() << "{" << endl; + out << indent() << "if (" << tmpvar << ".__isset." << get_isset_name(normalize_name((*x_iter)->get_name())) << ")" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "throw " << tmpvar << "." << prop_name(*x_iter) << nullable_value_access((*x_iter)->get_type()) << ";" << endl; + out << indent() << "throw " << tmpvar << "." << prop_name(*x_iter) << nullable_value_access((*x_iter)->get_type()) << ";" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } if (!(*functions_iterator)->get_returntype()->is_void()) { out << indent() << "throw new TApplicationException(TApplicationException.ExceptionType.MissingResult, \"" - << function_name << " failed: unknown result\");" << endl; + << function_name << " failed: unknown result\");" << '\n'; } cleanup_member_name_mapping(xs); indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } cleanup_member_name_mapping(arg_struct); } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; cleanup_member_name_mapping(tservice); } @@ -2233,14 +2233,14 @@ void t_netstd_generator::generate_service_server(ostream& out, t_service* tservi } prepare_member_name_mapping(tservice); - out << indent() << "public class AsyncProcessor : " << extends_processor << "ITAsyncProcessor" << endl - << indent() << "{" << endl; + out << indent() << "public class AsyncProcessor : " << extends_processor << "ITAsyncProcessor" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "private readonly IAsync _iAsync;" << endl - << indent() << "private readonly ILogger" << nullable_suffix() << " _logger;" << endl - << endl + out << indent() << "private readonly IAsync _iAsync;" << '\n' + << indent() << "private readonly ILogger" << nullable_suffix() << " _logger;" << '\n' + << '\n' << indent() << "public AsyncProcessor(IAsync iAsync, ILogger" << nullable_suffix() << " logger = default)"; if (!extends.empty()) @@ -2248,101 +2248,101 @@ void t_netstd_generator::generate_service_server(ostream& out, t_service* tservi out << " : base(iAsync)"; } - out << endl - << indent() << "{" << endl; + out << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "_iAsync = iAsync ?? throw new ArgumentNullException(nameof(iAsync));" << endl; - out << indent() << "_logger = logger;" << endl; + out << indent() << "_iAsync = iAsync ?? throw new ArgumentNullException(nameof(iAsync));" << '\n'; + out << indent() << "_logger = logger;" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { string raw_func_name = (*f_iter)->get_name(); - out << indent() << "processMap_[\"" << raw_func_name << "\"] = " << raw_func_name << "_ProcessAsync;" << endl; + out << indent() << "processMap_[\"" << raw_func_name << "\"] = " << raw_func_name << "_ProcessAsync;" << '\n'; } indent_down(); - out << indent() << "}" << endl - << endl; + out << indent() << "}" << '\n' + << '\n'; if (extends.empty()) { - out << indent() << "protected delegate global::System.Threading.Tasks.Task ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "protected delegate global::System.Threading.Tasks.Task ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ");" << '\n'; } if (extends.empty()) { out << indent() << "protected Dictionary processMap_ = "; if(target_net_version >= 8) { - out << "[];" << endl; + out << "[];" << '\n'; } else if(target_net_version >= 6) { - out << "new();" << endl; + out << "new();" << '\n'; } else { - out << "new Dictionary();" << endl; + out << "new Dictionary();" << '\n'; } } - out << endl; + out << '\n'; if (extends.empty()) { - out << indent() << "public async Task ProcessAsync(TProtocol iprot, TProtocol oprot)" << endl - << indent() << "{" << endl; + out << indent() << "public async Task ProcessAsync(TProtocol iprot, TProtocol oprot)" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "return await ProcessAsync(iprot, oprot, CancellationToken.None);" << endl; + out << indent() << "return await ProcessAsync(iprot, oprot, CancellationToken.None);" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; - out << indent() << "public async Task ProcessAsync(TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl; + out << indent() << "public async Task ProcessAsync(TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n'; } else { - out << indent() << "public new async Task ProcessAsync(TProtocol iprot, TProtocol oprot)" << endl - << indent() << "{" << endl; + out << indent() << "public new async Task ProcessAsync(TProtocol iprot, TProtocol oprot)" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "return await ProcessAsync(iprot, oprot, CancellationToken.None);" << endl; + out << indent() << "return await ProcessAsync(iprot, oprot, CancellationToken.None);" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; - out << indent() << "public new async Task ProcessAsync(TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl; + out << indent() << "public new async Task ProcessAsync(TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n'; } - out << indent() << "{" << endl; + out << indent() << "{" << '\n'; indent_up(); - out << indent() << "try" << endl - << indent() << "{" << endl; + out << indent() << "try" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "var msg = await iprot.ReadMessageBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << endl - << indent() << "processMap_.TryGetValue(msg.Name, out var fn);" << endl - << endl - << indent() << "if (fn == null)" << endl - << indent() << "{" << endl; + out << indent() << "var msg = await iprot.ReadMessageBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << '\n' + << indent() << "processMap_.TryGetValue(msg.Name, out var fn);" << '\n' + << '\n' + << indent() << "if (fn == null)" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "await TProtocolUtil.SkipAsync(iprot, TType.Struct, " << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await iprot.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "var x = new TApplicationException (TApplicationException.ExceptionType.UnknownMethod, \"Invalid method name: '\" + msg.Name + \"'\");" << endl - << indent() << "await oprot.WriteMessageBeginAsync(new TMessage(msg.Name, TMessageType.Exception, msg.SeqID), " << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await x.WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await oprot.WriteMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await oprot.Transport.FlushAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "return true;" << endl; + out << indent() << "await TProtocolUtil.SkipAsync(iprot, TType.Struct, " << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await iprot.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "var x = new TApplicationException (TApplicationException.ExceptionType.UnknownMethod, \"Invalid method name: '\" + msg.Name + \"'\");" << '\n' + << indent() << "await oprot.WriteMessageBeginAsync(new TMessage(msg.Name, TMessageType.Exception, msg.SeqID), " << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await x.WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await oprot.WriteMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await oprot.Transport.FlushAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "return true;" << '\n'; indent_down(); - out << indent() << "}" << endl - << endl - << indent() << "await fn(msg.SeqID, iprot, oprot, " << CANCELLATION_TOKEN_NAME << ");" << endl - << endl; + out << indent() << "}" << '\n' + << '\n' + << indent() << "await fn(msg.SeqID, iprot, oprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n' + << '\n'; indent_down(); - out << indent() << "}" << endl; - out << indent() << "catch (IOException)" << endl - << indent() << "{" << endl; + out << indent() << "}" << '\n'; + out << indent() << "catch (IOException)" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "return false;" << endl; + out << indent() << "return false;" << '\n'; indent_down(); - out << indent() << "}" << endl - << endl - << indent() << "return true;" << endl; + out << indent() << "}" << '\n' + << '\n' + << indent() << "return true;" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -2350,7 +2350,7 @@ void t_netstd_generator::generate_service_server(ostream& out, t_service* tservi } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; cleanup_member_name_mapping(tservice); } @@ -2384,26 +2384,26 @@ void t_netstd_generator::generate_process_function_async(ostream& out, t_service { (void)tservice; out << indent() << "public async global::System.Threading.Tasks.Task " << tfunction->get_name() - << "_ProcessAsync(int seqid, TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl - << indent() << "{" << endl; + << "_ProcessAsync(int seqid, TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n' + << indent() << "{" << '\n'; indent_up(); string argsname = tfunction->get_name() + "_args"; string resultname = tfunction->get_name() + "_result"; string args = tmp("tmp"); - out << indent() << "var " << args << " = new InternalStructs." << argsname << "();" << endl - << indent() << "await " << args << ".ReadAsync(iprot, " << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await iprot.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "var " << args << " = new InternalStructs." << argsname << "();" << '\n' + << indent() << "await " << args << ".ReadAsync(iprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await iprot.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; string tmpResult = tmp("tmp"); if (!tfunction->is_oneway()) { - out << indent() << "var " << tmpResult << " = new InternalStructs." << resultname << "();" << endl; + out << indent() << "var " << tmpResult << " = new InternalStructs." << resultname << "();" << '\n'; } - out << indent() << "try" << endl - << indent() << "{" << endl; + out << indent() << "try" << '\n' + << indent() << "{" << '\n'; indent_up(); t_struct* xs = tfunction->get_xceptions(); @@ -2411,8 +2411,8 @@ void t_netstd_generator::generate_process_function_async(ostream& out, t_service if (xceptions.size() > 0) { - out << indent() << "try" << endl - << indent() << "{" << endl; + out << indent() << "try" << '\n' + << indent() << "{" << '\n'; indent_up(); } @@ -2422,7 +2422,7 @@ void t_netstd_generator::generate_process_function_async(ostream& out, t_service bool is_deprecated = (tfunction->annotations_.end() != tfunction->annotations_.find("deprecated")); if( is_deprecated) { - out << indent() << "#pragma warning disable CS0618,CS0612" << endl; + out << indent() << "#pragma warning disable CS0618,CS0612" << '\n'; } out << indent(); @@ -2457,10 +2457,10 @@ void t_netstd_generator::generate_process_function_async(ostream& out, t_service out << ", "; } - out << "" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << "" << CANCELLATION_TOKEN_NAME << ");" << '\n'; if( is_deprecated) { - out << indent() << "#pragma warning restore CS0618,CS0612" << endl; + out << indent() << "#pragma warning restore CS0618,CS0612" << '\n'; } vector::const_iterator x_iter; @@ -2470,76 +2470,76 @@ void t_netstd_generator::generate_process_function_async(ostream& out, t_service if (xceptions.size() > 0) { indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { string tmpex = tmp("tmp"); - out << indent() << "catch (" << type_name((*x_iter)->get_type()) << " " << tmpex << ")" << endl - << indent() << "{" << endl; + out << indent() << "catch (" << type_name((*x_iter)->get_type()) << " " << tmpex << ")" << '\n' + << indent() << "{" << '\n'; if (!tfunction->is_oneway()) { indent_up(); - out << indent() << tmpResult << "." << prop_name(*x_iter) << " = " << tmpex << ";" << endl; + out << indent() << tmpResult << "." << prop_name(*x_iter) << " = " << tmpex << ";" << '\n'; indent_down(); } - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } if (!tfunction->is_oneway()) { out << indent() << "await oprot.WriteMessageBeginAsync(new TMessage(\"" - << tfunction->get_name() << "\", TMessageType.Reply, seqid), " << CANCELLATION_TOKEN_NAME << "); " << endl - << indent() << "await " << tmpResult << ".WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << endl; + << tfunction->get_name() << "\", TMessageType.Reply, seqid), " << CANCELLATION_TOKEN_NAME << "); " << '\n' + << indent() << "await " << tmpResult << ".WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n'; } indent_down(); cleanup_member_name_mapping(xs); string tmpex = tmp("tmp"); - out << indent() << "}" << endl - << indent() << "catch (TTransportException)" << endl - << indent() << "{" << endl - << indent() << " throw;" << endl - << indent() << "}" << endl - << indent() << "catch (Exception " << tmpex << ")" << endl - << indent() << "{" << endl; + out << indent() << "}" << '\n' + << indent() << "catch (TTransportException)" << '\n' + << indent() << "{" << '\n' + << indent() << " throw;" << '\n' + << indent() << "}" << '\n' + << indent() << "catch (Exception " << tmpex << ")" << '\n' + << indent() << "{" << '\n'; indent_up(); string tmpvar = tmp("tmp"); - out << indent() << "var " << tmpvar << " = $\"Error occurred in {GetType().FullName}: {" << tmpex << ".Message}\";" << endl; - out << indent() << "if(_logger != null)" << endl; + out << indent() << "var " << tmpvar << " = $\"Error occurred in {GetType().FullName}: {" << tmpex << ".Message}\";" << '\n'; + out << indent() << "if(_logger != null)" << '\n'; indent_up(); - out << indent() << "_logger.LogError(\"{Exception}, {Message}\", " << tmpex << ", " << tmpvar << ");" << endl; + out << indent() << "_logger.LogError(\"{Exception}, {Message}\", " << tmpex << ", " << tmpvar << ");" << '\n'; indent_down(); - out << indent() << "else" << endl; + out << indent() << "else" << '\n'; indent_up(); - out << indent() << "Console.Error.WriteLine(" << tmpvar << ");" << endl; + out << indent() << "Console.Error.WriteLine(" << tmpvar << ");" << '\n'; indent_down(); if (tfunction->is_oneway()) { indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } else { tmpvar = tmp("tmp"); - out << indent() << "var " << tmpvar << " = new TApplicationException(TApplicationException.ExceptionType.InternalError,\" Internal error.\");" << endl + out << indent() << "var " << tmpvar << " = new TApplicationException(TApplicationException.ExceptionType.InternalError,\" Internal error.\");" << '\n' << indent() << "await oprot.WriteMessageBeginAsync(new TMessage(\"" << tfunction->get_name() - << "\", TMessageType.Exception, seqid), " << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await " << tmpvar << ".WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << endl; + << "\", TMessageType.Exception, seqid), " << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await " << tmpvar << ".WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n'; indent_down(); - out << indent() << "}" << endl - << indent() << "await oprot.WriteMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl - << indent() << "await oprot.Transport.FlushAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "}" << '\n' + << indent() << "await oprot.WriteMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n' + << indent() << "await oprot.Transport.FlushAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; } indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } void t_netstd_generator::generate_netstd_union_reader(ostream& out, t_struct* tunion) @@ -2548,76 +2548,76 @@ void t_netstd_generator::generate_netstd_union_reader(ostream& out, t_struct* tu const vector& fields = tunion->get_members(); vector::const_iterator f_iter; - out << indent() << "public static async Task<" << tunion->get_name() << "> ReadAsync(TProtocol iprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl; + out << indent() << "public static async Task<" << tunion->get_name() << "> ReadAsync(TProtocol iprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n'; scope_up(out); - out << indent() << "iprot.IncrementRecursionDepth();" << endl; - out << indent() << "try" << endl; + out << indent() << "iprot.IncrementRecursionDepth();" << '\n'; + out << indent() << "try" << '\n'; scope_up(out); string tmpRetval = tmp("tmp"); - out << indent() << tunion->get_name() << " " << tmpRetval << ";" << endl; - out << indent() << "await iprot.ReadStructBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; - out << indent() << "TField field = await iprot.ReadFieldBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << tunion->get_name() << " " << tmpRetval << ";" << '\n'; + out << indent() << "await iprot.ReadStructBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; + out << indent() << "TField field = await iprot.ReadFieldBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; // we cannot have the first field be a stop -- we must have a single field defined - out << indent() << "if (field.Type == TType.Stop)" << endl; + out << indent() << "if (field.Type == TType.Stop)" << '\n'; scope_up(out); - out << indent() << "await iprot.ReadFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; - out << indent() << "" << tmpRetval << " = new ___undefined();" << endl; + out << indent() << "await iprot.ReadFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; + out << indent() << "" << tmpRetval << " = new ___undefined();" << '\n'; scope_down(out); - out << indent() << "else" << endl; + out << indent() << "else" << '\n'; scope_up(out); - out << indent() << "switch (field.ID)" << endl; + out << indent() << "switch (field.ID)" << '\n'; scope_up(out); for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - out << indent() << "case " << (*f_iter)->get_key() << ":" << endl; + out << indent() << "case " << (*f_iter)->get_key() << ":" << '\n'; indent_up(); - out << indent() << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl; + out << indent() << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n'; indent_up(); string tmpvar = tmp("tmp"); - out << indent() << type_name((*f_iter)->get_type()) << " " << tmpvar << ";" << endl; + out << indent() << type_name((*f_iter)->get_type()) << " " << tmpvar << ";" << '\n'; generate_deserialize_field(out, (*f_iter), tmpvar, true); - out << indent() << tmpRetval << " = new " << (*f_iter)->get_name() << "(" << tmpvar << ");" << endl; + out << indent() << tmpRetval << " = new " << (*f_iter)->get_name() << "(" << tmpvar << ");" << '\n'; indent_down(); - out << indent() << "} else { " << endl << indent() << " await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" - << endl << indent() << " " << tmpRetval << " = new ___undefined();" << endl << indent() << "}" << endl - << indent() << "break;" << endl; + out << indent() << "} else { " << '\n' << indent() << " await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" + << '\n' << indent() << " " << tmpRetval << " = new ___undefined();" << '\n' << indent() << "}" << '\n' + << indent() << "break;" << '\n'; indent_down(); } - out << indent() << "default: " << endl; + out << indent() << "default: " << '\n'; indent_up(); - out << indent() << "await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" << endl << indent() - << tmpRetval << " = new ___undefined();" << endl; - out << indent() << "break;" << endl; + out << indent() << "await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" << '\n' << indent() + << tmpRetval << " = new ___undefined();" << '\n'; + out << indent() << "break;" << '\n'; indent_down(); scope_down(out); - out << indent() << "await iprot.ReadFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await iprot.ReadFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; - out << indent() << "if ((await iprot.ReadFieldBeginAsync(" << CANCELLATION_TOKEN_NAME << ")).Type != TType.Stop)" << endl; + out << indent() << "if ((await iprot.ReadFieldBeginAsync(" << CANCELLATION_TOKEN_NAME << ")).Type != TType.Stop)" << '\n'; scope_up(out); - out << indent() << "throw new TProtocolException(TProtocolException.INVALID_DATA);" << endl; + out << indent() << "throw new TProtocolException(TProtocolException.INVALID_DATA);" << '\n'; scope_down(out); // end of else for TStop scope_down(out); - out << indent() << "await iprot.ReadStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; - out << indent() << "return " << tmpRetval << ";" << endl; + out << indent() << "await iprot.ReadStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; + out << indent() << "return " << tmpRetval << ";" << '\n'; indent_down(); scope_down(out); - out << indent() << "finally" << endl; + out << indent() << "finally" << '\n'; scope_up(out); - out << indent() << "iprot.DecrementRecursionDepth();" << endl; + out << indent() << "iprot.DecrementRecursionDepth();" << '\n'; scope_down(out); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } void t_netstd_generator::generate_deserialize_field(ostream& out, t_field* tfield, string prefix, bool is_propertyless) @@ -2698,7 +2698,7 @@ void t_netstd_generator::generate_deserialize_field(ostream& out, t_field* tfiel { out << "ReadI32Async(" << CANCELLATION_TOKEN_NAME << ");"; } - out << endl; + out << '\n'; } else { @@ -2710,18 +2710,18 @@ void t_netstd_generator::generate_deserialize_struct(ostream& out, t_struct* tst { if (is_union_enabled() && tstruct->is_union()) { - out << indent() << prefix << " = await " << type_name(tstruct) << ".ReadAsync(iprot, " << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << prefix << " = await " << type_name(tstruct) << ".ReadAsync(iprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n'; } else { - out << indent() << prefix << " = new " << type_name(tstruct) << "();" << endl - << indent() << "await " << prefix << ".ReadAsync(iprot, " << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << prefix << " = new " << type_name(tstruct) << "();" << '\n' + << indent() << "await " << prefix << ".ReadAsync(iprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n'; } } void t_netstd_generator::generate_deserialize_container(ostream& out, t_type* ttype, string prefix) { - out << indent() << "{" << endl; + out << indent() << "{" << '\n'; indent_up(); string obj; @@ -2741,21 +2741,21 @@ void t_netstd_generator::generate_deserialize_container(ostream& out, t_type* tt if (ttype->is_map()) { - out << indent() << "var " << obj << " = await iprot.ReadMapBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "var " << obj << " = await iprot.ReadMapBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; } else if (ttype->is_set()) { - out << indent() << "var " << obj << " = await iprot.ReadSetBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "var " << obj << " = await iprot.ReadSetBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; } else if (ttype->is_list()) { - out << indent() << "var " << obj << " = await iprot.ReadListBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "var " << obj << " = await iprot.ReadListBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; } - out << indent() << prefix << " = new " << type_name(ttype) << "(" << obj << ".Count);" << endl; + out << indent() << prefix << " = new " << type_name(ttype) << "(" << obj << ".Count);" << '\n'; string i = tmp("_i"); - out << indent() << "for(int " << i << " = 0; " << i << " < " << obj << ".Count; ++" << i << ")" << endl - << indent() << "{" << endl; + out << indent() << "for(int " << i << " = 0; " << i << " < " << obj << ".Count; ++" << i << ")" << '\n' + << indent() << "{" << '\n'; indent_up(); if (ttype->is_map()) @@ -2772,23 +2772,23 @@ void t_netstd_generator::generate_deserialize_container(ostream& out, t_type* tt } indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; if (ttype->is_map()) { - out << indent() << "await iprot.ReadMapEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await iprot.ReadMapEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; } else if (ttype->is_set()) { - out << indent() << "await iprot.ReadSetEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await iprot.ReadSetEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; } else if (ttype->is_list()) { - out << indent() << "await iprot.ReadListEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await iprot.ReadListEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; } indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } void t_netstd_generator::generate_deserialize_map_element(ostream& out, t_map* tmap, string prefix) @@ -2799,13 +2799,13 @@ void t_netstd_generator::generate_deserialize_map_element(ostream& out, t_map* t t_field fkey(tmap->get_key_type(), key); t_field fval(tmap->get_val_type(), val); - out << indent() << declare_field(&fkey, false, false) << endl; - out << indent() << declare_field(&fval, false, false) << endl; + out << indent() << declare_field(&fkey, false, false) << '\n'; + out << indent() << declare_field(&fval, false, false) << '\n'; generate_deserialize_field(out, &fkey); generate_deserialize_field(out, &fval); - out << indent() << prefix << "[" << key << "] = " << val << ";" << endl; + out << indent() << prefix << "[" << key << "] = " << val << ";" << '\n'; } void t_netstd_generator::generate_deserialize_set_element(ostream& out, t_set* tset, string prefix) @@ -2813,11 +2813,11 @@ void t_netstd_generator::generate_deserialize_set_element(ostream& out, t_set* t string elem = tmp("_elem"); t_field felem(tset->get_elem_type(), elem); - out << indent() << declare_field(&felem, false, false) << endl; + out << indent() << declare_field(&felem, false, false) << '\n'; generate_deserialize_field(out, &felem); - out << indent() << prefix << ".Add(" << elem << ");" << endl; + out << indent() << prefix << ".Add(" << elem << ");" << '\n'; } void t_netstd_generator::generate_deserialize_list_element(ostream& out, t_list* tlist, string prefix) @@ -2825,11 +2825,11 @@ void t_netstd_generator::generate_deserialize_list_element(ostream& out, t_list* string elem = tmp("_elem"); t_field felem(tlist->get_elem_type(), elem); - out << indent() << declare_field(&felem, false, false) << endl; + out << indent() << declare_field(&felem, false, false) << '\n'; generate_deserialize_field(out, &felem); - out << indent() << prefix << ".Add(" << elem << ");" << endl; + out << indent() << prefix << ".Add(" << elem << ");" << '\n'; } void t_netstd_generator::generate_serialize_field(ostream& out, t_field* tfield, string prefix, bool is_propertyless, bool allow_nullable) @@ -2904,7 +2904,7 @@ void t_netstd_generator::generate_serialize_field(ostream& out, t_field* tfield, { out << "WriteI32Async((int)" << name << ", " << CANCELLATION_TOKEN_NAME << ");"; } - out << endl; + out << '\n'; } else { @@ -2915,7 +2915,7 @@ void t_netstd_generator::generate_serialize_field(ostream& out, t_field* tfield, void t_netstd_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) { (void)tstruct; - out << indent() << "await " << prefix << ".WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await " << prefix << ".WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n'; } void t_netstd_generator::generate_serialize_container(ostream& out, t_type* ttype, string prefix) @@ -2924,18 +2924,18 @@ void t_netstd_generator::generate_serialize_container(ostream& out, t_type* ttyp { out << indent() << "await oprot.WriteMapBeginAsync(new TMap(" << type_to_enum(static_cast(ttype)->get_key_type()) << ", " << type_to_enum(static_cast(ttype)->get_val_type()) << ", " << prefix - << ".Count), " << CANCELLATION_TOKEN_NAME << ");" << endl; + << ".Count), " << CANCELLATION_TOKEN_NAME << ");" << '\n'; } else if (ttype->is_set()) { out << indent() << "await oprot.WriteSetBeginAsync(new TSet(" << type_to_enum(static_cast(ttype)->get_elem_type()) - << ", " << prefix << ".Count), " << CANCELLATION_TOKEN_NAME << ");" << endl; + << ", " << prefix << ".Count), " << CANCELLATION_TOKEN_NAME << ");" << '\n'; } else if (ttype->is_list()) { out << indent() << "await oprot.WriteListBeginAsync(new TList(" << type_to_enum(static_cast(ttype)->get_elem_type()) << ", " << prefix << ".Count), " << CANCELLATION_TOKEN_NAME << ");" - << endl; + << '\n'; } string iter = tmp("_iter"); @@ -2955,8 +2955,8 @@ void t_netstd_generator::generate_serialize_container(ostream& out, t_type* ttyp << " in " << prefix << ")"; } - out << endl; - out << indent() << "{" << endl; + out << '\n'; + out << indent() << "{" << '\n'; indent_up(); if (ttype->is_map()) @@ -2973,19 +2973,19 @@ void t_netstd_generator::generate_serialize_container(ostream& out, t_type* ttyp } indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; if (ttype->is_map()) { - out << indent() << "await oprot.WriteMapEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await oprot.WriteMapEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; } else if (ttype->is_set()) { - out << indent() << "await oprot.WriteSetEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await oprot.WriteSetEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; } else if (ttype->is_list()) { - out << indent() << "await oprot.WriteListEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl; + out << indent() << "await oprot.WriteListEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; } } @@ -3018,7 +3018,7 @@ void t_netstd_generator::generate_netstd_property(ostream& out, t_field* tfield, { if ((is_serialize_enabled() || is_wcf_enabled()) && isPublic) { - out << indent() << "[DataMember(Order = 0)]" << endl; + out << indent() << "[DataMember(Order = 0)]" << '\n'; } out << indent() @@ -3036,37 +3036,37 @@ void t_netstd_generator::generate_netstd_property(ostream& out, t_field* tfield, if( (target_net_version >= 6) && (!force_member_nullable(tfield))) { out << initialize_field(tfield) << ";"; } - out << endl; + out << '\n'; } else { - out << endl - << indent() << "{" << endl; + out << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "get" << endl - << indent() << "{" << endl; + out << indent() << "get" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "return " << fieldPrefix + tfield->get_name() << ";" << endl; + out << indent() << "return " << fieldPrefix + tfield->get_name() << ";" << '\n'; indent_down(); - out << indent() << "}" << endl - << indent() << "set" << endl - << indent() << "{" << endl; + out << indent() << "}" << '\n' + << indent() << "set" << '\n' + << indent() << "{" << '\n'; indent_up(); if (generateIsset) { - out << indent() << "__isset." << get_isset_name(normalize_name(tfield->get_name())) << " = true;" << endl; + out << indent() << "__isset." << get_isset_name(normalize_name(tfield->get_name())) << " = true;" << '\n'; } - out << indent() << "this." << fieldPrefix + tfield->get_name() << " = value;" << endl; + out << indent() << "this." << fieldPrefix + tfield->get_name() << " = value;" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } - out << endl; + out << '\n'; } string t_netstd_generator::make_csharp_string_literal( string const& value) @@ -3749,14 +3749,14 @@ string t_netstd_generator::type_to_enum(t_type* type) void t_netstd_generator::generate_netstd_docstring_comment(ostream& out, string contents) { - docstring_comment(out, "/// " + endl, "/// ", contents, "/// " + endl); + docstring_comment(out, "/// " + string("\n"), "/// ", contents, "/// " + string("\n")); } void t_netstd_generator::generate_netstd_doc(ostream& out, t_field* field) { if (field->get_type()->is_enum()) { - string combined_message = field->get_doc() + endl + "get_type()) + "\"/>"; + string combined_message = field->get_doc() + "\n" + "get_type()) + "\"/>"; generate_netstd_docstring_comment(out, combined_message); } else @@ -3783,7 +3783,7 @@ void t_netstd_generator::generate_netstd_doc(ostream& out, t_function* tfunction for (p_iter = fields.begin(); p_iter != fields.end(); ++p_iter) { t_field* p = *p_iter; - ps << endl << "get_name() << "\">"; + ps << '\n' << "get_name() << "\">"; if (p->has_doc()) { string str = p->get_doc(); @@ -3796,7 +3796,7 @@ void t_netstd_generator::generate_netstd_doc(ostream& out, t_function* tfunction docstring_comment(out, "", "/// ", - "" + endl + tfunction->get_doc() + "" + ps.str(), + "" + string("\n") + tfunction->get_doc() + "" + ps.str(), ""); } } @@ -3818,11 +3818,11 @@ void t_netstd_generator::docstring_comment(ostream& out, const string& comment_s // Just prnt a newline when the line & prefix are empty. if (strlen(line) == 0 && line_prefix == "" && !docs.eof()) { - out << endl; + out << '\n'; } else if (strlen(line) > 0 || !docs.eof()) { // skip the empty last line - out << indent() << line_prefix << line << endl; + out << indent() << line_prefix << line << '\n'; } } if (comment_end != "") diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.h b/compiler/cpp/src/thrift/generate/t_netstd_generator.h index ff3cfb1264c..a6e4d90a496 100644 --- a/compiler/cpp/src/thrift/generate/t_netstd_generator.h +++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.h @@ -44,8 +44,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - static const string DEEP_COPY_METHOD_NAME = "DeepCopy"; static const string CANCELLATION_TOKEN_NAME = "cancellationToken"; @@ -165,7 +163,7 @@ class t_netstd_generator : public t_oop_generator comment += " */\n"; return comment; } - + private: string namespace_name_; @@ -182,15 +180,15 @@ class t_netstd_generator : public t_oop_generator const std::string CSHARP_KEYWORDS[101] = { // C# keywords - "abstract", "as", "base", "bool", "break", "byte", "case", "catch", "char", "checked", "class", "const", "continue", - "decimal", "default", "delegate", "do", "double", "else", "enum", "event", "explicit", "extern", "false", "finally", - "fixed", "float", "for", "foreach", "goto", "if", "implicit", "in", "int", "interface", "internal", "is", "lock", - "long", "namespace", "new", "null", "object", "operator", "out", "override", "params", "private", "protected", - "public", "readonly", "ref", "return", "sbyte", "sealed", "short", "sizeof", "stackalloc", "static", "string", - "struct", "switch", "this", "throw", "true", "try", "typeof", "uint", "ulong", "unchecked", "unsafe", "ushort", - "using", "virtual", "void", "volatile", "while", + "abstract", "as", "base", "bool", "break", "byte", "case", "catch", "char", "checked", "class", "const", "continue", + "decimal", "default", "delegate", "do", "double", "else", "enum", "event", "explicit", "extern", "false", "finally", + "fixed", "float", "for", "foreach", "goto", "if", "implicit", "in", "int", "interface", "internal", "is", "lock", + "long", "namespace", "new", "null", "object", "operator", "out", "override", "params", "private", "protected", + "public", "readonly", "ref", "return", "sbyte", "sealed", "short", "sizeof", "stackalloc", "static", "string", + "struct", "switch", "this", "throw", "true", "try", "typeof", "uint", "ulong", "unchecked", "unsafe", "ushort", + "using", "virtual", "void", "volatile", "while", // C# contextual keywords - "add", "alias", "ascending", "async", "await", "descending", "dynamic", "from", "get", "global", "group", "into", + "add", "alias", "ascending", "async", "await", "descending", "dynamic", "from", "get", "global", "group", "into", "join", "let", "orderby", "partial", "remove", "select", "set", "value", "var", "when", "where", "yield" }; @@ -199,7 +197,7 @@ class t_netstd_generator : public t_oop_generator vector member_mapping_scopes; map collected_extension_types; map checked_extension_types; - + string normalize_name(string name, bool is_arg_name = false); string make_valid_csharp_identifier(string const& fromName); string make_csharp_string_literal( string const& value); diff --git a/compiler/cpp/src/thrift/generate/t_ocaml_generator.cc b/compiler/cpp/src/thrift/generate/t_ocaml_generator.cc index 5f9b80cf5ec..34dda402a1a 100644 --- a/compiler/cpp/src/thrift/generate/t_ocaml_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_ocaml_generator.cc @@ -38,8 +38,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /** * OCaml code generator. * @@ -241,10 +239,10 @@ void t_ocaml_generator::init_generator() { f_consts_.open(f_consts_name.c_str()); // Print header - f_types_ << ocaml_autogen_comment() << endl << ocaml_imports() << endl; - f_types_i_ << ocaml_autogen_comment() << endl << ocaml_imports() << endl; - f_consts_ << ocaml_autogen_comment() << endl << ocaml_imports() << endl << "open " - << capitalize(program_name_) << "_types" << endl; + f_types_ << ocaml_autogen_comment() << '\n' << ocaml_imports() << '\n'; + f_types_i_ << ocaml_autogen_comment() << '\n' << ocaml_imports() << '\n'; + f_consts_ << ocaml_autogen_comment() << '\n' << ocaml_imports() << '\n' << "open " + << capitalize(program_name_) << "_types" << '\n'; } /** @@ -277,9 +275,9 @@ t_ocaml_generator::~t_ocaml_generator() { */ void t_ocaml_generator::generate_typedef(t_typedef* ttypedef) { f_types_ << indent() << "type " << decapitalize(ttypedef->get_symbolic()) << " = " - << render_ocaml_type(ttypedef->get_type()) << endl << endl; + << render_ocaml_type(ttypedef->get_type()) << '\n' << '\n'; f_types_i_ << indent() << "type " << decapitalize(ttypedef->get_symbolic()) << " = " - << render_ocaml_type(ttypedef->get_type()) << endl << endl; + << render_ocaml_type(ttypedef->get_type()) << '\n' << '\n'; } /** @@ -289,46 +287,46 @@ void t_ocaml_generator::generate_typedef(t_typedef* ttypedef) { * @param tenum The enumeration */ void t_ocaml_generator::generate_enum(t_enum* tenum) { - indent(f_types_) << "module " << capitalize(tenum->get_name()) << " = " << endl << "struct" - << endl; - indent(f_types_i_) << "module " << capitalize(tenum->get_name()) << " : " << endl << "sig" - << endl; + indent(f_types_) << "module " << capitalize(tenum->get_name()) << " = " << '\n' << "struct" + << '\n'; + indent(f_types_i_) << "module " << capitalize(tenum->get_name()) << " : " << '\n' << "sig" + << '\n'; indent_up(); - indent(f_types_) << "type t = " << endl; - indent(f_types_i_) << "type t = " << endl; + indent(f_types_) << "type t = " << '\n'; + indent(f_types_i_) << "type t = " << '\n'; indent_up(); vector constants = tenum->get_constants(); vector::iterator c_iter; for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { string name = capitalize((*c_iter)->get_name()); - indent(f_types_) << "| " << name << endl; - indent(f_types_i_) << "| " << name << endl; + indent(f_types_) << "| " << name << '\n'; + indent(f_types_i_) << "| " << name << '\n'; } indent_down(); - indent(f_types_) << "let to_i = function" << endl; - indent(f_types_i_) << "val to_i : t -> Int32.t" << endl; + indent(f_types_) << "let to_i = function" << '\n'; + indent(f_types_i_) << "val to_i : t -> Int32.t" << '\n'; indent_up(); for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { int value = (*c_iter)->get_value(); string name = capitalize((*c_iter)->get_name()); - indent(f_types_) << "| " << name << " -> " << value << "l" << endl; + indent(f_types_) << "| " << name << " -> " << value << "l" << '\n'; } indent_down(); - indent(f_types_) << "let of_i = function" << endl; - indent(f_types_i_) << "val of_i : Int32.t -> t" << endl; + indent(f_types_) << "let of_i = function" << '\n'; + indent(f_types_i_) << "val of_i : Int32.t -> t" << '\n'; indent_up(); for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { int value = (*c_iter)->get_value(); string name = capitalize((*c_iter)->get_name()); - indent(f_types_) << "| " << value << "l -> " << name << endl; + indent(f_types_) << "| " << value << "l -> " << name << '\n'; } - indent(f_types_) << "| _ -> raise Thrift_error" << endl; + indent(f_types_) << "| _ -> raise Thrift_error" << '\n'; indent_down(); indent_down(); - indent(f_types_) << "end" << endl; - indent(f_types_i_) << "end" << endl; + indent(f_types_) << "end" << '\n'; + indent(f_types_i_) << "end" << '\n'; } /** @@ -339,7 +337,7 @@ void t_ocaml_generator::generate_const(t_const* tconst) { string name = decapitalize(tconst->get_name()); t_const_value* value = tconst->get_value(); - indent(f_consts_) << "let " << name << " = " << render_const_value(type, value) << endl << endl; + indent(f_consts_) << "let " << name << " = " << render_const_value(type, value) << '\n' << '\n'; } /** @@ -395,9 +393,9 @@ string t_ocaml_generator::render_const_value(t_type* type, t_const_value* value) } else if (type->is_struct() || type->is_xception()) { string cname = type_name(type); string ct = tmp("_c"); - out << endl; + out << '\n'; indent_up(); - indent(out) << "(let " << ct << " = new " << cname << " in" << endl; + indent(out) << "(let " << ct << " = new " << cname << " in" << '\n'; indent_up(); const vector& fields = ((t_struct*)type)->get_members(); vector::const_iterator f_iter; @@ -417,7 +415,7 @@ string t_ocaml_generator::render_const_value(t_type* type, t_const_value* value) out << indent(); out << ct << "#set_" << fname << " "; out << render_const_value(field_type, v_iter->second); - out << ";" << endl; + out << ";" << '\n'; } indent(out) << ct << ")"; indent_down(); @@ -428,14 +426,14 @@ string t_ocaml_generator::render_const_value(t_type* type, t_const_value* value) const map& val = value->get_map(); map::const_iterator v_iter; string hm = tmp("_hm"); - out << endl; + out << '\n'; indent_up(); - indent(out) << "(let " << hm << " = Hashtbl.create " << val.size() << " in" << endl; + indent(out) << "(let " << hm << " = Hashtbl.create " << val.size() << " in" << '\n'; indent_up(); for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string key = render_const_value(ktype, v_iter->first); string val = render_const_value(vtype, v_iter->second); - indent(out) << "Hashtbl.add " << hm << " " << key << " " << val << ";" << endl; + indent(out) << "Hashtbl.add " << hm << " " << key << " " << val << ";" << '\n'; } indent(out) << hm << ")"; indent_down(); @@ -443,14 +441,14 @@ string t_ocaml_generator::render_const_value(t_type* type, t_const_value* value) } else if (type->is_list()) { t_type* etype; etype = ((t_list*)type)->get_elem_type(); - out << "[" << endl; + out << "[" << '\n'; indent_up(); const vector& val = value->get_list(); vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { out << indent(); out << render_const_value(etype, *v_iter); - out << ";" << endl; + out << ";" << '\n'; } indent_down(); indent(out) << "]"; @@ -459,15 +457,15 @@ string t_ocaml_generator::render_const_value(t_type* type, t_const_value* value) const vector& val = value->get_list(); vector::const_iterator v_iter; string hm = tmp("_hm"); - indent(out) << "(let " << hm << " = Hashtbl.create " << val.size() << " in" << endl; + indent(out) << "(let " << hm << " = Hashtbl.create " << val.size() << " in" << '\n'; indent_up(); for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { string val = render_const_value(etype, *v_iter); - indent(out) << "Hashtbl.add " << hm << " " << val << " true;" << endl; + indent(out) << "Hashtbl.add " << hm << " " << val << " true;" << '\n'; } - indent(out) << hm << ")" << endl; + indent(out) << hm << ")" << '\n'; indent_down(); - out << endl; + out << '\n'; } else { throw "CANNOT GENERATE CONSTANT FOR TYPE: " + type->get_name(); } @@ -503,15 +501,15 @@ void t_ocaml_generator::generate_ocaml_method_copy(ostream& out, const vector::const_iterator m_iter; /* Create a copy of the current object */ - indent(out) << "method copy =" << endl; + indent(out) << "method copy =" << '\n'; indent_up(); indent_up(); - indent(out) << "let _new = Oo.copy self in" << endl; + indent(out) << "let _new = Oo.copy self in" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) generate_ocaml_member_copy(out, *m_iter); indent_down(); - indent(out) << "_new" << endl; + indent(out) << "_new" << '\n'; indent_down(); } @@ -564,10 +562,10 @@ void t_ocaml_generator::generate_ocaml_member_copy(ostream& out, t_field* tmembe if (copy_of != grab_field) { indent(out); if (!struct_member_persistent(tmember)) { - out << "if _" << mname << " <> None then" << endl; + out << "if _" << mname << " <> None then" << '\n'; indent(out) << " "; } - out << "_new#set_" << mname << " " << copy_of << ";" << endl; + out << "_new#set_" << mname << " " << copy_of << ";" << '\n'; } } @@ -582,24 +580,24 @@ void t_ocaml_generator::generate_ocaml_struct_definition(ostream& out, const vector& members = tstruct->get_members(); vector::const_iterator m_iter; string tname = type_name(tstruct); - indent(out) << "class " << tname << " =" << endl; - indent(out) << "object (self)" << endl; + indent(out) << "class " << tname << " =" << '\n'; + indent(out) << "object (self)" << '\n'; indent_up(); if (members.size() > 0) { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { generate_ocaml_struct_member(out, tname, (*m_iter)); - out << endl; + out << '\n'; } } generate_ocaml_method_copy(out, members); generate_ocaml_struct_writer(out, tstruct); indent_down(); - indent(out) << "end" << endl; + indent(out) << "end" << '\n'; if (is_exception) { - indent(out) << "exception " << capitalize(tname) << " of " << tname << endl; + indent(out) << "exception " << capitalize(tname) << " of " << tname << '\n'; } generate_ocaml_struct_reader(out, tstruct); @@ -621,37 +619,37 @@ void t_ocaml_generator::generate_ocaml_struct_member(ostream& out, t_const_value* val = tmember->get_value(); if (val) { if (struct_member_persistent(tmember)) - out << " = " << render_const_value(tmember->get_type(), tmember->get_value()) << endl; + out << " = " << render_const_value(tmember->get_type(), tmember->get_value()) << '\n'; else out << " option = Some " << render_const_value(tmember->get_type(), tmember->get_value()) - << endl; + << '\n'; } else { // assert(!struct_member_persistent(tmember)) - out << " option = None" << endl; + out << " option = None" << '\n'; } if (struct_member_persistent(tmember)) { - indent(out) << "method get_" << mname << " = Some _" << mname << endl; - indent(out) << "method grab_" << mname << " = _" << mname << endl; - indent(out) << "method set_" << mname << " " << x << " = _" << mname << " <- " << x << endl; + indent(out) << "method get_" << mname << " = Some _" << mname << '\n'; + indent(out) << "method grab_" << mname << " = _" << mname << '\n'; + indent(out) << "method set_" << mname << " " << x << " = _" << mname << " <- " << x << '\n'; } else { - indent(out) << "method get_" << mname << " = _" << mname << endl; + indent(out) << "method get_" << mname << " = _" << mname << '\n'; indent(out) << "method grab_" << mname << " = match _" << mname << " with None->raise (Field_empty \"" << tname << "." << mname << "\") | Some " - << x << " -> " << x << endl; + << x << " -> " << x << '\n'; indent(out) << "method set_" << mname << " " << x << " = _" << mname << " <- Some " << x - << endl; - indent(out) << "method unset_" << mname << " = _" << mname << " <- None" << endl; + << '\n'; + indent(out) << "method unset_" << mname << " = _" << mname << " <- None" << '\n'; } indent(out) << "method reset_" << mname << " = _" << mname << " <- "; if (val) { if (struct_member_persistent(tmember)) - out << render_const_value(tmember->get_type(), tmember->get_value()) << endl; + out << render_const_value(tmember->get_type(), tmember->get_value()) << '\n'; else - out << "Some " << render_const_value(tmember->get_type(), tmember->get_value()) << endl; + out << "Some " << render_const_value(tmember->get_type(), tmember->get_value()) << '\n'; } else { - out << "None" << endl; + out << "None" << '\n'; } } @@ -719,8 +717,8 @@ void t_ocaml_generator::generate_ocaml_struct_sig(ostream& out, const vector& members = tstruct->get_members(); vector::const_iterator m_iter; string tname = type_name(tstruct); - indent(out) << "class " << tname << " :" << endl; - indent(out) << "object ('a)" << endl; + indent(out) << "class " << tname << " :" << '\n'; + indent(out) << "object ('a)" << '\n'; indent_up(); @@ -729,24 +727,24 @@ void t_ocaml_generator::generate_ocaml_struct_sig(ostream& out, for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { string mname = decapitalize((*m_iter)->get_name()); string type = render_ocaml_type((*m_iter)->get_type()); - indent(out) << "method get_" << mname << " : " << type << " option" << endl; - indent(out) << "method grab_" << mname << " : " << type << endl; - indent(out) << "method set_" << mname << " : " << type << " -> unit" << endl; + indent(out) << "method get_" << mname << " : " << type << " option" << '\n'; + indent(out) << "method grab_" << mname << " : " << type << '\n'; + indent(out) << "method set_" << mname << " : " << type << " -> unit" << '\n'; if (!struct_member_persistent(*m_iter)) - indent(out) << "method unset_" << mname << " : unit" << endl; - indent(out) << "method reset_" << mname << " : unit" << endl; + indent(out) << "method unset_" << mname << " : unit" << '\n'; + indent(out) << "method reset_" << mname << " : unit" << '\n'; } } - indent(out) << "method copy : 'a" << endl; - indent(out) << "method write : Protocol.t -> unit" << endl; + indent(out) << "method copy : 'a" << '\n'; + indent(out) << "method write : Protocol.t -> unit" << '\n'; indent_down(); - indent(out) << "end" << endl; + indent(out) << "end" << '\n'; if (is_exception) { - indent(out) << "exception " << capitalize(tname) << " of " << tname << endl; + indent(out) << "exception " << capitalize(tname) << " of " << tname << '\n'; } - indent(out) << "val read_" << tname << " : Protocol.t -> " << tname << endl; + indent(out) << "val read_" << tname << " : Protocol.t -> " << tname << '\n'; } /** @@ -759,55 +757,55 @@ void t_ocaml_generator::generate_ocaml_struct_reader(ostream& out, t_struct* tst string str = tmp("_str"); string t = tmp("_t"); string id = tmp("_id"); - indent(out) << "let rec read_" << sname << " (iprot : Protocol.t) =" << endl; + indent(out) << "let rec read_" << sname << " (iprot : Protocol.t) =" << '\n'; indent_up(); - indent(out) << "let " << str << " = new " << sname << " in" << endl; + indent(out) << "let " << str << " = new " << sname << " in" << '\n'; indent_up(); - indent(out) << "ignore(iprot#readStructBegin);" << endl; + indent(out) << "ignore(iprot#readStructBegin);" << '\n'; // Loop over reading in fields - indent(out) << "(try while true do" << endl; + indent(out) << "(try while true do" << '\n'; indent_up(); indent_up(); // Read beginning field marker - indent(out) << "let (_," << t << "," << id << ") = iprot#readFieldBegin in" << endl; + indent(out) << "let (_," << t << "," << id << ") = iprot#readFieldBegin in" << '\n'; // Check for field STOP marker and break - indent(out) << "if " << t << " = Protocol.T_STOP then" << endl; + indent(out) << "if " << t << " = Protocol.T_STOP then" << '\n'; indent_up(); - indent(out) << "raise Break" << endl; + indent(out) << "raise Break" << '\n'; indent_down(); - indent(out) << "else ();" << endl; + indent(out) << "else ();" << '\n'; - indent(out) << "(match " << id << " with " << endl; + indent(out) << "(match " << id << " with " << '\n'; indent_up(); // Generate deserialization code for known cases for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { indent(out) << "| " << (*f_iter)->get_key() << " -> ("; - out << "if " << t << " = " << type_to_enum((*f_iter)->get_type()) << " then" << endl; + out << "if " << t << " = " << type_to_enum((*f_iter)->get_type()) << " then" << '\n'; indent_up(); indent_up(); generate_deserialize_field(out, *f_iter, str); indent_down(); - out << indent() << "else" << endl << indent() << " iprot#skip " << t << ")" << endl; + out << indent() << "else" << '\n' << indent() << " iprot#skip " << t << ")" << '\n'; indent_down(); } // In the default case we skip the field out << indent() << "| _ -> " - << "iprot#skip " << t << ");" << endl; + << "iprot#skip " << t << ");" << '\n'; indent_down(); // Read field end marker - indent(out) << "iprot#readFieldEnd;" << endl; + indent(out) << "iprot#readFieldEnd;" << '\n'; indent_down(); - indent(out) << "done; ()" << endl; + indent(out) << "done; ()" << '\n'; indent_down(); - indent(out) << "with Break -> ());" << endl; + indent(out) << "with Break -> ());" << '\n'; - indent(out) << "iprot#readStructEnd;" << endl; + indent(out) << "iprot#readStructEnd;" << '\n'; - indent(out) << str << endl << endl; + indent(out) << str << '\n' << '\n'; indent_down(); indent_down(); } @@ -819,9 +817,9 @@ void t_ocaml_generator::generate_ocaml_struct_writer(ostream& out, t_struct* tst string str = tmp("_str"); string f = tmp("_f"); - indent(out) << "method write (oprot : Protocol.t) =" << endl; + indent(out) << "method write (oprot : Protocol.t) =" << '\n'; indent_up(); - indent(out) << "oprot#writeStructBegin \"" << name << "\";" << endl; + indent(out) << "oprot#writeStructBegin \"" << name << "\";" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { t_field* tmember = (*f_iter); @@ -835,10 +833,10 @@ void t_ocaml_generator::generate_ocaml_struct_writer(ostream& out, t_struct* tst // Avoid redundant encoding of members having default values. indent(out) << "(match " << mname << " with " << render_const_value(tmember->get_type(), tmember->get_value()) << " -> () | " - << _v << " -> " << endl; + << _v << " -> " << '\n'; } else { _v = mname; - indent(out) << "(" << endl; + indent(out) << "(" << '\n'; } } else { @@ -853,12 +851,12 @@ void t_ocaml_generator::generate_ocaml_struct_writer(ostream& out, t_struct* tst out << " | Some " << render_const_value(tmember->get_type(), tmember->get_value()) << " -> ()"; } - out << " | Some _v -> " << endl; + out << " | Some _v -> " << '\n'; } else { - out << endl; + out << '\n'; indent(out) << "| None -> raise (Field_empty \"" << type_name(tstruct) << "." << mname - << "\")" << endl; - indent(out) << "| Some _v -> " << endl; + << "\")" << '\n'; + indent(out) << "| Some _v -> " << '\n'; } _v = "_v"; @@ -866,20 +864,20 @@ void t_ocaml_generator::generate_ocaml_struct_writer(ostream& out, t_struct* tst indent_up(); // Write field header indent(out) << "oprot#writeFieldBegin(\"" << tmember->get_name() << "\"," - << type_to_enum(tmember->get_type()) << "," << tmember->get_key() << ");" << endl; + << type_to_enum(tmember->get_type()) << "," << tmember->get_key() << ");" << '\n'; // Write field contents generate_serialize_field(out, tmember, _v); // Write field closer - indent(out) << "oprot#writeFieldEnd" << endl; + indent(out) << "oprot#writeFieldEnd" << '\n'; indent_down(); - indent(out) << ");" << endl; + indent(out) << ");" << '\n'; } // Write the struct map - out << indent() << "oprot#writeFieldStop;" << endl << indent() << "oprot#writeStructEnd" << endl; + out << indent() << "oprot#writeFieldStop;" << '\n' << indent() << "oprot#writeStructEnd" << '\n'; indent_down(); } @@ -895,19 +893,19 @@ void t_ocaml_generator::generate_service(t_service* tservice) { string f_service_i_name = get_out_dir() + capitalize(service_name_) + ".mli"; f_service_i_.open(f_service_i_name.c_str()); - f_service_ << ocaml_autogen_comment() << endl << ocaml_imports() << endl; - f_service_i_ << ocaml_autogen_comment() << endl << ocaml_imports() << endl; + f_service_ << ocaml_autogen_comment() << '\n' << ocaml_imports() << '\n'; + f_service_i_ << ocaml_autogen_comment() << '\n' << ocaml_imports() << '\n'; /* if (tservice->get_extends() != nullptr) { f_service_ << - "open " << capitalize(tservice->get_extends()->get_name()) << endl; + "open " << capitalize(tservice->get_extends()->get_name()) << '\n'; f_service_i_ << - "open " << capitalize(tservice->get_extends()->get_name()) << endl; + "open " << capitalize(tservice->get_extends()->get_name()) << '\n'; } */ - f_service_ << "open " << capitalize(program_name_) << "_types" << endl << endl; + f_service_ << "open " << capitalize(program_name_) << "_types" << '\n' << '\n'; - f_service_i_ << "open " << capitalize(program_name_) << "_types" << endl << endl; + f_service_i_ << "open " << capitalize(program_name_) << "_types" << '\n' << '\n'; // Generate the three main parts of the service generate_service_helpers(tservice); @@ -925,7 +923,7 @@ void t_ocaml_generator::generate_service_helpers(t_service* tservice) { vector functions = tservice->get_functions(); vector::iterator f_iter; - indent(f_service_) << "(* HELPER FUNCTIONS AND STRUCTURES *)" << endl << endl; + indent(f_service_) << "(* HELPER FUNCTIONS AND STRUCTURES *)" << '\n' << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { t_struct* ts = (*f_iter)->get_arglist(); @@ -961,15 +959,15 @@ void t_ocaml_generator::generate_ocaml_function_helpers(t_function* tfunction) { * @param tservice The service to generate a header definition for */ void t_ocaml_generator::generate_service_interface(t_service* tservice) { - f_service_ << indent() << "class virtual iface =" << endl << "object (self)" << endl; - f_service_i_ << indent() << "class virtual iface :" << endl << "object" << endl; + f_service_ << indent() << "class virtual iface =" << '\n' << "object (self)" << '\n'; + f_service_i_ << indent() << "class virtual iface :" << '\n' << "object" << '\n'; indent_up(); if (tservice->get_extends() != nullptr) { string extends = type_name(tservice->get_extends()); - indent(f_service_) << "inherit " << extends << ".iface" << endl; - indent(f_service_i_) << "inherit " << extends << ".iface" << endl; + indent(f_service_) << "inherit " << extends << ".iface" << '\n'; + indent(f_service_i_) << "inherit " << extends << ".iface" << '\n'; } vector functions = tservice->get_functions(); @@ -977,13 +975,13 @@ void t_ocaml_generator::generate_service_interface(t_service* tservice) { for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { string ft = function_type(*f_iter, true, true); f_service_ << indent() << "method virtual " << decapitalize((*f_iter)->get_name()) << " : " - << ft << endl; + << ft << '\n'; f_service_i_ << indent() << "method virtual " << decapitalize((*f_iter)->get_name()) << " : " - << ft << endl; + << ft << '\n'; } indent_down(); - indent(f_service_) << "end" << endl << endl; - indent(f_service_i_) << "end" << endl << endl; + indent(f_service_) << "end" << '\n' << '\n'; + indent(f_service_i_) << "end" << '\n' << '\n'; } /** @@ -995,17 +993,17 @@ void t_ocaml_generator::generate_service_interface(t_service* tservice) { */ void t_ocaml_generator::generate_service_client(t_service* tservice) { string extends = ""; - indent(f_service_) << "class client (iprot : Protocol.t) (oprot : Protocol.t) =" << endl - << "object (self)" << endl; - indent(f_service_i_) << "class client : Protocol.t -> Protocol.t -> " << endl << "object" << endl; + indent(f_service_) << "class client (iprot : Protocol.t) (oprot : Protocol.t) =" << '\n' + << "object (self)" << '\n'; + indent(f_service_i_) << "class client : Protocol.t -> Protocol.t -> " << '\n' << "object" << '\n'; indent_up(); if (tservice->get_extends() != nullptr) { extends = type_name(tservice->get_extends()); - indent(f_service_) << "inherit " << extends << ".client iprot oprot as super" << endl; - indent(f_service_i_) << "inherit " << extends << ".client" << endl; + indent(f_service_) << "inherit " << extends << ".client iprot oprot as super" << '\n'; + indent(f_service_i_) << "inherit " << extends << ".client" << '\n'; } - indent(f_service_) << "val mutable seqid = 0" << endl; + indent(f_service_) << "val mutable seqid = 0" << '\n'; // Generate client method implementations vector functions = tservice->get_functions(); @@ -1017,24 +1015,24 @@ void t_ocaml_generator::generate_service_client(t_service* tservice) { string funname = (*f_iter)->get_name(); // Open function - indent(f_service_) << "method " << function_signature(*f_iter) << " = " << endl; + indent(f_service_) << "method " << function_signature(*f_iter) << " = " << '\n'; indent(f_service_i_) << "method " << decapitalize((*f_iter)->get_name()) << " : " - << function_type(*f_iter, true, false) << endl; + << function_type(*f_iter, true, false) << '\n'; indent_up(); indent(f_service_) << "self#send_" << funname; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { f_service_ << " " << decapitalize((*fld_iter)->get_name()); } - f_service_ << ";" << endl; + f_service_ << ";" << '\n'; if (!(*f_iter)->is_oneway()) { f_service_ << indent(); - f_service_ << "self#recv_" << funname << endl; + f_service_ << "self#recv_" << funname << '\n'; } indent_down(); - indent(f_service_) << "method private send_" << function_signature(*f_iter) << " = " << endl; + indent(f_service_) << "method private send_" << function_signature(*f_iter) << " = " << '\n'; indent_up(); std::string argsname = decapitalize((*f_iter)->get_name() + "_args"); @@ -1042,19 +1040,19 @@ void t_ocaml_generator::generate_service_client(t_service* tservice) { // Serialize the request header f_service_ << indent() << "oprot#writeMessageBegin (\"" << (*f_iter)->get_name() << "\", " << ((*f_iter)->is_oneway() ? "Protocol.ONEWAY" : "Protocol.CALL") << ", seqid);" - << endl; + << '\n'; - f_service_ << indent() << "let args = new " << argsname << " in" << endl; + f_service_ << indent() << "let args = new " << argsname << " in" << '\n'; indent_up(); for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { f_service_ << indent() << "args#set_" << (*fld_iter)->get_name() << " " - << (*fld_iter)->get_name() << ";" << endl; + << (*fld_iter)->get_name() << ";" << '\n'; } // Write to the stream - f_service_ << indent() << "args#write oprot;" << endl << indent() << "oprot#writeMessageEnd;" - << endl << indent() << "oprot#getTransport#flush" << endl; + f_service_ << indent() << "args#write oprot;" << '\n' << indent() << "oprot#writeMessageEnd;" + << '\n' << indent() << "oprot#getTransport#flush" << '\n'; indent_down(); indent_down(); @@ -1068,20 +1066,20 @@ void t_ocaml_generator::generate_service_client(t_service* tservice) { &noargs); // Open function f_service_ << indent() << "method private " << function_signature(&recv_function) << " =" - << endl; + << '\n'; indent_up(); // TODO(mcslee): Validate message reply here, seq ids etc. - f_service_ << indent() << "let (fname, mtype, rseqid) = iprot#readMessageBegin in" << endl; + f_service_ << indent() << "let (fname, mtype, rseqid) = iprot#readMessageBegin in" << '\n'; indent_up(); - f_service_ << indent() << "(if mtype = Protocol.EXCEPTION then" << endl << indent() - << " let x = Application_Exn.read iprot in" << endl; + f_service_ << indent() << "(if mtype = Protocol.EXCEPTION then" << '\n' << indent() + << " let x = Application_Exn.read iprot in" << '\n'; indent_up(); f_service_ << indent() << " (iprot#readMessageEnd;" << indent() - << " raise (Application_Exn.E x))" << endl; + << " raise (Application_Exn.E x))" << '\n'; indent_down(); - f_service_ << indent() << "else ());" << endl; + f_service_ << indent() << "else ());" << '\n'; string res = "_"; t_struct* xs = (*f_iter)->get_xceptions(); @@ -1090,32 +1088,32 @@ void t_ocaml_generator::generate_service_client(t_service* tservice) { if (!(*f_iter)->get_returntype()->is_void() || xceptions.size() > 0) { res = "result"; } - f_service_ << indent() << "let " << res << " = read_" << resultname << " iprot in" << endl; + f_service_ << indent() << "let " << res << " = read_" << resultname << " iprot in" << '\n'; indent_up(); - f_service_ << indent() << "iprot#readMessageEnd;" << endl; + f_service_ << indent() << "iprot#readMessageEnd;" << '\n'; // Careful, only return _result if not a void function if (!(*f_iter)->get_returntype()->is_void()) { - f_service_ << indent() << "match result#get_success with Some v -> v | None -> (" << endl; + f_service_ << indent() << "match result#get_success with Some v -> v | None -> (" << '\n'; indent_up(); } vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { f_service_ << indent() << "(match result#get_" << (*x_iter)->get_name() - << " with None -> () | Some _v ->" << endl; + << " with None -> () | Some _v ->" << '\n'; indent(f_service_) << " raise (" << capitalize(exception_ctor((*x_iter)->get_type())) - << " _v));" << endl; + << " _v));" << '\n'; } // Careful, only return _result if not a void function if ((*f_iter)->get_returntype()->is_void()) { - indent(f_service_) << "()" << endl; + indent(f_service_) << "()" << '\n'; } else { f_service_ << indent() << "raise (Application_Exn.E (Application_Exn.create Application_Exn.MISSING_RESULT \"" - << (*f_iter)->get_name() << " failed: unknown result\")))" << endl; + << (*f_iter)->get_name() << " failed: unknown result\")))" << '\n'; indent_down(); } @@ -1127,8 +1125,8 @@ void t_ocaml_generator::generate_service_client(t_service* tservice) { } indent_down(); - indent(f_service_) << "end" << endl << endl; - indent(f_service_i_) << "end" << endl << endl; + indent(f_service_) << "end" << '\n' << '\n'; + indent(f_service_i_) << "end" << '\n' << '\n'; } /** @@ -1142,50 +1140,50 @@ void t_ocaml_generator::generate_service_server(t_service* tservice) { vector::iterator f_iter; // Generate the header portion - indent(f_service_) << "class processor (handler : iface) =" << endl << indent() << "object (self)" - << endl; - indent(f_service_i_) << "class processor : iface ->" << endl << indent() << "object" << endl; + indent(f_service_) << "class processor (handler : iface) =" << '\n' << indent() << "object (self)" + << '\n'; + indent(f_service_i_) << "class processor : iface ->" << '\n' << indent() << "object" << '\n'; indent_up(); - f_service_ << indent() << "inherit Processor.t" << endl << endl; - f_service_i_ << indent() << "inherit Processor.t" << endl << endl; + f_service_ << indent() << "inherit Processor.t" << '\n' << '\n'; + f_service_i_ << indent() << "inherit Processor.t" << '\n' << '\n'; string extends = ""; if (tservice->get_extends() != nullptr) { extends = type_name(tservice->get_extends()); indent(f_service_) << "inherit " + extends + ".processor (handler :> " + extends + ".iface)" - << endl; - indent(f_service_i_) << "inherit " + extends + ".processor" << endl; + << '\n'; + indent(f_service_i_) << "inherit " + extends + ".processor" << '\n'; } if (extends.empty()) { - indent(f_service_) << "val processMap = Hashtbl.create " << functions.size() << endl; + indent(f_service_) << "val processMap = Hashtbl.create " << functions.size() << '\n'; } indent(f_service_i_) - << "val processMap : (string, int * Protocol.t * Protocol.t -> unit) Hashtbl.t" << endl; + << "val processMap : (string, int * Protocol.t * Protocol.t -> unit) Hashtbl.t" << '\n'; // Generate the server implementation - indent(f_service_) << "method process iprot oprot =" << endl; - indent(f_service_i_) << "method process : Protocol.t -> Protocol.t -> bool" << endl; + indent(f_service_) << "method process iprot oprot =" << '\n'; + indent(f_service_i_) << "method process : Protocol.t -> Protocol.t -> bool" << '\n'; indent_up(); - f_service_ << indent() << "let (name, typ, seqid) = iprot#readMessageBegin in" << endl; + f_service_ << indent() << "let (name, typ, seqid) = iprot#readMessageBegin in" << '\n'; indent_up(); // TODO(mcslee): validate message // HOT: dictionary function lookup - f_service_ << indent() << "if Hashtbl.mem processMap name then" << endl << indent() - << " (Hashtbl.find processMap name) (seqid, iprot, oprot)" << endl << indent() - << "else (" << endl << indent() << " iprot#skip(Protocol.T_STRUCT);" << endl - << indent() << " iprot#readMessageEnd;" << endl << indent() + f_service_ << indent() << "if Hashtbl.mem processMap name then" << '\n' << indent() + << " (Hashtbl.find processMap name) (seqid, iprot, oprot)" << '\n' << indent() + << "else (" << '\n' << indent() << " iprot#skip(Protocol.T_STRUCT);" << '\n' + << indent() << " iprot#readMessageEnd;" << '\n' << indent() << " let x = Application_Exn.create Application_Exn.UNKNOWN_METHOD (\"Unknown " - "function \"^name) in" << endl << indent() - << " oprot#writeMessageBegin(name, Protocol.EXCEPTION, seqid);" << endl << indent() - << " x#write oprot;" << endl << indent() << " oprot#writeMessageEnd;" << endl - << indent() << " oprot#getTransport#flush" << endl << indent() << ");" << endl; + "function \"^name) in" << '\n' << indent() + << " oprot#writeMessageBegin(name, Protocol.EXCEPTION, seqid);" << '\n' << indent() + << " x#write oprot;" << '\n' << indent() << " oprot#writeMessageEnd;" << '\n' + << indent() << " oprot#getTransport#flush" << '\n' << indent() << ");" << '\n'; // Read end of args field, the T_STOP, and the struct close - f_service_ << indent() << "true" << endl; + f_service_ << indent() << "true" << '\n'; indent_down(); indent_down(); // Generate the process subfunctions @@ -1193,17 +1191,17 @@ void t_ocaml_generator::generate_service_server(t_service* tservice) { generate_process_function(tservice, *f_iter); } - indent(f_service_) << "initializer" << endl; + indent(f_service_) << "initializer" << '\n'; indent_up(); for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { f_service_ << indent() << "Hashtbl.add processMap \"" << (*f_iter)->get_name() - << "\" self#process_" << (*f_iter)->get_name() << ";" << endl; + << "\" self#process_" << (*f_iter)->get_name() << ";" << '\n'; } indent_down(); indent_down(); - indent(f_service_) << "end" << endl << endl; - indent(f_service_i_) << "end" << endl << endl; + indent(f_service_) << "end" << '\n' << '\n'; + indent(f_service_i_) << "end" << '\n' << '\n'; } /** @@ -1215,7 +1213,7 @@ void t_ocaml_generator::generate_process_function(t_service* tservice, t_functio (void)tservice; // Open function indent(f_service_) << "method private process_" << tfunction->get_name() - << " (seqid, iprot, oprot) =" << endl; + << " (seqid, iprot, oprot) =" << '\n'; indent_up(); string argsname = decapitalize(tfunction->get_name()) + "_args"; @@ -1231,9 +1229,9 @@ void t_ocaml_generator::generate_process_function(t_service* tservice, t_functio args = "_"; } - f_service_ << indent() << "let " << args << " = read_" << argsname << " iprot in" << endl; + f_service_ << indent() << "let " << args << " = read_" << argsname << " iprot in" << '\n'; indent_up(); - f_service_ << indent() << "iprot#readMessageEnd;" << endl; + f_service_ << indent() << "iprot#readMessageEnd;" << '\n'; t_struct* xs = tfunction->get_xceptions(); const std::vector& xceptions = xs->get_members(); @@ -1241,13 +1239,13 @@ void t_ocaml_generator::generate_process_function(t_service* tservice, t_functio // Declare result for non oneway function if (!tfunction->is_oneway()) { - f_service_ << indent() << "let result = new " << resultname << " in" << endl; + f_service_ << indent() << "let result = new " << resultname << " in" << '\n'; indent_up(); } // Try block for a function with exceptions if (xceptions.size() > 0) { - f_service_ << indent() << "(try" << endl; + f_service_ << indent() << "(try" << '\n'; indent_up(); } @@ -1259,20 +1257,20 @@ void t_ocaml_generator::generate_process_function(t_service* tservice, t_functio for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { f_service_ << " args#get_" << (*f_iter)->get_name(); } - f_service_ << ");" << endl; + f_service_ << ");" << '\n'; if (xceptions.size() > 0) { indent_down(); - indent(f_service_) << "with" << endl; + indent(f_service_) << "with" << '\n'; indent_up(); for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { f_service_ << indent() << "| " << capitalize(exception_ctor((*x_iter)->get_type())) << " " - << (*x_iter)->get_name() << " -> " << endl; + << (*x_iter)->get_name() << " -> " << '\n'; indent_up(); indent_up(); if (!tfunction->is_oneway()) { f_service_ << indent() << "result#set_" << (*x_iter)->get_name() << " " - << (*x_iter)->get_name() << endl; + << (*x_iter)->get_name() << '\n'; } else { indent(f_service_) << "()"; } @@ -1280,21 +1278,21 @@ void t_ocaml_generator::generate_process_function(t_service* tservice, t_functio indent_down(); } indent_down(); - f_service_ << indent() << ");" << endl; + f_service_ << indent() << ");" << '\n'; } // Shortcut out here for oneway functions if (tfunction->is_oneway()) { - f_service_ << indent() << "()" << endl; + f_service_ << indent() << "()" << '\n'; indent_down(); indent_down(); return; } f_service_ << indent() << "oprot#writeMessageBegin (\"" << tfunction->get_name() - << "\", Protocol.REPLY, seqid);" << endl << indent() << "result#write oprot;" << endl - << indent() << "oprot#writeMessageEnd;" << endl << indent() - << "oprot#getTransport#flush" << endl; + << "\", Protocol.REPLY, seqid);" << '\n' << indent() << "result#write oprot;" << '\n' + << indent() << "oprot#writeMessageEnd;" << '\n' << indent() + << "oprot#getTransport#flush" << '\n'; // Close function indent_down(); @@ -1311,7 +1309,7 @@ void t_ocaml_generator::generate_deserialize_field(ostream& out, t_field* tfield string name = decapitalize(tfield->get_name()); indent(out) << prefix << "#set_" << name << " "; generate_deserialize_type(out, type); - out << endl; + out << '\n'; } /** @@ -1396,46 +1394,46 @@ void t_ocaml_generator::generate_deserialize_container(ostream& out, t_type* tty t_field fvtype(g_type_i8, vtype); t_field fetype(g_type_i8, etype); - out << endl; + out << '\n'; indent_up(); // Declare variables, read header if (ttype->is_map()) { indent(out) << "(let (" << ktype << "," << vtype << "," << size << ") = iprot#readMapBegin in" - << endl; - indent(out) << "let " << con << " = Hashtbl.create " << size << " in" << endl; + << '\n'; + indent(out) << "let " << con << " = Hashtbl.create " << size << " in" << '\n'; indent_up(); - indent(out) << "for i = 1 to " << size << " do" << endl; + indent(out) << "for i = 1 to " << size << " do" << '\n'; indent_up(); indent(out) << "let _k = "; generate_deserialize_type(out, ((t_map*)ttype)->get_key_type()); - out << " in" << endl; + out << " in" << '\n'; indent(out) << "let _v = "; generate_deserialize_type(out, ((t_map*)ttype)->get_val_type()); - out << " in" << endl; + out << " in" << '\n'; indent_up(); - indent(out) << "Hashtbl.add " << con << " _k _v" << endl; + indent(out) << "Hashtbl.add " << con << " _k _v" << '\n'; indent_down(); indent_down(); indent(out) << "done; iprot#readMapEnd; " << con << ")"; indent_down(); } else if (ttype->is_set()) { - indent(out) << "(let (" << etype << "," << size << ") = iprot#readSetBegin in" << endl; - indent(out) << "let " << con << " = Hashtbl.create " << size << " in" << endl; + indent(out) << "(let (" << etype << "," << size << ") = iprot#readSetBegin in" << '\n'; + indent(out) << "let " << con << " = Hashtbl.create " << size << " in" << '\n'; indent_up(); - indent(out) << "for i = 1 to " << size << " do" << endl; + indent(out) << "for i = 1 to " << size << " do" << '\n'; indent_up(); indent(out) << "Hashtbl.add " << con << " "; generate_deserialize_type(out, ((t_set*)ttype)->get_elem_type()); - out << " true" << endl; + out << " true" << '\n'; indent_down(); indent(out) << "done; iprot#readSetEnd; " << con << ")"; indent_down(); } else if (ttype->is_list()) { - indent(out) << "(let (" << etype << "," << size << ") = iprot#readListBegin in" << endl; + indent(out) << "(let (" << etype << "," << size << ") = iprot#readListBegin in" << '\n'; indent_up(); indent(out) << "let " << con << " = (Array.to_list (Array.init " << size << " (fun _ -> "; generate_deserialize_type(out, ((t_list*)ttype)->get_elem_type()); - out << "))) in" << endl; + out << "))) in" << '\n'; indent_up(); indent(out) << "iprot#readListEnd; " << con << ")"; indent_down(); @@ -1510,7 +1508,7 @@ void t_ocaml_generator::generate_serialize_field(ostream& out, t_field* tfield, tfield->get_name().c_str(), type->get_name().c_str()); } - out << ";" << endl; + out << ";" << '\n'; } /** @@ -1528,38 +1526,38 @@ void t_ocaml_generator::generate_serialize_container(ostream& out, t_type* ttype if (ttype->is_map()) { indent(out) << "oprot#writeMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ","; out << type_to_enum(((t_map*)ttype)->get_val_type()) << ","; - out << "Hashtbl.length " << prefix << ");" << endl; + out << "Hashtbl.length " << prefix << ");" << '\n'; } else if (ttype->is_set()) { indent(out) << "oprot#writeSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ","; - out << "Hashtbl.length " << prefix << ");" << endl; + out << "Hashtbl.length " << prefix << ");" << '\n'; } else if (ttype->is_list()) { indent(out) << "oprot#writeListBegin(" << type_to_enum(((t_list*)ttype)->get_elem_type()) << ","; - out << "List.length " << prefix << ");" << endl; + out << "List.length " << prefix << ");" << '\n'; } if (ttype->is_map()) { string kiter = tmp("_kiter"); string viter = tmp("_viter"); - indent(out) << "Hashtbl.iter (fun " << kiter << " -> fun " << viter << " -> " << endl; + indent(out) << "Hashtbl.iter (fun " << kiter << " -> fun " << viter << " -> " << '\n'; indent_up(); generate_serialize_map_element(out, (t_map*)ttype, kiter, viter); indent_down(); - indent(out) << ") " << prefix << ";" << endl; + indent(out) << ") " << prefix << ";" << '\n'; } else if (ttype->is_set()) { string iter = tmp("_iter"); indent(out) << "Hashtbl.iter (fun " << iter << " -> fun _ -> "; indent_up(); generate_serialize_set_element(out, (t_set*)ttype, iter); indent_down(); - indent(out) << ") " << prefix << ";" << endl; + indent(out) << ") " << prefix << ";" << '\n'; } else if (ttype->is_list()) { string iter = tmp("_iter"); indent(out) << "List.iter (fun " << iter << " -> "; indent_up(); generate_serialize_list_element(out, (t_list*)ttype, iter); indent_down(); - indent(out) << ") " << prefix << ";" << endl; + indent(out) << ") " << prefix << ";" << '\n'; } if (ttype->is_map()) { diff --git a/compiler/cpp/src/thrift/generate/t_oop_generator.h b/compiler/cpp/src/thrift/generate/t_oop_generator.h index 88419620333..07b621639f7 100644 --- a/compiler/cpp/src/thrift/generate/t_oop_generator.h +++ b/compiler/cpp/src/thrift/generate/t_oop_generator.h @@ -42,13 +42,13 @@ class t_oop_generator : public t_generator { */ void scope_up(std::ostream& out) { - indent(out) << "{" << std::endl; + indent(out) << "{" << '\n'; indent_up(); } void scope_down(std::ostream& out) { indent_down(); - indent(out) << "}" << std::endl; + indent(out) << "}" << '\n'; } std::string upcase_string(std::string original) { diff --git a/compiler/cpp/src/thrift/generate/t_perl_generator.cc b/compiler/cpp/src/thrift/generate/t_perl_generator.cc index d133b2455b5..8e533ca2903 100644 --- a/compiler/cpp/src/thrift/generate/t_perl_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_perl_generator.cc @@ -37,8 +37,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /** * PERL code generator. * @@ -246,8 +244,8 @@ void t_perl_generator::init_generator() { f_types_ << autogen_comment() << perl_includes(); // Print header - f_consts_ << autogen_comment() << "package " << perl_namespace(program_) << "Constants;" << endl - << perl_includes() << endl; + f_consts_ << autogen_comment() << "package " << perl_namespace(program_) << "Constants;" << '\n' + << perl_includes() << '\n'; } /** @@ -271,10 +269,10 @@ string t_perl_generator::perl_includes() { */ void t_perl_generator::close_generator() { // Close types file - f_types_ << "1;" << endl; + f_types_ << "1;" << '\n'; f_types_.close(); - f_consts_ << "1;" << endl; + f_consts_ << "1;" << '\n'; f_consts_.close(); } @@ -294,13 +292,13 @@ void t_perl_generator::generate_typedef(t_typedef* ttypedef) { * @param tenum The enumeration */ void t_perl_generator::generate_enum(t_enum* tenum) { - f_types_ << "package " << perl_namespace(program_) << tenum->get_name() << ";" << endl; + f_types_ << "package " << perl_namespace(program_) << tenum->get_name() << ";" << '\n'; vector constants = tenum->get_constants(); vector::iterator c_iter; for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { int value = (*c_iter)->get_value(); - f_types_ << "use constant " << (*c_iter)->get_name() << " => " << value << ";" << endl; + f_types_ << "use constant " << (*c_iter)->get_name() << " => " << value << ";" << '\n'; } } @@ -314,7 +312,7 @@ void t_perl_generator::generate_const(t_const* tconst) { f_consts_ << "use constant " << name << " => "; f_consts_ << render_const_value(type, value); - f_consts_ << ";" << endl << endl; + f_consts_ << ";" << '\n' << '\n'; } /** @@ -355,7 +353,7 @@ string t_perl_generator::render_const_value(t_type* type, t_const_value* value) } else if (type->is_enum()) { out << value->get_integer(); } else if (type->is_struct() || type->is_xception()) { - out << perl_namespace(type->get_program()) << type->get_name() << "->new({" << endl; + out << perl_namespace(type->get_program()) << type->get_name() << "->new({" << '\n'; indent_up(); const vector& fields = ((t_struct*)type)->get_members(); @@ -376,14 +374,14 @@ string t_perl_generator::render_const_value(t_type* type, t_const_value* value) out << " => "; out << render_const_value(field_type, v_iter->second); out << ","; - out << endl; + out << '\n'; } indent_down(); indent(out) << "})"; } else if (type->is_map()) { t_type* ktype = ((t_map*)type)->get_key_type(); t_type* vtype = ((t_map*)type)->get_val_type(); - out << "{" << endl; + out << "{" << '\n'; indent_up(); const map& val = value->get_map(); @@ -392,7 +390,7 @@ string t_perl_generator::render_const_value(t_type* type, t_const_value* value) indent(out) << render_const_value(ktype, v_iter->first); out << " => "; out << render_const_value(vtype, v_iter->second); - out << "," << endl; + out << "," << '\n'; } indent_down(); indent(out) << "}"; @@ -403,7 +401,7 @@ string t_perl_generator::render_const_value(t_type* type, t_const_value* value) } else { etype = ((t_set*)type)->get_elem_type(); } - out << "[" << endl; + out << "[" << '\n'; indent_up(); const vector& val = value->get_list(); @@ -414,7 +412,7 @@ string t_perl_generator::render_const_value(t_type* type, t_const_value* value) if (type->is_set()) { out << " => 1"; } - out << "," << endl; + out << "," << '\n'; } indent_down(); indent(out) << "]"; @@ -480,12 +478,12 @@ void t_perl_generator::generate_perl_struct_definition(ostream& out, out << ") );\n"; } - out << endl; + out << '\n'; // new() indent_up(); - out << "sub new {" << endl << indent() << "my $classname = shift;" << endl << indent() - << "my $self = {};" << endl << indent() << "my $vals = shift || {};" << endl; + out << "sub new {" << '\n' << indent() << "my $classname = shift;" << '\n' << indent() + << "my $self = {};" << '\n' << indent() << "my $vals = shift || {};" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { string dval = "undef"; @@ -493,7 +491,7 @@ void t_perl_generator::generate_perl_struct_definition(ostream& out, if ((*m_iter)->get_value() != nullptr && !(t->is_struct() || t->is_xception())) { dval = render_const_value((*m_iter)->get_type(), (*m_iter)->get_value()); } - out << indent() << "$self->{" << (*m_iter)->get_name() << "} = " << dval << ";" << endl; + out << indent() << "$self->{" << (*m_iter)->get_name() << "} = " << dval << ";" << '\n'; } // Generate constructor from array @@ -503,27 +501,27 @@ void t_perl_generator::generate_perl_struct_definition(ostream& out, t_type* t = get_true_type((*m_iter)->get_type()); if ((*m_iter)->get_value() != nullptr && (t->is_struct() || t->is_xception())) { indent(out) << "$self->{" << (*m_iter)->get_name() - << "} = " << render_const_value(t, (*m_iter)->get_value()) << ";" << endl; + << "} = " << render_const_value(t, (*m_iter)->get_value()) << ";" << '\n'; } } - out << indent() << "if (UNIVERSAL::isa($vals,'HASH')) {" << endl; + out << indent() << "if (UNIVERSAL::isa($vals,'HASH')) {" << '\n'; indent_up(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - out << indent() << "if (defined $vals->{" << (*m_iter)->get_name() << "}) {" << endl + out << indent() << "if (defined $vals->{" << (*m_iter)->get_name() << "}) {" << '\n' << indent() << " $self->{" << (*m_iter)->get_name() << "} = $vals->{" - << (*m_iter)->get_name() << "};" << endl << indent() << "}" << endl; + << (*m_iter)->get_name() << "};" << '\n' << indent() << "}" << '\n'; } indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } - out << indent() << "return bless ($self, $classname);" << endl; + out << indent() << "return bless ($self, $classname);" << '\n'; indent_down(); out << "}\n\n"; - out << "sub getName {" << endl << indent() << " return '" << tstruct->get_name() << "';" << endl - << indent() << "}" << endl << endl; + out << "sub getName {" << '\n' << indent() << " return '" << tstruct->get_name() << "';" << '\n' + << indent() << "}" << '\n' << '\n'; generate_perl_struct_reader(out, tstruct); generate_perl_struct_writer(out, tstruct); @@ -536,32 +534,32 @@ void t_perl_generator::generate_perl_struct_reader(ostream& out, t_struct* tstru const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; - out << "sub read {" << endl; + out << "sub read {" << '\n'; indent_up(); - out << indent() << "my ($self, $input) = @_;" << endl << indent() << "my $xfer = 0;" << endl - << indent() << "my $fname;" << endl << indent() << "my $ftype = 0;" << endl << indent() - << "my $fid = 0;" << endl; + out << indent() << "my ($self, $input) = @_;" << '\n' << indent() << "my $xfer = 0;" << '\n' + << indent() << "my $fname;" << '\n' << indent() << "my $ftype = 0;" << '\n' << indent() + << "my $fid = 0;" << '\n'; - indent(out) << "$xfer += $input->readStructBegin(\\$fname);" << endl; + indent(out) << "$xfer += $input->readStructBegin(\\$fname);" << '\n'; // Loop over reading in fields - indent(out) << "while (1)" << endl; + indent(out) << "while (1)" << '\n'; scope_up(out); - indent(out) << "$xfer += $input->readFieldBegin(\\$fname, \\$ftype, \\$fid);" << endl; + indent(out) << "$xfer += $input->readFieldBegin(\\$fname, \\$ftype, \\$fid);" << '\n'; // Check for field STOP marker and break - indent(out) << "if ($ftype == Thrift::TType::STOP) {" << endl; + indent(out) << "if ($ftype == Thrift::TType::STOP) {" << '\n'; indent_up(); - indent(out) << "last;" << endl; + indent(out) << "last;" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; // Switch statement on the field we are reading - indent(out) << "SWITCH: for($fid)" << endl; + indent(out) << "SWITCH: for($fid)" << '\n'; scope_up(out); @@ -569,34 +567,34 @@ void t_perl_generator::generate_perl_struct_reader(ostream& out, t_struct* tstru for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { indent(out) << "/^" << (*f_iter)->get_key() << "$/ && do{"; - indent(out) << "if ($ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl; + indent(out) << "if ($ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n'; indent_up(); generate_deserialize_field(out, *f_iter, "self->"); indent_down(); - indent(out) << "} else {" << endl; + indent(out) << "} else {" << '\n'; - indent(out) << " $xfer += $input->skip($ftype);" << endl; + indent(out) << " $xfer += $input->skip($ftype);" << '\n'; - out << indent() << "}" << endl << indent() << "last; };" << endl; + out << indent() << "}" << '\n' << indent() << "last; };" << '\n'; } // In the default case we skip the field - indent(out) << " $xfer += $input->skip($ftype);" << endl; + indent(out) << " $xfer += $input->skip($ftype);" << '\n'; scope_down(out); - indent(out) << "$xfer += $input->readFieldEnd();" << endl; + indent(out) << "$xfer += $input->readFieldEnd();" << '\n'; scope_down(out); - indent(out) << "$xfer += $input->readStructEnd();" << endl; + indent(out) << "$xfer += $input->readStructEnd();" << '\n'; - indent(out) << "return $xfer;" << endl; + indent(out) << "return $xfer;" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } /** @@ -607,38 +605,38 @@ void t_perl_generator::generate_perl_struct_writer(ostream& out, t_struct* tstru const vector& fields = tstruct->get_sorted_members(); vector::const_iterator f_iter; - out << "sub write {" << endl; + out << "sub write {" << '\n'; indent_up(); - indent(out) << "my ($self, $output) = @_;" << endl; - indent(out) << "my $xfer = 0;" << endl; + indent(out) << "my ($self, $output) = @_;" << '\n'; + indent(out) << "my $xfer = 0;" << '\n'; - indent(out) << "$xfer += $output->writeStructBegin('" << name << "');" << endl; + indent(out) << "$xfer += $output->writeStructBegin('" << name << "');" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - out << indent() << "if (defined $self->{" << (*f_iter)->get_name() << "}) {" << endl; + out << indent() << "if (defined $self->{" << (*f_iter)->get_name() << "}) {" << '\n'; indent_up(); indent(out) << "$xfer += $output->writeFieldBegin(" << "'" << (*f_iter)->get_name() << "', " << type_to_enum((*f_iter)->get_type()) - << ", " << (*f_iter)->get_key() << ");" << endl; + << ", " << (*f_iter)->get_key() << ");" << '\n'; // Write field contents generate_serialize_field(out, *f_iter, "self->"); - indent(out) << "$xfer += $output->writeFieldEnd();" << endl; + indent(out) << "$xfer += $output->writeFieldEnd();" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } - out << indent() << "$xfer += $output->writeFieldStop();" << endl << indent() - << "$xfer += $output->writeStructEnd();" << endl; + out << indent() << "$xfer += $output->writeFieldStop();" << '\n' << indent() + << "$xfer += $output->writeStructEnd();" << '\n'; - out << indent() << "return $xfer;" << endl; + out << indent() << "return $xfer;" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; } /** @@ -655,13 +653,13 @@ void t_perl_generator::generate_use_includes(std::ostream& os, bool& done, t_typ std::vector& currInc = current->get_includes(); std::vector::size_type numInc = currInc.size(); if (selfish) { - os << "use " << perl_namespace(current) << "Types;" << endl; + os << "use " << perl_namespace(current) << "Types;" << '\n'; } for (std::vector::size_type i = 0; i < numInc; ++i) { t_program* incProgram = currInc.at(i); - os << "use " << perl_namespace(incProgram) << "Types;" << endl; + os << "use " << perl_namespace(incProgram) << "Types;" << '\n'; } - os << endl; + os << '\n'; done = true; } } @@ -683,10 +681,10 @@ void t_perl_generator::generate_service(t_service* tservice) { t_service* extends_s = tservice->get_extends(); if (extends_s != nullptr) { f_service_ << "use " << perl_namespace(extends_s->get_program()) << extends_s->get_name() << ";" - << endl; + << '\n'; } - f_service_ << endl; + f_service_ << '\n'; // Generate the three main parts of the service (well, two for now in PERL) generate_service_helpers(tservice); @@ -696,7 +694,7 @@ void t_perl_generator::generate_service(t_service* tservice) { generate_service_processor(tservice); // Close service file - f_service_ << "1;" << endl; + f_service_ << "1;" << '\n'; f_service_.close(); } @@ -721,59 +719,59 @@ void t_perl_generator::generate_service_processor(t_service* tservice) { indent_up(); // Generate the header portion - f_service_ << "package " << perl_namespace(program_) << service_name_ << "Processor;" << endl - << endl << "use strict;" << endl << extends_processor << endl << endl; + f_service_ << "package " << perl_namespace(program_) << service_name_ << "Processor;" << '\n' + << '\n' << "use strict;" << '\n' << extends_processor << '\n' << '\n'; if (extends.empty()) { - f_service_ << "sub new {" << endl; + f_service_ << "sub new {" << '\n'; indent_up(); - f_service_ << indent() << "my ($classname, $handler) = @_;" << endl << indent() - << "my $self = {};" << endl; + f_service_ << indent() << "my ($classname, $handler) = @_;" << '\n' << indent() + << "my $self = {};" << '\n'; - f_service_ << indent() << "$self->{handler} = $handler;" << endl; + f_service_ << indent() << "$self->{handler} = $handler;" << '\n'; - f_service_ << indent() << "return bless ($self, $classname);" << endl; + f_service_ << indent() << "return bless ($self, $classname);" << '\n'; indent_down(); - f_service_ << "}" << endl << endl; + f_service_ << "}" << '\n' << '\n'; } // Generate the server implementation - f_service_ << "sub process {" << endl; + f_service_ << "sub process {" << '\n'; indent_up(); - f_service_ << indent() << "my ($self, $input, $output) = @_;" << endl; + f_service_ << indent() << "my ($self, $input, $output) = @_;" << '\n'; - f_service_ << indent() << "my $rseqid = 0;" << endl << indent() << "my $fname = undef;" << endl - << indent() << "my $mtype = 0;" << endl << endl; + f_service_ << indent() << "my $rseqid = 0;" << '\n' << indent() << "my $fname = undef;" << '\n' + << indent() << "my $mtype = 0;" << '\n' << '\n'; - f_service_ << indent() << "$input->readMessageBegin(\\$fname, \\$mtype, \\$rseqid);" << endl; + f_service_ << indent() << "$input->readMessageBegin(\\$fname, \\$mtype, \\$rseqid);" << '\n'; // HOT: check for method implementation - f_service_ << indent() << "my $methodname = 'process_'.$fname;" << endl << indent() - << "if (!$self->can($methodname)) {" << endl; + f_service_ << indent() << "my $methodname = 'process_'.$fname;" << '\n' << indent() + << "if (!$self->can($methodname)) {" << '\n'; indent_up(); - f_service_ << indent() << "$input->skip(Thrift::TType::STRUCT);" << endl << indent() - << "$input->readMessageEnd();" << endl << indent() + f_service_ << indent() << "$input->skip(Thrift::TType::STRUCT);" << '\n' << indent() + << "$input->readMessageEnd();" << '\n' << indent() << "my $x = Thrift::TApplicationException->new('Function '.$fname.' not implemented.', " - "Thrift::TApplicationException::UNKNOWN_METHOD);" << endl << indent() - << "$output->writeMessageBegin($fname, Thrift::TMessageType::EXCEPTION, $rseqid);" << endl - << indent() << "$x->write($output);" << endl << indent() - << "$output->writeMessageEnd();" << endl << indent() - << "$output->getTransport()->flush();" << endl << indent() << "return;" << endl; + "Thrift::TApplicationException::UNKNOWN_METHOD);" << '\n' << indent() + << "$output->writeMessageBegin($fname, Thrift::TMessageType::EXCEPTION, $rseqid);" << '\n' + << indent() << "$x->write($output);" << '\n' << indent() + << "$output->writeMessageEnd();" << '\n' << indent() + << "$output->getTransport()->flush();" << '\n' << indent() << "return;" << '\n'; indent_down(); - f_service_ << indent() << "}" << endl << indent() - << "$self->$methodname($rseqid, $input, $output);" << endl << indent() << "return 1;" - << endl; + f_service_ << indent() << "}" << '\n' << indent() + << "$self->$methodname($rseqid, $input, $output);" << '\n' << indent() << "return 1;" + << '\n'; indent_down(); - f_service_ << "}" << endl << endl; + f_service_ << "}" << '\n' << '\n'; // Generate the process subfunctions for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -788,21 +786,21 @@ void t_perl_generator::generate_service_processor(t_service* tservice) { */ void t_perl_generator::generate_process_function(t_service* tservice, t_function* tfunction) { // Open function - f_service_ << "sub process_" << tfunction->get_name() << " {" << endl; + f_service_ << "sub process_" << tfunction->get_name() << " {" << '\n'; indent_up(); - f_service_ << indent() << "my ($self, $seqid, $input, $output) = @_;" << endl; + f_service_ << indent() << "my ($self, $seqid, $input, $output) = @_;" << '\n'; string argsname = perl_namespace(tservice->get_program()) + service_name_ + "_" + tfunction->get_name() + "_args"; string resultname = perl_namespace(tservice->get_program()) + service_name_ + "_" + tfunction->get_name() + "_result"; - f_service_ << indent() << "my $args = " << argsname << "->new();" << endl << indent() - << "$args->read($input);" << endl; + f_service_ << indent() << "my $args = " << argsname << "->new();" << '\n' << indent() + << "$args->read($input);" << '\n'; - f_service_ << indent() << "$input->readMessageEnd();" << endl; + f_service_ << indent() << "$input->readMessageEnd();" << '\n'; t_struct* xs = tfunction->get_xceptions(); const std::vector& xceptions = xs->get_members(); @@ -810,12 +808,12 @@ void t_perl_generator::generate_process_function(t_service* tservice, t_function // Declare result for non oneway function if (!tfunction->is_oneway()) { - f_service_ << indent() << "my $result = " << resultname << "->new();" << endl; + f_service_ << indent() << "my $result = " << resultname << "->new();" << '\n'; } // Try block for a function with exceptions if (xceptions.size() > 0) { - f_service_ << indent() << "eval {" << endl; + f_service_ << indent() << "eval {" << '\n'; indent_up(); } @@ -838,55 +836,55 @@ void t_perl_generator::generate_process_function(t_service* tservice, t_function } f_service_ << "$args->" << (*f_iter)->get_name(); } - f_service_ << ");" << endl; + f_service_ << ");" << '\n'; if (!tfunction->is_oneway() && xceptions.size() > 0) { indent_down(); for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { f_service_ << indent() << "}; if( UNIVERSAL::isa($@,'" << perl_namespace((*x_iter)->get_type()->get_program()) - << (*x_iter)->get_type()->get_name() << "') ){ " << endl; + << (*x_iter)->get_type()->get_name() << "') ){ " << '\n'; indent_up(); - f_service_ << indent() << "$result->{" << (*x_iter)->get_name() << "} = $@;" << endl; - f_service_ << indent() << "$@ = undef;" << endl; + f_service_ << indent() << "$result->{" << (*x_iter)->get_name() << "} = $@;" << '\n'; + f_service_ << indent() << "$@ = undef;" << '\n'; indent_down(); f_service_ << indent(); } - f_service_ << "}" << endl; + f_service_ << "}" << '\n'; // catch-all for unexpected exceptions (THRIFT-3191) - f_service_ << indent() << "if ($@) {" << endl; + f_service_ << indent() << "if ($@) {" << '\n'; indent_up(); - f_service_ << indent() << "$@ =~ s/^\\s+|\\s+$//g;" << endl - << indent() << "my $err = Thrift::TApplicationException->new(\"Unexpected Exception: \" . $@, Thrift::TApplicationException::INTERNAL_ERROR);" << endl - << indent() << "$output->writeMessageBegin('" << tfunction->get_name() << "', Thrift::TMessageType::EXCEPTION, $seqid);" << endl - << indent() << "$err->write($output);" << endl - << indent() << "$output->writeMessageEnd();" << endl - << indent() << "$output->getTransport()->flush();" << endl - << indent() << "$@ = undef;" << endl - << indent() << "return;" << endl; + f_service_ << indent() << "$@ =~ s/^\\s+|\\s+$//g;" << '\n' + << indent() << "my $err = Thrift::TApplicationException->new(\"Unexpected Exception: \" . $@, Thrift::TApplicationException::INTERNAL_ERROR);" << '\n' + << indent() << "$output->writeMessageBegin('" << tfunction->get_name() << "', Thrift::TMessageType::EXCEPTION, $seqid);" << '\n' + << indent() << "$err->write($output);" << '\n' + << indent() << "$output->writeMessageEnd();" << '\n' + << indent() << "$output->getTransport()->flush();" << '\n' + << indent() << "$@ = undef;" << '\n' + << indent() << "return;" << '\n'; indent_down(); - f_service_ << indent() << "}" << endl; + f_service_ << indent() << "}" << '\n'; } // Shortcut out here for oneway functions if (tfunction->is_oneway()) { - f_service_ << indent() << "return;" << endl; + f_service_ << indent() << "return;" << '\n'; indent_down(); - f_service_ << "}" << endl; + f_service_ << "}" << '\n'; return; } // Serialize the reply - f_service_ << indent() << "$output->writeMessageBegin('" << tfunction->get_name() << "', Thrift::TMessageType::REPLY, $seqid);" << endl - << indent() << "$result->write($output);" << endl - << indent() << "$output->writeMessageEnd();" << endl - << indent() << "$output->getTransport()->flush();" << endl; + f_service_ << indent() << "$output->writeMessageBegin('" << tfunction->get_name() << "', Thrift::TMessageType::REPLY, $seqid);" << '\n' + << indent() << "$result->write($output);" << '\n' + << indent() << "$output->writeMessageEnd();" << '\n' + << indent() << "$output->getTransport()->flush();" << '\n'; // Close function indent_down(); - f_service_ << "}" << endl << endl; + f_service_ << "}" << '\n' << '\n'; } /** @@ -898,7 +896,7 @@ void t_perl_generator::generate_service_helpers(t_service* tservice) { vector functions = tservice->get_functions(); vector::iterator f_iter; - f_service_ << "# HELPER FUNCTIONS AND STRUCTURES" << endl << endl; + f_service_ << "# HELPER FUNCTIONS AND STRUCTURES" << '\n' << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { t_struct* ts = (*f_iter)->get_arglist(); @@ -945,15 +943,15 @@ void t_perl_generator::generate_service_interface(t_service* tservice) { + "If);"; } - f_service_ << "package " << perl_namespace(program_) << service_name_ << "If;" << endl << endl - << "use strict;" << endl << extends_if << endl << endl; + f_service_ << "package " << perl_namespace(program_) << service_name_ << "If;" << '\n' << '\n' + << "use strict;" << '\n' << extends_if << '\n' << '\n'; indent_up(); vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { - f_service_ << "sub " << function_signature(*f_iter) << endl << " die 'implement interface';\n}" - << endl << endl; + f_service_ << "sub " << function_signature(*f_iter) << '\n' << " die 'implement interface';\n}" + << '\n' << '\n'; } indent_down(); } @@ -970,31 +968,31 @@ void t_perl_generator::generate_service_rest(t_service* tservice) { extends_if = "use base qw(" + perl_namespace(extends_s->get_program()) + extends_s->get_name() + "Rest);"; } - f_service_ << "package " << perl_namespace(program_) << service_name_ << "Rest;" << endl << endl - << "use strict;" << endl << extends_if << endl << endl; + f_service_ << "package " << perl_namespace(program_) << service_name_ << "Rest;" << '\n' << '\n' + << "use strict;" << '\n' << extends_if << '\n' << '\n'; if (extends.empty()) { - f_service_ << "sub new {" << endl; + f_service_ << "sub new {" << '\n'; indent_up(); - f_service_ << indent() << "my ($classname, $impl) = @_;" << endl << indent() - << "my $self ={ impl => $impl };" << endl << endl << indent() - << "return bless($self,$classname);" << endl; + f_service_ << indent() << "my ($classname, $impl) = @_;" << '\n' << indent() + << "my $self ={ impl => $impl };" << '\n' << '\n' << indent() + << "return bless($self,$classname);" << '\n'; indent_down(); - f_service_ << "}" << endl << endl; + f_service_ << "}" << '\n' << '\n'; } vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { - f_service_ << "sub " << (*f_iter)->get_name() << "{" << endl; + f_service_ << "sub " << (*f_iter)->get_name() << "{" << '\n'; indent_up(); - f_service_ << indent() << "my ($self, $request) = @_;" << endl << endl; + f_service_ << indent() << "my ($self, $request) = @_;" << '\n' << '\n'; const vector& args = (*f_iter)->get_arglist()->get_members(); vector::const_iterator a_iter; @@ -1002,19 +1000,19 @@ void t_perl_generator::generate_service_rest(t_service* tservice) { //t_type* atype = get_true_type((*a_iter)->get_type()); string req = "$request->{'" + (*a_iter)->get_name() + "'}"; f_service_ << indent() << "my $" << (*a_iter)->get_name() << " = (" << req << ") ? " << req - << " : undef;" << endl; + << " : undef;" << '\n'; /* slist no longer supported if (atype->is_string() && ((t_base_type*)atype)->is_string_list()) { f_service_ << indent() << "my @" << (*a_iter)->get_name() << " = split(/,/, $" - << (*a_iter)->get_name() << ");" << endl << indent() << "$" - << (*a_iter)->get_name() << " = \\@" << (*a_iter)->get_name() << endl; + << (*a_iter)->get_name() << ");" << '\n' << indent() << "$" + << (*a_iter)->get_name() << " = \\@" << (*a_iter)->get_name() << '\n'; } */ } f_service_ << indent() << "return $self->{impl}->" << (*f_iter)->get_name() << "(" - << argument_list((*f_iter)->get_arglist()) << ");" << endl; + << argument_list((*f_iter)->get_arglist()) << ");" << '\n'; indent_down(); - indent(f_service_) << "}" << endl << endl; + indent(f_service_) << "}" << '\n' << '\n'; } } @@ -1032,31 +1030,31 @@ void t_perl_generator::generate_service_client(t_service* tservice) { extends_client = "use base qw(" + extends + "Client);"; } - f_service_ << "package " << perl_namespace(program_) << service_name_ << "Client;" << endl << endl - << extends_client << endl << "use base qw(" << perl_namespace(program_) - << service_name_ << "If);" << endl; + f_service_ << "package " << perl_namespace(program_) << service_name_ << "Client;" << '\n' << '\n' + << extends_client << '\n' << "use base qw(" << perl_namespace(program_) + << service_name_ << "If);" << '\n'; // Constructor function - f_service_ << "sub new {" << endl; + f_service_ << "sub new {" << '\n'; indent_up(); - f_service_ << indent() << "my ($classname, $input, $output) = @_;" << endl << indent() - << "my $self = {};" << endl; + f_service_ << indent() << "my ($classname, $input, $output) = @_;" << '\n' << indent() + << "my $self = {};" << '\n'; if (!extends.empty()) { - f_service_ << indent() << "$self = $classname->SUPER::new($input, $output);" << endl; + f_service_ << indent() << "$self = $classname->SUPER::new($input, $output);" << '\n'; } else { - f_service_ << indent() << "$self->{input} = $input;" << endl << indent() - << "$self->{output} = defined $output ? $output : $input;" << endl << indent() - << "$self->{seqid} = 0;" << endl; + f_service_ << indent() << "$self->{input} = $input;" << '\n' << indent() + << "$self->{output} = defined $output ? $output : $input;" << '\n' << indent() + << "$self->{seqid} = 0;" << '\n'; } - f_service_ << indent() << "return bless($self,$classname);" << endl; + f_service_ << indent() << "return bless($self,$classname);" << '\n'; indent_down(); - f_service_ << "}" << endl << endl; + f_service_ << "}" << '\n' << '\n'; // Generate client method implementations vector functions = tservice->get_functions(); @@ -1068,7 +1066,7 @@ void t_perl_generator::generate_service_client(t_service* tservice) { string funname = (*f_iter)->get_name(); // Open function - f_service_ << "sub " << function_signature(*f_iter) << endl; + f_service_ << "sub " << function_signature(*f_iter) << '\n'; indent_up(); @@ -1083,21 +1081,21 @@ void t_perl_generator::generate_service_client(t_service* tservice) { } f_service_ << "$" << (*fld_iter)->get_name(); } - f_service_ << ");" << endl; + f_service_ << ");" << '\n'; if (!(*f_iter)->is_oneway()) { f_service_ << indent(); if (!(*f_iter)->get_returntype()->is_void()) { f_service_ << "return "; } - f_service_ << "$self->recv_" << funname << "();" << endl; + f_service_ << "$self->recv_" << funname << "();" << '\n'; } indent_down(); - f_service_ << "}" << endl << endl; + f_service_ << "}" << '\n' << '\n'; - f_service_ << "sub send_" << function_signature(*f_iter) << endl; + f_service_ << "sub send_" << function_signature(*f_iter) << '\n'; indent_up(); @@ -1107,23 +1105,23 @@ void t_perl_generator::generate_service_client(t_service* tservice) { // Serialize the request header f_service_ << indent() << "$self->{output}->writeMessageBegin('" << (*f_iter)->get_name() << "', " << ((*f_iter)->is_oneway() ? "Thrift::TMessageType::ONEWAY" : "Thrift::TMessageType::CALL") - << ", $self->{seqid});" << endl; + << ", $self->{seqid});" << '\n'; - f_service_ << indent() << "my $args = " << argsname << "->new();" << endl; + f_service_ << indent() << "my $args = " << argsname << "->new();" << '\n'; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { f_service_ << indent() << "$args->{" << (*fld_iter)->get_name() << "} = $" - << (*fld_iter)->get_name() << ";" << endl; + << (*fld_iter)->get_name() << ";" << '\n'; } // Write to the stream - f_service_ << indent() << "$args->write($self->{output});" << endl << indent() - << "$self->{output}->writeMessageEnd();" << endl << indent() - << "$self->{output}->getTransport()->flush();" << endl; + f_service_ << indent() << "$args->write($self->{output});" << '\n' << indent() + << "$self->{output}->writeMessageEnd();" << '\n' << indent() + << "$self->{output}->getTransport()->flush();" << '\n'; indent_down(); - f_service_ << "}" << endl; + f_service_ << "}" << '\n'; if (!(*f_iter)->is_oneway()) { std::string resultname = perl_namespace(tservice->get_program()) + service_name_ + "_" @@ -1134,29 +1132,29 @@ void t_perl_generator::generate_service_client(t_service* tservice) { string("recv_") + (*f_iter)->get_name(), &noargs); // Open function - f_service_ << endl << "sub " << function_signature(&recv_function) << endl; + f_service_ << '\n' << "sub " << function_signature(&recv_function) << '\n'; indent_up(); - f_service_ << indent() << "my $rseqid = 0;" << endl << indent() << "my $fname;" << endl - << indent() << "my $mtype = 0;" << endl << endl; + f_service_ << indent() << "my $rseqid = 0;" << '\n' << indent() << "my $fname;" << '\n' + << indent() << "my $mtype = 0;" << '\n' << '\n'; f_service_ << indent() << "$self->{input}->readMessageBegin(\\$fname, \\$mtype, \\$rseqid);" - << endl << indent() << "if ($mtype == Thrift::TMessageType::EXCEPTION) {" << endl - << indent() << " my $x = Thrift::TApplicationException->new();" << endl << indent() - << " $x->read($self->{input});" << endl << indent() - << " $self->{input}->readMessageEnd();" << endl << indent() << " die $x;" << endl - << indent() << "}" << endl; + << '\n' << indent() << "if ($mtype == Thrift::TMessageType::EXCEPTION) {" << '\n' + << indent() << " my $x = Thrift::TApplicationException->new();" << '\n' << indent() + << " $x->read($self->{input});" << '\n' << indent() + << " $self->{input}->readMessageEnd();" << '\n' << indent() << " die $x;" << '\n' + << indent() << "}" << '\n'; - f_service_ << indent() << "my $result = " << resultname << "->new();" << endl << indent() - << "$result->read($self->{input});" << endl; + f_service_ << indent() << "my $result = " << resultname << "->new();" << '\n' << indent() + << "$result->read($self->{input});" << '\n'; - f_service_ << indent() << "$self->{input}->readMessageEnd();" << endl << endl; + f_service_ << indent() << "$self->{input}->readMessageEnd();" << '\n' << '\n'; // Careful, only return result if not a void function if (!(*f_iter)->get_returntype()->is_void()) { - f_service_ << indent() << "if (defined $result->{success} ) {" << endl << indent() - << " return $result->{success};" << endl << indent() << "}" << endl; + f_service_ << indent() << "if (defined $result->{success} ) {" << '\n' << indent() + << " return $result->{success};" << '\n' << indent() << "}" << '\n'; } t_struct* xs = (*f_iter)->get_xceptions(); @@ -1164,21 +1162,21 @@ void t_perl_generator::generate_service_client(t_service* tservice) { vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { f_service_ << indent() << "if (defined $result->{" << (*x_iter)->get_name() << "}) {" - << endl << indent() << " die $result->{" << (*x_iter)->get_name() << "};" - << endl << indent() << "}" << endl; + << '\n' << indent() << " die $result->{" << (*x_iter)->get_name() << "};" + << '\n' << indent() << "}" << '\n'; } // Careful, only return _result if not a void function if ((*f_iter)->get_returntype()->is_void()) { - indent(f_service_) << "return;" << endl; + indent(f_service_) << "return;" << '\n'; } else { f_service_ << indent() << "die \"" << (*f_iter)->get_name() << " failed: unknown result\";" - << endl; + << '\n'; } // Close function indent_down(); - f_service_ << "}" << endl; + f_service_ << "}" << '\n'; } } } @@ -1244,7 +1242,7 @@ void t_perl_generator::generate_deserialize_field(ostream& out, } else if (type->is_enum()) { out << "readI32(\\$" << name << ");"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", @@ -1263,8 +1261,8 @@ void t_perl_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) { out << indent() << "$" << prefix << " = " << perl_namespace(tstruct->get_program()) - << tstruct->get_name() << "->new();" << endl << indent() << "$xfer += $" << prefix - << "->read($input);" << endl; + << tstruct->get_name() << "->new();" << '\n' << indent() << "$xfer += $" << prefix + << "->read($input);" << '\n'; } void t_perl_generator::generate_deserialize_container(ostream& out, t_type* ttype, string prefix) { @@ -1280,33 +1278,33 @@ void t_perl_generator::generate_deserialize_container(ostream& out, t_type* ttyp t_field fvtype(g_type_i8, vtype); t_field fetype(g_type_i8, etype); - out << indent() << "my $" << size << " = 0;" << endl; + out << indent() << "my $" << size << " = 0;" << '\n'; // Declare variables, read header if (ttype->is_map()) { - out << indent() << "$" << prefix << " = {};" << endl << indent() << "my $" << ktype << " = 0;" - << endl << indent() << "my $" << vtype << " = 0;" << endl; + out << indent() << "$" << prefix << " = {};" << '\n' << indent() << "my $" << ktype << " = 0;" + << '\n' << indent() << "my $" << vtype << " = 0;" << '\n'; out << indent() << "$xfer += $input->readMapBegin(" - << "\\$" << ktype << ", \\$" << vtype << ", \\$" << size << ");" << endl; + << "\\$" << ktype << ", \\$" << vtype << ", \\$" << size << ");" << '\n'; } else if (ttype->is_set()) { - out << indent() << "$" << prefix << " = {};" << endl << indent() << "my $" << etype << " = 0;" - << endl << indent() << "$xfer += $input->readSetBegin(" - << "\\$" << etype << ", \\$" << size << ");" << endl; + out << indent() << "$" << prefix << " = {};" << '\n' << indent() << "my $" << etype << " = 0;" + << '\n' << indent() << "$xfer += $input->readSetBegin(" + << "\\$" << etype << ", \\$" << size << ");" << '\n'; } else if (ttype->is_list()) { - out << indent() << "$" << prefix << " = [];" << endl << indent() << "my $" << etype << " = 0;" - << endl << indent() << "$xfer += $input->readListBegin(" - << "\\$" << etype << ", \\$" << size << ");" << endl; + out << indent() << "$" << prefix << " = [];" << '\n' << indent() << "my $" << etype << " = 0;" + << '\n' << indent() << "$xfer += $input->readListBegin(" + << "\\$" << etype << ", \\$" << size << ");" << '\n'; } // For loop iterates over elements string i = tmp("_i"); indent(out) << "for (my $" << i << " = 0; $" << i << " < $" << size << "; ++$" << i << ")" - << endl; + << '\n'; scope_up(out); @@ -1322,11 +1320,11 @@ void t_perl_generator::generate_deserialize_container(ostream& out, t_type* ttyp // Read container end if (ttype->is_map()) { - indent(out) << "$xfer += $input->readMapEnd();" << endl; + indent(out) << "$xfer += $input->readMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "$xfer += $input->readSetEnd();" << endl; + indent(out) << "$xfer += $input->readSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "$xfer += $input->readListEnd();" << endl; + indent(out) << "$xfer += $input->readListEnd();" << '\n'; } scope_down(out); @@ -1341,24 +1339,24 @@ void t_perl_generator::generate_deserialize_map_element(ostream& out, t_map* tma t_field fkey(tmap->get_key_type(), key); t_field fval(tmap->get_val_type(), val); - indent(out) << declare_field(&fkey, true, true) << endl; - indent(out) << declare_field(&fval, true, true) << endl; + indent(out) << declare_field(&fkey, true, true) << '\n'; + indent(out) << declare_field(&fval, true, true) << '\n'; generate_deserialize_field(out, &fkey); generate_deserialize_field(out, &fval); - indent(out) << "$" << prefix << "->{$" << key << "} = $" << val << ";" << endl; + indent(out) << "$" << prefix << "->{$" << key << "} = $" << val << ";" << '\n'; } void t_perl_generator::generate_deserialize_set_element(ostream& out, t_set* tset, string prefix) { string elem = tmp("elem"); t_field felem(tset->get_elem_type(), elem); - indent(out) << "my $" << elem << " = undef;" << endl; + indent(out) << "my $" << elem << " = undef;" << '\n'; generate_deserialize_field(out, &felem); - indent(out) << "$" << prefix << "->{$" << elem << "} = 1;" << endl; + indent(out) << "$" << prefix << "->{$" << elem << "} = 1;" << '\n'; } void t_perl_generator::generate_deserialize_list_element(ostream& out, @@ -1367,11 +1365,11 @@ void t_perl_generator::generate_deserialize_list_element(ostream& out, string elem = tmp("elem"); t_field felem(tlist->get_elem_type(), elem); - indent(out) << "my $" << elem << " = undef;" << endl; + indent(out) << "my $" << elem << " = undef;" << '\n'; generate_deserialize_field(out, &felem); - indent(out) << "push(@{$" << prefix << "},$" << elem << ");" << endl; + indent(out) << "push(@{$" << prefix << "},$" << elem << ");" << '\n'; } /** @@ -1435,7 +1433,7 @@ void t_perl_generator::generate_serialize_field(ostream& out, t_field* tfield, s } else if (type->is_enum()) { out << "writeI32($" << name << ");"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n", @@ -1453,7 +1451,7 @@ void t_perl_generator::generate_serialize_field(ostream& out, t_field* tfield, s */ void t_perl_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) { (void)tstruct; - indent(out) << "$xfer += $" << prefix << "->write($output);" << endl; + indent(out) << "$xfer += $" << prefix << "->write($output);" << '\n'; } /** @@ -1466,17 +1464,17 @@ void t_perl_generator::generate_serialize_container(ostream& out, t_type* ttype, indent(out) << "$xfer += $output->writeMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " - << "scalar(keys %{$" << prefix << "}));" << endl; + << "scalar(keys %{$" << prefix << "}));" << '\n'; } else if (ttype->is_set()) { indent(out) << "$xfer += $output->writeSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " - << "scalar(@{$" << prefix << "}));" << endl; + << "scalar(@{$" << prefix << "}));" << '\n'; } else if (ttype->is_list()) { indent(out) << "$xfer += $output->writeListBegin(" << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " - << "scalar(@{$" << prefix << "}));" << endl; + << "scalar(@{$" << prefix << "}));" << '\n'; } scope_up(out); @@ -1485,7 +1483,7 @@ void t_perl_generator::generate_serialize_container(ostream& out, t_type* ttype, string kiter = tmp("kiter"); string viter = tmp("viter"); indent(out) << "while( my ($" << kiter << ",$" << viter << ") = each %{$" << prefix << "}) " - << endl; + << '\n'; scope_up(out); generate_serialize_map_element(out, (t_map*)ttype, kiter, viter); @@ -1493,14 +1491,14 @@ void t_perl_generator::generate_serialize_container(ostream& out, t_type* ttype, } else if (ttype->is_set()) { string iter = tmp("iter"); - indent(out) << "foreach my $" << iter << " (@{$" << prefix << "})" << endl; + indent(out) << "foreach my $" << iter << " (@{$" << prefix << "})" << '\n'; scope_up(out); generate_serialize_set_element(out, (t_set*)ttype, iter); scope_down(out); } else if (ttype->is_list()) { string iter = tmp("iter"); - indent(out) << "foreach my $" << iter << " (@{$" << prefix << "}) " << endl; + indent(out) << "foreach my $" << iter << " (@{$" << prefix << "}) " << '\n'; scope_up(out); generate_serialize_list_element(out, (t_list*)ttype, iter); scope_down(out); @@ -1509,11 +1507,11 @@ void t_perl_generator::generate_serialize_container(ostream& out, t_type* ttype, scope_down(out); if (ttype->is_map()) { - indent(out) << "$xfer += $output->writeMapEnd();" << endl; + indent(out) << "$xfer += $output->writeMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "$xfer += $output->writeSetEnd();" << endl; + indent(out) << "$xfer += $output->writeSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "$xfer += $output->writeListEnd();" << endl; + indent(out) << "$xfer += $output->writeListEnd();" << '\n'; } scope_down(out); diff --git a/compiler/cpp/src/thrift/generate/t_php_generator.cc b/compiler/cpp/src/thrift/generate/t_php_generator.cc index 83738586821..6879501db0f 100644 --- a/compiler/cpp/src/thrift/generate/t_php_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_php_generator.cc @@ -35,8 +35,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - #define NSGLOBAL (nsglobal_.size() ? nsglobal_ : "") #define NSGLOBAL_A ("\\" + NSGLOBAL) #define NSGLOBAL_B (NSGLOBAL + "\\") @@ -62,7 +60,7 @@ class t_php_generator : public t_oop_generator { validate_ = false; json_serializable_ = false; getters_setters_ = false; - + nsglobal_ = ""; // by default global namespace is empty classmap_ = false; for (iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) { @@ -513,28 +511,28 @@ void t_php_generator::generate_typedef(t_typedef* ttypedef) { * Generates service header contains namespace suffix and includes inside file specified */ void t_php_generator::generate_service_header(t_service* tservice, std::ostream& file) { - file << "get_program()).empty()) { - file << "namespace " << php_namespace_suffix(tservice->get_program()) << ";" << endl - << endl; + file << "namespace " << php_namespace_suffix(tservice->get_program()) << ";" << '\n' + << '\n'; } file << autogen_comment() << php_includes(); - file << endl; + file << '\n'; } /** * Generates program header contains namespace suffix and includes inside file specified */ void t_php_generator::generate_program_header(std::ostream& file) { - file << "get_name() << endl - << "{" << endl; + f_enum << "final class " << tenum->get_name() << '\n' + << "{" << '\n'; indent_up(); for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { int value = (*c_iter)->get_value(); generate_php_doc(f_enum, *c_iter); - indent(f_enum) << "const " << (*c_iter)->get_name() << " = " << value << ";" << endl - << endl; + indent(f_enum) << "const " << (*c_iter)->get_name() << " = " << value << ";" << '\n' + << '\n'; } - indent(f_enum) << "static public $__names = array(" << endl; + indent(f_enum) << "static public $__names = array(" << '\n'; indent_up(); for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { int value = (*c_iter)->get_value(); - indent(f_enum) << value << " => '" << (*c_iter)->get_name() << "'," << endl; + indent(f_enum) << value << " => '" << (*c_iter)->get_name() << "'," << '\n'; } indent_down(); - indent(f_enum) << ");" << endl; + indent(f_enum) << ");" << '\n'; indent_down(); - f_enum << "}" << endl << endl; + f_enum << "}" << '\n' << '\n'; if (!classmap_) { f_enum.close(); } @@ -604,8 +602,8 @@ void t_php_generator::generate_consts(vector consts) { f_consts.open(f_consts_name.c_str()); generate_program_header(f_consts); } - f_consts << "final class Constant extends \\Thrift\\Type\\TConstant"<< endl - << "{" << endl; + f_consts << "final class Constant extends \\Thrift\\Type\\TConstant"<< '\n' + << "{" << '\n'; indent_up(); @@ -613,30 +611,30 @@ void t_php_generator::generate_consts(vector consts) { for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { string name = (*c_iter)->get_name(); - indent(f_consts) << "static protected $" << name << ";" << endl; + indent(f_consts) << "static protected $" << name << ";" << '\n'; } // Create init function for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { string name = (*c_iter)->get_name(); - f_consts << endl; + f_consts << '\n'; - f_consts << indent() << "protected static function init_" << name << "()" <get_type(), (*c_iter)->get_value()); - f_consts << ";" << endl; + f_consts << ";" << '\n'; indent_down(); - indent(f_consts) << "}" << endl; + indent(f_consts) << "}" << '\n'; } indent_down(); - f_consts << "}" << endl; + f_consts << "}" << '\n'; if (!classmap_) { f_consts.close(); } @@ -679,7 +677,7 @@ string t_php_generator::render_const_value(t_type* type, t_const_value* value) { } else if (type->is_enum()) { indent(out) << value->get_integer(); } else if (type->is_struct() || type->is_xception()) { - out << "new " << php_namespace(type->get_program()) << type->get_name() << "(array(" << endl; + out << "new " << php_namespace(type->get_program()) << type->get_name() << "(array(" << '\n'; indent_up(); const vector& fields = ((t_struct*)type)->get_members(); vector::const_iterator f_iter; @@ -699,14 +697,14 @@ string t_php_generator::render_const_value(t_type* type, t_const_value* value) { out << render_const_value(g_type_string, v_iter->first); out << " => "; out << render_const_value(field_type, v_iter->second); - out << "," << endl; + out << "," << '\n'; } indent_down(); indent(out) << "))"; } else if (type->is_map()) { t_type* ktype = ((t_map*)type)->get_key_type(); t_type* vtype = ((t_map*)type)->get_val_type(); - out << "array(" << endl; + out << "array(" << '\n'; indent_up(); const map& val = value->get_map(); map::const_iterator v_iter; @@ -715,7 +713,7 @@ string t_php_generator::render_const_value(t_type* type, t_const_value* value) { out << render_const_value(ktype, v_iter->first); out << " => "; out << render_const_value(vtype, v_iter->second); - out << "," << endl; + out << "," << '\n'; } indent_down(); indent(out) << ")"; @@ -726,7 +724,7 @@ string t_php_generator::render_const_value(t_type* type, t_const_value* value) { } else { etype = ((t_set*)type)->get_elem_type(); } - out << "array(" << endl; + out << "array(" << '\n'; indent_up(); const vector& val = value->get_list(); vector::const_iterator v_iter; @@ -736,7 +734,7 @@ string t_php_generator::render_const_value(t_type* type, t_const_value* value) { if (type->is_set()) { out << " => true"; } - out << "," << endl; + out << "," << '\n'; } indent_down(); indent(out) << ")"; @@ -779,27 +777,27 @@ void t_php_generator::generate_php_struct(t_struct* tstruct, bool is_exception) void t_php_generator::generate_php_type_spec(ostream& out, t_type* t) { t = get_true_type(t); - indent(out) << "'type' => " << type_to_enum(t) << "," << endl; + indent(out) << "'type' => " << type_to_enum(t) << "," << '\n'; if (t->is_base_type()) { // Noop, type is all we need } else if (t->is_struct() || t->is_xception() || t->is_enum()) { indent(out) << "'class' => '" << php_namespace(t->get_program()) << t->get_name() << "'," - << endl; + << '\n'; } else if (t->is_map()) { t_type* ktype = get_true_type(((t_map*)t)->get_key_type()); t_type* vtype = get_true_type(((t_map*)t)->get_val_type()); - indent(out) << "'ktype' => " << type_to_enum(ktype) << "," << endl; - indent(out) << "'vtype' => " << type_to_enum(vtype) << "," << endl; - indent(out) << "'key' => array(" << endl; + indent(out) << "'ktype' => " << type_to_enum(ktype) << "," << '\n'; + indent(out) << "'vtype' => " << type_to_enum(vtype) << "," << '\n'; + indent(out) << "'key' => array(" << '\n'; indent_up(); generate_php_type_spec(out, ktype); indent_down(); - indent(out) << ")," << endl; - indent(out) << "'val' => array(" << endl; + indent(out) << ")," << '\n'; + indent(out) << "'val' => array(" << '\n'; indent_up(); generate_php_type_spec(out, vtype); - indent(out) << ")," << endl; + indent(out) << ")," << '\n'; indent_down(); } else if (t->is_list() || t->is_set()) { t_type* etype; @@ -808,11 +806,11 @@ void t_php_generator::generate_php_type_spec(ostream& out, t_type* t) { } else { etype = get_true_type(((t_set*)t)->get_elem_type()); } - indent(out) << "'etype' => " << type_to_enum(etype) << "," << endl; - indent(out) << "'elem' => array(" << endl; + indent(out) << "'etype' => " << type_to_enum(etype) << "," << '\n'; + indent(out) << "'elem' => array(" << '\n'; indent_up(); generate_php_type_spec(out, etype); - indent(out) << ")," << endl; + indent(out) << ")," << '\n'; indent_down(); } else { throw "compiler error: no type for php struct spec field"; @@ -824,24 +822,24 @@ void t_php_generator::generate_php_type_spec(ostream& out, t_type* t) { * type information to generalize serialization routines. */ void t_php_generator::generate_php_struct_spec(ostream& out, t_struct* tstruct) { - indent(out) << "static public $_TSPEC = array(" << endl; + indent(out) << "static public $_TSPEC = array(" << '\n'; indent_up(); const vector& members = tstruct->get_members(); vector::const_iterator m_iter; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_type* t = get_true_type((*m_iter)->get_type()); - indent(out) << (*m_iter)->get_key() << " => array(" << endl; + indent(out) << (*m_iter)->get_key() << " => array(" << '\n'; indent_up(); - out << indent() << "'var' => '" << (*m_iter)->get_name() << "'," << endl; - out << indent() << "'isRequired' => " << ((*m_iter)->get_req() == t_field::T_REQUIRED ? "true" : "false") << "," << endl; + out << indent() << "'var' => '" << (*m_iter)->get_name() << "'," << '\n'; + out << indent() << "'isRequired' => " << ((*m_iter)->get_req() == t_field::T_REQUIRED ? "true" : "false") << "," << '\n'; generate_php_type_spec(out, t); indent_down(); - indent(out) << ")," << endl; + indent(out) << ")," << '\n'; } indent_down(); - indent(out) << ");" << endl << endl; + indent(out) << ");" << '\n' << '\n'; } /** * Generates necessary accessors and mutators for the fields @@ -865,10 +863,10 @@ void t_php_generator::generate_generic_field_getters_setters(std::ostream& out, indent_down(); } - indent(out) << endl; + indent(out) << '\n'; out << getter_stream.str(); out << setter_stream.str(); - indent(out) << endl; + indent(out) << '\n'; } /** * Generates a getter for the generated private fields @@ -878,16 +876,16 @@ void t_php_generator::generate_reflection_getters(ostringstream& out, string cap_name) { - out << indent() << "public function " << "get" << cap_name << "()" << endl - << indent() << "{" << endl; + out << indent() << "public function " << "get" << cap_name << "()" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "return $this->" << field_name << ";" << endl; + out << indent() << "return $this->" << field_name << ";" << '\n'; indent_down(); - out << indent() << "}" << endl; - out << endl; + out << indent() << "}" << '\n'; + out << '\n'; } /** * Generates a setter for the generated private fields @@ -896,17 +894,17 @@ void t_php_generator::generate_reflection_setters(ostringstream& out, string field_name, string cap_name) { - out << indent() << "public function set" << cap_name << "(" << "$" << field_name << ")" << endl - << indent() << "{" << endl; + out << indent() << "public function set" << cap_name << "(" << "$" << field_name << ")" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "$this->" << field_name << " = $" << field_name << ";" << endl; + out << indent() << "$this->" << field_name << " = $" << field_name << ";" << '\n'; indent_down(); - out << indent() << "}" << endl; - out << endl; + out << indent() << "}" << '\n'; + out << '\n'; } /** * Gets the first-letter capitalized name for the field @@ -943,11 +941,11 @@ void t_php_generator::generate_php_struct_definition(ostream& out, if (json_serializable_) { out << " implements JsonSerializable"; } - out << endl - << "{" << endl; + out << '\n' + << "{" << '\n'; indent_up(); - out << indent() << "static public $isValidate = " << (validate_ ? "true" : "false") << ";" << endl << endl; + out << indent() << "static public $isValidate = " << (validate_ ? "true" : "false") << ";" << '\n' << '\n'; generate_php_struct_spec(out, tstruct); @@ -959,15 +957,15 @@ void t_php_generator::generate_php_struct_definition(ostream& out, } generate_php_doc(out, *m_iter); string access = (getters_setters_) ? "private" : "public"; - indent(out) << access << " $" << (*m_iter)->get_name() << " = " << dval << ";" << endl; + indent(out) << access << " $" << (*m_iter)->get_name() << " = " << dval << ";" << '\n'; } - out << endl; + out << '\n'; // Generate constructor from array string param = (members.size() > 0) ? "$vals = null" : ""; - out << indent() << "public function __construct(" << param << ")"<< endl - << indent() << "{" << endl; + out << indent() << "public function __construct(" << param << ")"<< '\n' + << indent() << "{" << '\n'; indent_up(); if (members.size() > 0) { @@ -975,62 +973,62 @@ void t_php_generator::generate_php_struct_definition(ostream& out, t_type* t = get_true_type((*m_iter)->get_type()); if ((*m_iter)->get_value() != nullptr && (t->is_struct() || t->is_xception())) { indent(out) << "$this->" << (*m_iter)->get_name() << " = " - << render_const_value(t, (*m_iter)->get_value()) << ";" << endl; + << render_const_value(t, (*m_iter)->get_value()) << ";" << '\n'; } } - out << indent() << "if (is_array($vals)) {" << endl; + out << indent() << "if (is_array($vals)) {" << '\n'; indent_up(); if (oop_) { - out << indent() << "parent::__construct(self::$_TSPEC, $vals);" << endl; + out << indent() << "parent::__construct(self::$_TSPEC, $vals);" << '\n'; } else { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - out << indent() << "if (isset($vals['" << (*m_iter)->get_name() << "'])) {" << endl; + out << indent() << "if (isset($vals['" << (*m_iter)->get_name() << "'])) {" << '\n'; indent_up(); out << indent() << "$this->" << (*m_iter)->get_name() << " = $vals['" - << (*m_iter)->get_name() << "'];" << endl; + << (*m_iter)->get_name() << "'];" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } } indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } scope_down(out); - out << endl; + out << '\n'; - out << indent() << "public function getName()" << endl - << indent() << "{" << endl; + out << indent() << "public function getName()" << '\n' + << indent() << "{" << '\n'; indent_up(); - out << indent() << "return '" << tstruct->get_name() << "';" << endl; + out << indent() << "return '" << tstruct->get_name() << "';" << '\n'; indent_down(); - out << indent() << "}" << endl << endl; + out << indent() << "}" << '\n' << '\n'; - out << endl; + out << '\n'; if (getters_setters_) { generate_generic_field_getters_setters(out, tstruct); } generate_php_struct_reader(out, tstruct, is_result); - out << endl; + out << '\n'; generate_php_struct_writer(out, tstruct, is_result); if (needs_php_read_validator(tstruct, is_result)) { - out << endl; + out << '\n'; generate_php_struct_read_validator(out, tstruct); } if (needs_php_write_validator(tstruct, is_result)) { - out << endl; + out << '\n'; generate_php_struct_write_validator(out, tstruct); } if (json_serializable_) { - out << endl; + out << '\n'; generate_php_struct_json_serialize(out, tstruct, is_result); } indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } /** @@ -1040,34 +1038,34 @@ void t_php_generator::generate_php_struct_reader(ostream& out, t_struct* tstruct const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; - indent(out) << "public function read($input)" << endl; + indent(out) << "public function read($input)" << '\n'; scope_up(out); if (oop_) { if (needs_php_read_validator(tstruct, is_result)) { indent(out) << "$tmp = $this->_read('" << tstruct->get_name() << "', self::$_TSPEC, $input);" - << endl; - indent(out) << "$this->_validateForRead();" << endl; - indent(out) << "return $tmp;" << endl; + << '\n'; + indent(out) << "$this->_validateForRead();" << '\n'; + indent(out) << "return $tmp;" << '\n'; } else { indent(out) << "return $this->_read('" << tstruct->get_name() << "', self::$_TSPEC, $input);" - << endl; + << '\n'; } scope_down(out); - out << endl; + out << '\n'; return; } - out << indent() << "$xfer = 0;" << endl << indent() << "$fname = null;" << endl << indent() - << "$ftype = 0;" << endl << indent() << "$fid = 0;" << endl; + out << indent() << "$xfer = 0;" << '\n' << indent() << "$fname = null;" << '\n' << indent() + << "$ftype = 0;" << '\n' << indent() << "$fid = 0;" << '\n'; // Declare stack tmp variables if (!binary_inline_) { - indent(out) << "$xfer += $input->readStructBegin($fname);" << endl; + indent(out) << "$xfer += $input->readStructBegin($fname);" << '\n'; } // Loop over reading in fields - indent(out) << "while (true) {" << endl; + indent(out) << "while (true) {" << '\n'; indent_up(); @@ -1077,80 +1075,80 @@ void t_php_generator::generate_php_struct_reader(ostream& out, t_struct* tstruct t_field ffid(g_type_i16, "fid"); generate_deserialize_field(out, &fftype); out << indent() << "if ($ftype == " - << "TType::STOP) {" << endl << indent() << " break;" << endl << indent() << "}" << endl; + << "TType::STOP) {" << '\n' << indent() << " break;" << '\n' << indent() << "}" << '\n'; generate_deserialize_field(out, &ffid); } else { - indent(out) << "$xfer += $input->readFieldBegin($fname, $ftype, $fid);" << endl; + indent(out) << "$xfer += $input->readFieldBegin($fname, $ftype, $fid);" << '\n'; // Check for field STOP marker and break indent(out) << "if ($ftype == " - << "TType::STOP) {" << endl; + << "TType::STOP) {" << '\n'; indent_up(); - indent(out) << "break;" << endl; + indent(out) << "break;" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } // Switch statement on the field we are reading - indent(out) << "switch ($fid) {" << endl; + indent(out) << "switch ($fid) {" << '\n'; indent_up(); // Generate deserialization code for known cases for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - indent(out) << "case " << (*f_iter)->get_key() << ":" << endl; + indent(out) << "case " << (*f_iter)->get_key() << ":" << '\n'; indent_up(); - indent(out) << "if ($ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl; + indent(out) << "if ($ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n'; indent_up(); generate_deserialize_field(out, *f_iter, "this->"); indent_down(); - out << indent() << "} else {" << endl; + out << indent() << "} else {" << '\n'; indent_up(); if (binary_inline_) { - indent(out) << "$xfer += TProtocol::skipBinary($input, $ftype);" << endl; + indent(out) << "$xfer += TProtocol::skipBinary($input, $ftype);" << '\n'; } else { - indent(out) << "$xfer += $input->skip($ftype);" << endl; + indent(out) << "$xfer += $input->skip($ftype);" << '\n'; } indent_down(); - out << indent() << "}" << endl << indent() << "break;" << endl; + out << indent() << "}" << '\n' << indent() << "break;" << '\n'; indent_down(); } // In the default case we skip the field - indent(out) << "default:" << endl; + indent(out) << "default:" << '\n'; indent_up(); if (binary_inline_) { indent(out) << "$xfer += " - << "TProtocol::skipBinary($input, $ftype);" << endl; + << "TProtocol::skipBinary($input, $ftype);" << '\n'; } else { - indent(out) << "$xfer += $input->skip($ftype);" << endl; + indent(out) << "$xfer += $input->skip($ftype);" << '\n'; } - indent(out) << "break;" << endl; + indent(out) << "break;" << '\n'; indent_down(); scope_down(out); if (!binary_inline_) { // Read field end marker - indent(out) << "$xfer += $input->readFieldEnd();" << endl; + indent(out) << "$xfer += $input->readFieldEnd();" << '\n'; } scope_down(out); if (!binary_inline_) { - indent(out) << "$xfer += $input->readStructEnd();" << endl; + indent(out) << "$xfer += $input->readStructEnd();" << '\n'; } if (needs_php_read_validator(tstruct, is_result)) { - indent(out) << "$this->_validateForRead();" << endl; + indent(out) << "$this->_validateForRead();" << '\n'; } - indent(out) << "return $xfer;" << endl; + indent(out) << "return $xfer;" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } /** @@ -1162,33 +1160,33 @@ void t_php_generator::generate_php_struct_writer(ostream& out, t_struct* tstruct vector::const_iterator f_iter; if (binary_inline_) { - indent(out) << "public function write(&$output)" << endl; + indent(out) << "public function write(&$output)" << '\n'; } else { - indent(out) << "public function write($output)" << endl; + indent(out) << "public function write($output)" << '\n'; } - indent(out) << "{" << endl; + indent(out) << "{" << '\n'; indent_up(); if (needs_php_write_validator(tstruct, is_result)) { - indent(out) << "$this->_validateForWrite();" << endl; + indent(out) << "$this->_validateForWrite();" << '\n'; } if (oop_) { indent(out) << "return $this->_write('" << tstruct->get_name() << "', self::$_TSPEC, $output);" - << endl; + << '\n'; scope_down(out); - out << endl; + out << '\n'; return; } - indent(out) << "$xfer = 0;" << endl; + indent(out) << "$xfer = 0;" << '\n'; if (!binary_inline_) { - indent(out) << "$xfer += $output->writeStructBegin('" << name << "');" << endl; + indent(out) << "$xfer += $output->writeStructBegin('" << name << "');" << '\n'; } for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - out << indent() << "if ($this->" << (*f_iter)->get_name() << " !== null) {" << endl; + out << indent() << "if ($this->" << (*f_iter)->get_name() << " !== null) {" << '\n'; indent_up(); t_type* type = get_true_type((*f_iter)->get_type()); @@ -1200,22 +1198,22 @@ void t_php_generator::generate_php_struct_writer(ostream& out, t_struct* tstruct } if (!expect.empty()) { out << indent() << "if (!is_" << expect << "($this->" << (*f_iter)->get_name() << ")) {" - << endl; + << '\n'; indent_up(); out << indent() << "throw new " << "TProtocolException('Bad type in structure.', " - << "TProtocolException::INVALID_DATA);" << endl; + << "TProtocolException::INVALID_DATA);" << '\n'; scope_down(out); } // Write field header if (binary_inline_) { out << indent() << "$output .= pack('c', " << type_to_enum((*f_iter)->get_type()) << ");" - << endl << indent() << "$output .= pack('n', " << (*f_iter)->get_key() << ");" << endl; + << '\n' << indent() << "$output .= pack('n', " << (*f_iter)->get_key() << ");" << '\n'; } else { indent(out) << "$xfer += $output->writeFieldBegin(" << "'" << (*f_iter)->get_name() << "', " << type_to_enum((*f_iter)->get_type()) - << ", " << (*f_iter)->get_key() << ");" << endl; + << ", " << (*f_iter)->get_key() << ");" << '\n'; } // Write field contents @@ -1223,25 +1221,25 @@ void t_php_generator::generate_php_struct_writer(ostream& out, t_struct* tstruct // Write field closer if (!binary_inline_) { - indent(out) << "$xfer += $output->writeFieldEnd();" << endl; + indent(out) << "$xfer += $output->writeFieldEnd();" << '\n'; } indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } if (binary_inline_) { out << indent() << "$output .= pack('c', " - << "TType::STOP);" << endl; + << "TType::STOP);" << '\n'; } else { - out << indent() << "$xfer += $output->writeFieldStop();" << endl << indent() - << "$xfer += $output->writeStructEnd();" << endl; + out << indent() << "$xfer += $output->writeFieldStop();" << '\n' << indent() + << "$xfer += $output->writeStructEnd();" << '\n'; } - out << indent() << "return $xfer;" << endl; + out << indent() << "return $xfer;" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } void t_php_generator::generate_php_struct_read_validator(ostream& out, t_struct* tstruct) { @@ -1256,7 +1254,7 @@ void t_php_generator::generate_php_struct_required_validator(ostream& out, t_struct* tstruct, std::string method_name, bool write_mode) { - indent(out) << "private function " << method_name << "() {" << endl; + indent(out) << "private function " << method_name << "() {" << '\n'; indent_up(); const vector& fields = tstruct->get_members(); @@ -1268,32 +1266,32 @@ void t_php_generator::generate_php_struct_required_validator(ostream& out, t_field* field = (*f_iter); if (field->get_req() == t_field::T_REQUIRED || (field->get_req() == t_field::T_OPT_IN_REQ_OUT && write_mode)) { - indent(out) << "if ($this->" << field->get_name() << " === null) {" << endl; + indent(out) << "if ($this->" << field->get_name() << " === null) {" << '\n'; indent_up(); indent(out) << "throw new TProtocolException('Required field " << tstruct->get_name() << "." - << field->get_name() << " is unset!');" << endl; + << field->get_name() << " is unset!');" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } } indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } void t_php_generator::generate_php_struct_json_serialize(ostream& out, t_struct* tstruct, bool is_result) { - indent(out) << "#[\\ReturnTypeWillChange]" << endl; - indent(out) << "public function jsonSerialize() {" << endl; + indent(out) << "#[\\ReturnTypeWillChange]" << '\n'; + indent(out) << "public function jsonSerialize() {" << '\n'; indent_up(); if (needs_php_write_validator(tstruct, is_result)) { - indent(out) << "$this->_validateForWrite();" << endl; + indent(out) << "$this->_validateForWrite();" << '\n'; } - indent(out) << "$json = new stdClass;" << endl; + indent(out) << "$json = new stdClass;" << '\n'; const vector& fields = tstruct->get_members(); @@ -1312,7 +1310,7 @@ void t_php_generator::generate_php_struct_json_serialize(ostream& out, continue; } } - indent(out) << "if ($this->" << name << " !== null) {" << endl; + indent(out) << "if ($this->" << name << " !== null) {" << '\n'; indent_up(); indent(out) << "$json->" << name << " = "; if (type->is_map()) { @@ -1320,16 +1318,16 @@ void t_php_generator::generate_php_struct_json_serialize(ostream& out, } else { out << type_to_cast(type); } - out << "$this->" << name << ";" << endl; + out << "$this->" << name << ";" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } - indent(out) << "return $json;" << endl; + indent(out) << "return $json;" << '\n'; indent_down(); - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } int t_php_generator::get_php_num_required_fields(const vector& fields, bool write_mode) { @@ -1382,7 +1380,7 @@ void t_php_generator::generate_service(t_service* tservice) { if(classmap_) { // Close service file - f_service_ << endl; + f_service_ << '\n'; f_service_.close(); } } @@ -1413,34 +1411,34 @@ void t_php_generator::generate_service_processor(t_service* tservice) { } // Generate the header portion - f_service_processor << "class " << service_name_ << "Processor" << extends_processor << endl - << "{" << endl; + f_service_processor << "class " << service_name_ << "Processor" << extends_processor << '\n' + << "{" << '\n'; indent_up(); if (extends.empty()) { - f_service_processor << indent() << "protected $handler_ = null;" << endl; + f_service_processor << indent() << "protected $handler_ = null;" << '\n'; } - f_service_processor << indent() << "public function __construct($handler)"<< endl - << indent() << "{" << endl; + f_service_processor << indent() << "public function __construct($handler)"<< '\n' + << indent() << "{" << '\n'; indent_up(); if (extends.empty()) { - f_service_processor << indent() << "$this->handler_ = $handler;" << endl; + f_service_processor << indent() << "$this->handler_ = $handler;" << '\n'; } else { - f_service_processor << indent() << "parent::__construct($handler);" << endl; + f_service_processor << indent() << "parent::__construct($handler);" << '\n'; } indent_down(); - f_service_processor << indent() << "}" << endl << endl; + f_service_processor << indent() << "}" << '\n' << '\n'; // Generate the server implementation - f_service_processor << indent() << "public function process($input, $output)" << endl - << indent() << "{" << endl; + f_service_processor << indent() << "public function process($input, $output)" << '\n' + << indent() << "{" << '\n'; indent_up(); - f_service_processor << indent() << "$rseqid = 0;" << endl << indent() << "$fname = null;" << endl - << indent() << "$mtype = 0;" << endl << endl; + f_service_processor << indent() << "$rseqid = 0;" << '\n' << indent() << "$fname = null;" << '\n' + << indent() << "$mtype = 0;" << '\n' << '\n'; if (binary_inline_) { t_field ffname(g_type_string, "fname"); @@ -1450,36 +1448,36 @@ void t_php_generator::generate_service_processor(t_service* tservice) { generate_deserialize_field(f_service_processor, &fmtype, "", true); generate_deserialize_field(f_service_processor, &fseqid, "", true); } else { - f_service_processor << indent() << "$input->readMessageBegin($fname, $mtype, $rseqid);" << endl; + f_service_processor << indent() << "$input->readMessageBegin($fname, $mtype, $rseqid);" << '\n'; } // HOT: check for method implementation - f_service_processor << indent() << "$methodname = 'process_'.$fname;" << endl - << indent() << "if (!method_exists($this, $methodname)) {" << endl; + f_service_processor << indent() << "$methodname = 'process_'.$fname;" << '\n' + << indent() << "if (!method_exists($this, $methodname)) {" << '\n'; indent_up(); if (binary_inline_) { - f_service_processor << indent() << "throw new \\Exception('Function '.$fname.' not implemented.');" << endl; + f_service_processor << indent() << "throw new \\Exception('Function '.$fname.' not implemented.');" << '\n'; } else { f_service_processor << indent() << " $input->skip(" - << "TType::STRUCT);" << endl << indent() << " $input->readMessageEnd();" << endl + << "TType::STRUCT);" << '\n' << indent() << " $input->readMessageEnd();" << '\n' << indent() << " $x = new " << "TApplicationException('Function '.$fname.' not implemented.', " - << "TApplicationException::UNKNOWN_METHOD);" << endl << indent() + << "TApplicationException::UNKNOWN_METHOD);" << '\n' << indent() << " $output->writeMessageBegin($fname, " - << "TMessageType::EXCEPTION, $rseqid);" << endl << indent() - << " $x->write($output);" << endl << indent() << " $output->writeMessageEnd();" - << endl << indent() << " $output->getTransport()->flush();" << endl << indent() - << " return;" << endl; + << "TMessageType::EXCEPTION, $rseqid);" << '\n' << indent() + << " $x->write($output);" << '\n' << indent() << " $output->writeMessageEnd();" + << '\n' << indent() << " $output->getTransport()->flush();" << '\n' << indent() + << " return;" << '\n'; } indent_down(); - f_service_processor << indent() << "}" << endl - << indent() << "$this->$methodname($rseqid, $input, $output);" << endl - << indent() << "return true;" << endl; + f_service_processor << indent() << "}" << '\n' + << indent() << "$this->$methodname($rseqid, $input, $output);" << '\n' + << indent() << "return true;" << '\n'; indent_down(); - f_service_processor << indent() << "}" << endl << endl; + f_service_processor << indent() << "}" << '\n' << '\n'; // Generate the process subfunctions for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -1487,7 +1485,7 @@ void t_php_generator::generate_service_processor(t_service* tservice) { } indent_down(); - f_service_processor << "}" << endl; + f_service_processor << "}" << '\n'; if (!classmap_) { f_service_processor.close(); @@ -1501,8 +1499,8 @@ void t_php_generator::generate_service_processor(t_service* tservice) { */ void t_php_generator::generate_process_function(std::ostream& out, t_service* tservice, t_function* tfunction) { // Open function - out << indent() << "protected function process_" << tfunction->get_name() << "($seqid, $input, $output)" << endl - << indent() << "{" << endl; + out << indent() << "protected function process_" << tfunction->get_name() << "($seqid, $input, $output)" << '\n' + << indent() << "{" << '\n'; indent_up(); string argsname = php_namespace(tservice->get_program()) + service_name_ + "_" @@ -1512,32 +1510,32 @@ void t_php_generator::generate_process_function(std::ostream& out, t_service* ts out << indent() << "$bin_accel = ($input instanceof " << "TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary_after_message_begin');" - << endl; - out << indent() << "if ($bin_accel) {" << endl; + << '\n'; + out << indent() << "if ($bin_accel) {" << '\n'; indent_up(); - out << indent() << "$args = thrift_protocol_read_binary_after_message_begin(" <isStrictRead()" <isStrictRead()" << '\n'; indent_down(); - out << indent() <<");" << endl; + out << indent() <<");" << '\n'; indent_down(); - out << indent() << "} else {" << endl; + out << indent() << "} else {" << '\n'; indent_up(); - out << indent() << "$args = new " << argsname << "();" << endl - << indent() << "$args->read($input);" << endl; + out << indent() << "$args = new " << argsname << "();" << '\n' + << indent() << "$args->read($input);" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; if (!binary_inline_) { - out << indent() << "$input->readMessageEnd();" << endl; + out << indent() << "$input->readMessageEnd();" << '\n'; } t_struct* xs = tfunction->get_xceptions(); @@ -1546,12 +1544,12 @@ void t_php_generator::generate_process_function(std::ostream& out, t_service* ts // Declare result for non oneway function if (!tfunction->is_oneway()) { - out << indent() << "$result = new " << resultname << "();" << endl; + out << indent() << "$result = new " << resultname << "();" << '\n'; } // Try block for a function with exceptions if (xceptions.size() > 0) { - out << indent() << "try {" << endl; + out << indent() << "try {" << '\n'; indent_up(); } @@ -1574,7 +1572,7 @@ void t_php_generator::generate_process_function(std::ostream& out, t_service* ts } out << "$args->" << (*f_iter)->get_name(); } - out << ");" << endl; + out << ");" << '\n'; if (!tfunction->is_oneway() && xceptions.size() > 0) { indent_down(); @@ -1582,70 +1580,70 @@ void t_php_generator::generate_process_function(std::ostream& out, t_service* ts out << indent() << "} catch (" << php_namespace(get_true_type((*x_iter)->get_type())->get_program()) << (*x_iter)->get_type()->get_name() << " $" << (*x_iter)->get_name() << ") {" - << endl; + << '\n'; if (!tfunction->is_oneway()) { indent_up(); out << indent() << "$result->" << (*x_iter)->get_name() << " = $" - << (*x_iter)->get_name() << ";" << endl; + << (*x_iter)->get_name() << ";" << '\n'; indent_down(); out << indent(); } } - out << "}" << endl; + out << "}" << '\n'; } // Shortcut out here for oneway functions if (tfunction->is_oneway()) { - out << indent() << "return;" << endl; + out << indent() << "return;" << '\n'; indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; return; } out << indent() << "$bin_accel = ($output instanceof " << "TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');" - << endl; + << '\n'; - out << indent() << "if ($bin_accel) {" << endl; + out << indent() << "if ($bin_accel) {" << '\n'; indent_up(); - out << indent() << "thrift_protocol_write_binary(" << endl; + out << indent() << "thrift_protocol_write_binary(" << '\n'; indent_up(); - out << indent() << "$output,"<get_name()<< "'," <isStrictWrite()"<get_name()<< "'," << '\n' + << indent() << "TMessageType::REPLY,"<< '\n' + << indent() << "$result," << '\n' + << indent() << "$seqid," << '\n' + << indent() << "$output->isStrictWrite()"<< '\n'; indent_down(); - out << indent() << ");" << endl; + out << indent() << ");" << '\n'; indent_down(); - out << indent() << "} else {" << endl; + out << indent() << "} else {" << '\n'; indent_up(); // Serialize the request header if (binary_inline_) { out << indent() << "$buff = pack('N', (0x80010000 | " - << "TMessageType::REPLY)); " << endl << indent() << "$buff .= pack('N', strlen('" - << tfunction->get_name() << "'));" << endl << indent() << "$buff .= '" - << tfunction->get_name() << "';" << endl << indent() << "$buff .= pack('N', $seqid);" - << endl << indent() << "$result->write($buff);" << endl << indent() - << "$output->write($buff);" << endl << indent() << "$output->flush();" << endl; + << "TMessageType::REPLY)); " << '\n' << indent() << "$buff .= pack('N', strlen('" + << tfunction->get_name() << "'));" << '\n' << indent() << "$buff .= '" + << tfunction->get_name() << "';" << '\n' << indent() << "$buff .= pack('N', $seqid);" + << '\n' << indent() << "$result->write($buff);" << '\n' << indent() + << "$output->write($buff);" << '\n' << indent() << "$output->flush();" << '\n'; } else { out << indent() << "$output->writeMessageBegin('" << tfunction->get_name() << "', " - << "TMessageType::REPLY, $seqid);" << endl << indent() << "$result->write($output);" - << endl << indent() << "$output->writeMessageEnd();" << endl << indent() - << "$output->getTransport()->flush();" << endl; + << "TMessageType::REPLY, $seqid);" << '\n' << indent() << "$result->write($output);" + << '\n' << indent() << "$output->writeMessageEnd();" << '\n' << indent() + << "$output->getTransport()->flush();" << '\n'; } scope_down(out); // Close function indent_down(); - out << indent() << "}" << endl; + out << indent() << "}" << '\n'; } /** @@ -1659,7 +1657,7 @@ void t_php_generator::generate_service_helpers(t_service* tservice) { ofstream_with_content_based_conditional_update& f_struct_definition = f_service_; if (classmap_) { - f_struct_definition << "// HELPER FUNCTIONS AND STRUCTURES" << endl << endl; + f_struct_definition << "// HELPER FUNCTIONS AND STRUCTURES" << '\n' << '\n'; } for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -1738,18 +1736,18 @@ void t_php_generator::generate_service_interface(t_service* tservice) { + tservice->get_extends()->get_name() + "If"; } generate_php_doc(f_service_interface, tservice); - f_service_interface << "interface " << php_namespace_declaration(tservice) << "If" << extends_if << endl - << "{" << endl; + f_service_interface << "interface " << php_namespace_declaration(tservice) << "If" << extends_if << '\n' + << "{" << '\n'; indent_up(); vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_php_doc(f_service_interface, *f_iter); - indent(f_service_interface) << "public function " << function_signature(*f_iter) << ";" << endl; + indent(f_service_interface) << "public function " << function_signature(*f_iter) << ";" << '\n'; } indent_down(); - f_service_interface << "}" << endl; + f_service_interface << "}" << '\n'; // Close service interface file if (!classmap_) { @@ -1776,21 +1774,21 @@ void t_php_generator::generate_service_rest(t_service* tservice) { extends_if = " extends " + php_namespace(tservice->get_extends()->get_program()) + tservice->get_extends()->get_name() + "Rest"; } - f_service_rest << "class " << service_name_ << "Rest" << extends_if << endl - << "{" << endl; + f_service_rest << "class " << service_name_ << "Rest" << extends_if << '\n' + << "{" << '\n'; indent_up(); if (extends.empty()) { - f_service_rest << indent() << "protected $impl_;" << endl << endl; + f_service_rest << indent() << "protected $impl_;" << '\n' << '\n'; } - f_service_rest << indent() << "public function __construct($impl) {" << endl << indent() - << " $this->impl_ = $impl;" << endl << indent() << "}" << endl << endl; + f_service_rest << indent() << "public function __construct($impl) {" << '\n' << indent() + << " $this->impl_ = $impl;" << '\n' << indent() << "}" << '\n' << '\n'; vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { - indent(f_service_rest) << "public function " << (*f_iter)->get_name() << "($request) {" << endl; + indent(f_service_rest) << "public function " << (*f_iter)->get_name() << "($request) {" << '\n'; indent_up(); const vector& args = (*f_iter)->get_arglist()->get_members(); vector::const_iterator a_iter; @@ -1800,39 +1798,39 @@ void t_php_generator::generate_service_rest(t_service* tservice) { string req = "$request['" + (*a_iter)->get_name() + "']"; if (atype->is_bool()) { f_service_rest << indent() << "$" << (*a_iter)->get_name() << " = " << cast << "(!empty(" << req - << ") && (" << req << " !== 'false'));" << endl; + << ") && (" << req << " !== 'false'));" << '\n'; } else { f_service_rest << indent() << "$" << (*a_iter)->get_name() << " = isset(" << req << ") ? " - << cast << req << " : null;" << endl; + << cast << req << " : null;" << '\n'; } /* slist no longer supported if (atype->is_string() && ((t_base_type*)atype)->is_string_list()) { f_service_rest << indent() << "$" << (*a_iter)->get_name() << " = explode(',', $" - << (*a_iter)->get_name() << ");" << endl; + << (*a_iter)->get_name() << ");" << '\n'; } else */ if (atype->is_map() || atype->is_list()) { f_service_rest << indent() << "$" << (*a_iter)->get_name() << " = json_decode($" - << (*a_iter)->get_name() << ", true);" << endl; + << (*a_iter)->get_name() << ", true);" << '\n'; } else if (atype->is_set()) { f_service_rest << indent() << "$" << (*a_iter)->get_name() << " = array_fill_keys(json_decode($" - << (*a_iter)->get_name() << ", true), 1);" << endl; + << (*a_iter)->get_name() << ", true), 1);" << '\n'; } else if (atype->is_struct() || atype->is_xception()) { - f_service_rest << indent() << "if ($" << (*a_iter)->get_name() << " !== null) {" << endl + f_service_rest << indent() << "if ($" << (*a_iter)->get_name() << " !== null) {" << '\n' << indent() << " $" << (*a_iter)->get_name() << " = new " << php_namespace(atype->get_program()) << atype->get_name() << "(json_decode($" - << (*a_iter)->get_name() << ", true));" << endl << indent() << "}" << endl; + << (*a_iter)->get_name() << ", true));" << '\n' << indent() << "}" << '\n'; } } f_service_rest << indent() << "return $this->impl_->" << (*f_iter)->get_name() << "(" - << argument_list((*f_iter)->get_arglist(), false) << ");" << endl; + << argument_list((*f_iter)->get_arglist(), false) << ");" << '\n'; indent_down(); - indent(f_service_rest) << "}" << endl << endl; + indent(f_service_rest) << "}" << '\n' << '\n'; } indent_down(); - f_service_rest << "}" << endl << endl; + f_service_rest << "}" << '\n' << '\n'; // Close service rest file - f_service_rest << endl; + f_service_rest << '\n'; if (!classmap_) { f_service_rest.close(); } @@ -1860,31 +1858,31 @@ void t_php_generator::generate_service_client(t_service* tservice) { } f_service_client << "class " << php_namespace_declaration(tservice) << "Client" << extends_client - << " implements " << php_namespace(tservice->get_program()) << service_name_ << "If" << endl - <<"{"<< endl; + << " implements " << php_namespace(tservice->get_program()) << service_name_ << "If" << '\n' + <<"{"<< '\n'; indent_up(); // Private members if (extends.empty()) { - f_service_client << indent() << "protected $input_ = null;" << endl << indent() - << "protected $output_ = null;" << endl << endl; - f_service_client << indent() << "protected $seqid_ = 0;" << endl << endl; + f_service_client << indent() << "protected $input_ = null;" << '\n' << indent() + << "protected $output_ = null;" << '\n' << '\n'; + f_service_client << indent() << "protected $seqid_ = 0;" << '\n' << '\n'; } // Constructor function - f_service_client << indent() << "public function __construct($input, $output = null)" << endl - << indent() << "{" << endl; + f_service_client << indent() << "public function __construct($input, $output = null)" << '\n' + << indent() << "{" << '\n'; indent_up(); if (!extends.empty()) { - f_service_client << indent() << "parent::__construct($input, $output);" << endl; + f_service_client << indent() << "parent::__construct($input, $output);" << '\n'; } else { - f_service_client << indent() << "$this->input_ = $input;" << endl - << indent() << "$this->output_ = $output ? $output : $input;" << endl; + f_service_client << indent() << "$this->input_ = $input;" << '\n' + << indent() << "$this->output_ = $output ? $output : $input;" << '\n'; } indent_down(); - f_service_client << indent() << "}" << endl << endl; + f_service_client << indent() << "}" << '\n' << '\n'; // Generate client method implementations vector functions = tservice->get_functions(); @@ -1895,10 +1893,10 @@ void t_php_generator::generate_service_client(t_service* tservice) { vector::const_iterator fld_iter; string funname = (*f_iter)->get_name(); - f_service_client << endl; + f_service_client << '\n'; // Open function - indent(f_service_client) << "public function " << function_signature(*f_iter) << endl; + indent(f_service_client) << "public function " << function_signature(*f_iter) << '\n'; scope_up(f_service_client); indent(f_service_client) << "$this->send_" << funname << "("; @@ -1911,77 +1909,77 @@ void t_php_generator::generate_service_client(t_service* tservice) { } f_service_client << "$" << (*fld_iter)->get_name(); } - f_service_client << ");" << endl; + f_service_client << ");" << '\n'; if (!(*f_iter)->is_oneway()) { f_service_client << indent(); if (!(*f_iter)->get_returntype()->is_void()) { f_service_client << "return "; } - f_service_client << "$this->recv_" << funname << "();" << endl; + f_service_client << "$this->recv_" << funname << "();" << '\n'; } scope_down(f_service_client); - f_service_client << endl; + f_service_client << '\n'; - indent(f_service_client) << "public function send_" << function_signature(*f_iter) << endl; + indent(f_service_client) << "public function send_" << function_signature(*f_iter) << '\n'; scope_up(f_service_client); std::string argsname = php_namespace(tservice->get_program()) + service_name_ + "_" + (*f_iter)->get_name() + "_args"; - f_service_client << indent() << "$args = new " << argsname << "();" << endl; + f_service_client << indent() << "$args = new " << argsname << "();" << '\n'; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { f_service_client << indent() << "$args->" << (*fld_iter)->get_name() << " = $" - << (*fld_iter)->get_name() << ";" << endl; + << (*fld_iter)->get_name() << ";" << '\n'; } f_service_client << indent() << "$bin_accel = ($this->output_ instanceof " << "TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');" - << endl; + << '\n'; - f_service_client << indent() << "if ($bin_accel) {" << endl; + f_service_client << indent() << "if ($bin_accel) {" << '\n'; indent_up(); string messageType = (*f_iter)->is_oneway() ? "TMessageType::ONEWAY" : "TMessageType::CALL"; - f_service_client << indent() << "thrift_protocol_write_binary(" << endl; + f_service_client << indent() << "thrift_protocol_write_binary(" << '\n'; indent_up(); - f_service_client << indent() << "$this->output_," << endl - << indent() << "'" << (*f_iter)->get_name() << "'," << endl - << indent() << messageType << "," << endl - << indent() << "$args," << endl - << indent() << "$this->seqid_," << endl - << indent() << "$this->output_->isStrictWrite()" << endl; + f_service_client << indent() << "$this->output_," << '\n' + << indent() << "'" << (*f_iter)->get_name() << "'," << '\n' + << indent() << messageType << "," << '\n' + << indent() << "$args," << '\n' + << indent() << "$this->seqid_," << '\n' + << indent() << "$this->output_->isStrictWrite()" << '\n'; indent_down(); - f_service_client << indent() << ");" << endl; + f_service_client << indent() << ");" << '\n'; indent_down(); - f_service_client << indent() << "} else {" << endl; + f_service_client << indent() << "} else {" << '\n'; indent_up(); // Serialize the request header if (binary_inline_) { - f_service_client << indent() << "$buff = pack('N', (0x80010000 | " << messageType << "));" << endl - << indent() << "$buff .= pack('N', strlen('" << funname << "'));" << endl - << indent() << "$buff .= '" << funname << "';" << endl << indent() - << "$buff .= pack('N', $this->seqid_);" << endl; + f_service_client << indent() << "$buff = pack('N', (0x80010000 | " << messageType << "));" << '\n' + << indent() << "$buff .= pack('N', strlen('" << funname << "'));" << '\n' + << indent() << "$buff .= '" << funname << "';" << '\n' << indent() + << "$buff .= pack('N', $this->seqid_);" << '\n'; } else { f_service_client << indent() << "$this->output_->writeMessageBegin('" << (*f_iter)->get_name() - << "', " << messageType << ", $this->seqid_);" << endl; + << "', " << messageType << ", $this->seqid_);" << '\n'; } // Write to the stream if (binary_inline_) { - f_service_client << indent() << "$args->write($buff);" << endl << indent() - << "$this->output_->write($buff);" << endl << indent() - << "$this->output_->flush();" << endl; + f_service_client << indent() << "$args->write($buff);" << '\n' << indent() + << "$this->output_->write($buff);" << '\n' << indent() + << "$this->output_->flush();" << '\n'; } else { - f_service_client << indent() << "$args->write($this->output_);" << endl << indent() - << "$this->output_->writeMessageEnd();" << endl << indent() - << "$this->output_->getTransport()->flush();" << endl; + f_service_client << indent() << "$args->write($this->output_);" << '\n' << indent() + << "$this->output_->writeMessageEnd();" << '\n' << indent() + << "$this->output_->getTransport()->flush();" << '\n'; } scope_down(f_service_client); @@ -1997,98 +1995,98 @@ void t_php_generator::generate_service_client(t_service* tservice) { string("recv_") + (*f_iter)->get_name(), &noargs); // Open function - f_service_client << endl << indent() << "public function " << function_signature(&recv_function) - << endl; + f_service_client << '\n' << indent() << "public function " << function_signature(&recv_function) + << '\n'; scope_up(f_service_client); f_service_client << indent() << "$bin_accel = ($this->input_ instanceof " << "TBinaryProtocolAccelerated)" - << " && function_exists('thrift_protocol_read_binary');" << endl; + << " && function_exists('thrift_protocol_read_binary');" << '\n'; - f_service_client << indent() << "if ($bin_accel) {" << endl; + f_service_client << indent() << "if ($bin_accel) {" << '\n'; indent_up(); - f_service_client << indent() << "$result = thrift_protocol_read_binary(" << endl; + f_service_client << indent() << "$result = thrift_protocol_read_binary(" << '\n'; indent_up(); - f_service_client << indent() << "$this->input_," << endl - << indent() << "'" << resultname << "'," << endl - << indent() << "$this->input_->isStrictRead()" << endl; + f_service_client << indent() << "$this->input_," << '\n' + << indent() << "'" << resultname << "'," << '\n' + << indent() << "$this->input_->isStrictRead()" << '\n'; indent_down(); - f_service_client << indent() << ");" << endl; + f_service_client << indent() << ");" << '\n'; indent_down(); - f_service_client << indent() << "} else {" << endl; + f_service_client << indent() << "} else {" << '\n'; indent_up(); - f_service_client << indent() << "$rseqid = 0;" << endl - << indent() << "$fname = null;" << endl - << indent() << "$mtype = 0;" << endl << endl; + f_service_client << indent() << "$rseqid = 0;" << '\n' + << indent() << "$fname = null;" << '\n' + << indent() << "$mtype = 0;" << '\n' << '\n'; if (binary_inline_) { t_field ffname(g_type_string, "fname"); t_field fseqid(g_type_i32, "rseqid"); - f_service_client << indent() << "$ver = unpack('N', $this->input_->readAll(4));" << endl - << indent() << "$ver = $ver[1];" << endl << indent() << "$mtype = $ver & 0xff;" - << endl << indent() << "$ver = $ver & 0xffff0000;" << endl << indent() + f_service_client << indent() << "$ver = unpack('N', $this->input_->readAll(4));" << '\n' + << indent() << "$ver = $ver[1];" << '\n' << indent() << "$mtype = $ver & 0xff;" + << '\n' << indent() << "$ver = $ver & 0xffff0000;" << '\n' << indent() << "if ($ver != 0x80010000) throw new " << "TProtocolException('Bad version identifier: '.$ver, " - << "TProtocolException::BAD_VERSION);" << endl; + << "TProtocolException::BAD_VERSION);" << '\n'; generate_deserialize_field(f_service_client, &ffname, "", true); generate_deserialize_field(f_service_client, &fseqid, "", true); } else { - f_service_client << indent() << "$this->input_->readMessageBegin($fname, $mtype, $rseqid);" << endl - << indent() << "if ($mtype == TMessageType::EXCEPTION) {" << endl; + f_service_client << indent() << "$this->input_->readMessageBegin($fname, $mtype, $rseqid);" << '\n' + << indent() << "if ($mtype == TMessageType::EXCEPTION) {" << '\n'; indent_up(); - f_service_client << indent() << "$x = new TApplicationException();" << endl - << indent() << "$x->read($this->input_);" << endl - << indent() << "$this->input_->readMessageEnd();" << endl - << indent() << "throw $x;" << endl; + f_service_client << indent() << "$x = new TApplicationException();" << '\n' + << indent() << "$x->read($this->input_);" << '\n' + << indent() << "$this->input_->readMessageEnd();" << '\n' + << indent() << "throw $x;" << '\n'; indent_down(); - f_service_client << indent() << "}" << endl; + f_service_client << indent() << "}" << '\n'; } - f_service_client << indent() << "$result = new " << resultname << "();" << endl - << indent() << "$result->read($this->input_);" << endl; + f_service_client << indent() << "$result = new " << resultname << "();" << '\n' + << indent() << "$result->read($this->input_);" << '\n'; if (!binary_inline_) { - f_service_client << indent() << "$this->input_->readMessageEnd();" << endl; + f_service_client << indent() << "$this->input_->readMessageEnd();" << '\n'; } scope_down(f_service_client); // Careful, only return result if not a void function if (!(*f_iter)->get_returntype()->is_void()) { - f_service_client << indent() << "if ($result->success !== null) {" << endl; + f_service_client << indent() << "if ($result->success !== null) {" << '\n'; indent_up(); - f_service_client << indent() << "return $result->success;" << endl; + f_service_client << indent() << "return $result->success;" << '\n'; indent_down(); - f_service_client << indent() << "}" << endl; + f_service_client << indent() << "}" << '\n'; } t_struct* xs = (*f_iter)->get_xceptions(); const std::vector& xceptions = xs->get_members(); vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { - f_service_client << indent() << "if ($result->" << (*x_iter)->get_name() << " !== null) {" << endl; + f_service_client << indent() << "if ($result->" << (*x_iter)->get_name() << " !== null) {" << '\n'; indent_up(); - f_service_client << indent() << "throw $result->" << (*x_iter)->get_name() << ";" << endl; + f_service_client << indent() << "throw $result->" << (*x_iter)->get_name() << ";" << '\n'; indent_down(); - f_service_client << indent() << "}" << endl; + f_service_client << indent() << "}" << '\n'; } // Careful, only return _result if not a void function if ((*f_iter)->get_returntype()->is_void()) { - indent(f_service_client) << "return;" << endl; + indent(f_service_client) << "return;" << '\n'; } else { f_service_client << indent() << "throw new \\Exception(\"" << (*f_iter)->get_name() - << " failed: unknown result\");" << endl; + << " failed: unknown result\");" << '\n'; } // Close function @@ -2097,7 +2095,7 @@ void t_php_generator::generate_service_client(t_service* tservice) { } indent_down(); - f_service_client << "}" << endl; + f_service_client << "}" << '\n'; // Close service client file if (!classmap_) { @@ -2138,54 +2136,54 @@ void t_php_generator::generate_deserialize_field(ostream& out, throw "compiler error: cannot serialize void field in a struct: " + name; break; case t_base_type::TYPE_STRING: - out << indent() << "$len = unpack('N', " << itrans << "->readAll(4));" << endl - << indent() << "$len = $len[1];" << endl << indent() << "if ($len > 0x7fffffff) {" - << endl << indent() << " $len = 0 - (($len - 1) ^ 0xffffffff);" << endl << indent() - << "}" << endl << indent() << "$" << name << " = " << itrans << "->readAll($len);" - << endl; + out << indent() << "$len = unpack('N', " << itrans << "->readAll(4));" << '\n' + << indent() << "$len = $len[1];" << '\n' << indent() << "if ($len > 0x7fffffff) {" + << '\n' << indent() << " $len = 0 - (($len - 1) ^ 0xffffffff);" << '\n' << indent() + << "}" << '\n' << indent() << "$" << name << " = " << itrans << "->readAll($len);" + << '\n'; break; case t_base_type::TYPE_BOOL: out << indent() << "$" << name << " = unpack('c', " << itrans << "->readAll(1));" - << endl << indent() << "$" << name << " = (bool)$" << name << "[1];" << endl; + << '\n' << indent() << "$" << name << " = (bool)$" << name << "[1];" << '\n'; break; case t_base_type::TYPE_I8: out << indent() << "$" << name << " = unpack('c', " << itrans << "->readAll(1));" - << endl << indent() << "$" << name << " = $" << name << "[1];" << endl; + << '\n' << indent() << "$" << name << " = $" << name << "[1];" << '\n'; break; case t_base_type::TYPE_I16: - out << indent() << "$val = unpack('n', " << itrans << "->readAll(2));" << endl - << indent() << "$val = $val[1];" << endl << indent() << "if ($val > 0x7fff) {" - << endl << indent() << " $val = 0 - (($val - 1) ^ 0xffff);" << endl << indent() - << "}" << endl << indent() << "$" << name << " = $val;" << endl; + out << indent() << "$val = unpack('n', " << itrans << "->readAll(2));" << '\n' + << indent() << "$val = $val[1];" << '\n' << indent() << "if ($val > 0x7fff) {" + << '\n' << indent() << " $val = 0 - (($val - 1) ^ 0xffff);" << '\n' << indent() + << "}" << '\n' << indent() << "$" << name << " = $val;" << '\n'; break; case t_base_type::TYPE_I32: - out << indent() << "$val = unpack('N', " << itrans << "->readAll(4));" << endl - << indent() << "$val = $val[1];" << endl << indent() << "if ($val > 0x7fffffff) {" - << endl << indent() << " $val = 0 - (($val - 1) ^ 0xffffffff);" << endl << indent() - << "}" << endl << indent() << "$" << name << " = $val;" << endl; + out << indent() << "$val = unpack('N', " << itrans << "->readAll(4));" << '\n' + << indent() << "$val = $val[1];" << '\n' << indent() << "if ($val > 0x7fffffff) {" + << '\n' << indent() << " $val = 0 - (($val - 1) ^ 0xffffffff);" << '\n' << indent() + << "}" << '\n' << indent() << "$" << name << " = $val;" << '\n'; break; case t_base_type::TYPE_I64: - out << indent() << "$arr = unpack('N2', " << itrans << "->readAll(8));" << endl - << indent() << "if ($arr[1] & 0x80000000) {" << endl << indent() - << " $arr[1] = $arr[1] ^ 0xFFFFFFFF;" << endl << indent() - << " $arr[2] = $arr[2] ^ 0xFFFFFFFF;" << endl << indent() << " $" << name - << " = 0 - $arr[1]*4294967296 - $arr[2] - 1;" << endl << indent() << "} else {" - << endl << indent() << " $" << name << " = $arr[1]*4294967296 + $arr[2];" << endl - << indent() << "}" << endl; + out << indent() << "$arr = unpack('N2', " << itrans << "->readAll(8));" << '\n' + << indent() << "if ($arr[1] & 0x80000000) {" << '\n' << indent() + << " $arr[1] = $arr[1] ^ 0xFFFFFFFF;" << '\n' << indent() + << " $arr[2] = $arr[2] ^ 0xFFFFFFFF;" << '\n' << indent() << " $" << name + << " = 0 - $arr[1]*4294967296 - $arr[2] - 1;" << '\n' << indent() << "} else {" + << '\n' << indent() << " $" << name << " = $arr[1]*4294967296 + $arr[2];" << '\n' + << indent() << "}" << '\n'; break; case t_base_type::TYPE_DOUBLE: - out << indent() << "$arr = unpack('d', strrev(" << itrans << "->readAll(8)));" << endl - << indent() << "$" << name << " = $arr[1];" << endl; + out << indent() << "$arr = unpack('d', strrev(" << itrans << "->readAll(8)));" << '\n' + << indent() << "$" << name << " = $arr[1];" << '\n'; break; default: throw "compiler error: no PHP name for base type " + t_base_type::t_base_name(tbase) + tfield->get_name(); } } else if (type->is_enum()) { - out << indent() << "$val = unpack('N', " << itrans << "->readAll(4));" << endl << indent() - << "$val = $val[1];" << endl << indent() << "if ($val > 0x7fffffff) {" << endl - << indent() << " $val = 0 - (($val - 1) ^ 0xffffffff);" << endl << indent() << "}" - << endl << indent() << "$" << name << " = $val;" << endl; + out << indent() << "$val = unpack('N', " << itrans << "->readAll(4));" << '\n' << indent() + << "$val = $val[1];" << '\n' << indent() << "if ($val > 0x7fffffff) {" << '\n' + << indent() << " $val = 0 - (($val - 1) ^ 0xffffffff);" << '\n' << indent() << "}" + << '\n' << indent() << "$" << name << " = $val;" << '\n'; } } else { @@ -2224,7 +2222,7 @@ void t_php_generator::generate_deserialize_field(ostream& out, } else if (type->is_enum()) { out << "readI32($" << name << ");"; } - out << endl; + out << '\n'; } } else { printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", @@ -2242,8 +2240,8 @@ void t_php_generator::generate_deserialize_field(ostream& out, */ void t_php_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) { out << indent() << "$" << prefix << " = new " << php_namespace(tstruct->get_program()) - << tstruct->get_name() << "();" << endl << indent() << "$xfer += $" << prefix - << "->read($input);" << endl; + << tstruct->get_name() << "();" << '\n' << indent() << "$xfer += $" << prefix + << "->read($input);" << '\n'; } void t_php_generator::generate_deserialize_container(ostream& out, t_type* ttype, string prefix) { @@ -2257,44 +2255,44 @@ void t_php_generator::generate_deserialize_container(ostream& out, t_type* ttype t_field fvtype(g_type_i8, vtype); t_field fetype(g_type_i8, etype); - out << indent() << "$" << prefix << " = array();" << endl << indent() << "$" << size << " = 0;" - << endl; + out << indent() << "$" << prefix << " = array();" << '\n' << indent() << "$" << size << " = 0;" + << '\n'; // Declare variables, read header if (ttype->is_map()) { - out << indent() << "$" << ktype << " = 0;" << endl << indent() << "$" << vtype << " = 0;" - << endl; + out << indent() << "$" << ktype << " = 0;" << '\n' << indent() << "$" << vtype << " = 0;" + << '\n'; if (binary_inline_) { generate_deserialize_field(out, &fktype); generate_deserialize_field(out, &fvtype); generate_deserialize_field(out, &fsize); } else { out << indent() << "$xfer += $input->readMapBegin(" - << "$" << ktype << ", $" << vtype << ", $" << size << ");" << endl; + << "$" << ktype << ", $" << vtype << ", $" << size << ");" << '\n'; } } else if (ttype->is_set()) { if (binary_inline_) { generate_deserialize_field(out, &fetype); generate_deserialize_field(out, &fsize); } else { - out << indent() << "$" << etype << " = 0;" << endl << indent() + out << indent() << "$" << etype << " = 0;" << '\n' << indent() << "$xfer += $input->readSetBegin(" - << "$" << etype << ", $" << size << ");" << endl; + << "$" << etype << ", $" << size << ");" << '\n'; } } else if (ttype->is_list()) { if (binary_inline_) { generate_deserialize_field(out, &fetype); generate_deserialize_field(out, &fsize); } else { - out << indent() << "$" << etype << " = 0;" << endl << indent() + out << indent() << "$" << etype << " = 0;" << '\n' << indent() << "$xfer += $input->readListBegin(" - << "$" << etype << ", $" << size << ");" << endl; + << "$" << etype << ", $" << size << ");" << '\n'; } } // For loop iterates over elements string i = tmp("_i"); - indent(out) << "for ($" << i << " = 0; $" << i << " < $" << size << "; ++$" << i << ") {" << endl; + indent(out) << "for ($" << i << " = 0; $" << i << " < $" << size << "; ++$" << i << ") {" << '\n'; indent_up(); @@ -2311,11 +2309,11 @@ void t_php_generator::generate_deserialize_container(ostream& out, t_type* ttype if (!binary_inline_) { // Read container end if (ttype->is_map()) { - indent(out) << "$xfer += $input->readMapEnd();" << endl; + indent(out) << "$xfer += $input->readMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "$xfer += $input->readSetEnd();" << endl; + indent(out) << "$xfer += $input->readSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "$xfer += $input->readListEnd();" << endl; + indent(out) << "$xfer += $input->readListEnd();" << '\n'; } } } @@ -2329,28 +2327,28 @@ void t_php_generator::generate_deserialize_map_element(ostream& out, t_map* tmap t_field fkey(tmap->get_key_type(), key); t_field fval(tmap->get_val_type(), val); - indent(out) << declare_field(&fkey, true, true) << endl; - indent(out) << declare_field(&fval, true, true) << endl; + indent(out) << declare_field(&fkey, true, true) << '\n'; + indent(out) << declare_field(&fval, true, true) << '\n'; generate_deserialize_field(out, &fkey); generate_deserialize_field(out, &fval); - indent(out) << "$" << prefix << "[$" << key << "] = $" << val << ";" << endl; + indent(out) << "$" << prefix << "[$" << key << "] = $" << val << ";" << '\n'; } void t_php_generator::generate_deserialize_set_element(ostream& out, t_set* tset, string prefix) { string elem = tmp("elem"); t_field felem(tset->get_elem_type(), elem); - indent(out) << "$" << elem << " = null;" << endl; + indent(out) << "$" << elem << " = null;" << '\n'; generate_deserialize_field(out, &felem); t_type* elem_type = tset->get_elem_type(); if(php_is_scalar(elem_type)) { - indent(out) << "$" << prefix << "[$" << elem << "] = true;" << endl; + indent(out) << "$" << prefix << "[$" << elem << "] = true;" << '\n'; } else { - indent(out) << "$" << prefix << "[] = $" << elem << ";" << endl; + indent(out) << "$" << prefix << "[] = $" << elem << ";" << '\n'; } } @@ -2360,11 +2358,11 @@ void t_php_generator::generate_deserialize_list_element(ostream& out, string elem = tmp("elem"); t_field felem(tlist->get_elem_type(), elem); - indent(out) << "$" << elem << " = null;" << endl; + indent(out) << "$" << elem << " = null;" << '\n'; generate_deserialize_field(out, &felem); - indent(out) << "$" << prefix << " []= $" << elem << ";" << endl; + indent(out) << "$" << prefix << " []= $" << elem << ";" << '\n'; } /** @@ -2397,33 +2395,33 @@ void t_php_generator::generate_serialize_field(ostream& out, t_field* tfield, st throw "compiler error: cannot serialize void field in a struct: " + name; break; case t_base_type::TYPE_STRING: - out << indent() << "$output .= pack('N', strlen($" << name << "));" << endl << indent() - << "$output .= $" << name << ";" << endl; + out << indent() << "$output .= pack('N', strlen($" << name << "));" << '\n' << indent() + << "$output .= $" << name << ";" << '\n'; break; case t_base_type::TYPE_BOOL: - out << indent() << "$output .= pack('c', $" << name << " ? 1 : 0);" << endl; + out << indent() << "$output .= pack('c', $" << name << " ? 1 : 0);" << '\n'; break; case t_base_type::TYPE_I8: - out << indent() << "$output .= pack('c', $" << name << ");" << endl; + out << indent() << "$output .= pack('c', $" << name << ");" << '\n'; break; case t_base_type::TYPE_I16: - out << indent() << "$output .= pack('n', $" << name << ");" << endl; + out << indent() << "$output .= pack('n', $" << name << ");" << '\n'; break; case t_base_type::TYPE_I32: - out << indent() << "$output .= pack('N', $" << name << ");" << endl; + out << indent() << "$output .= pack('N', $" << name << ");" << '\n'; break; case t_base_type::TYPE_I64: out << indent() << "$output .= pack('N2', $" << name << " >> 32, $" << name - << " & 0xFFFFFFFF);" << endl; + << " & 0xFFFFFFFF);" << '\n'; break; case t_base_type::TYPE_DOUBLE: - out << indent() << "$output .= strrev(pack('d', $" << name << "));" << endl; + out << indent() << "$output .= strrev(pack('d', $" << name << "));" << '\n'; break; default: throw "compiler error: no PHP name for base type " + t_base_type::t_base_name(tbase); } } else if (type->is_enum()) { - out << indent() << "$output .= pack('N', $" << name << ");" << endl; + out << indent() << "$output .= pack('N', $" << name << ");" << '\n'; } } else { @@ -2462,7 +2460,7 @@ void t_php_generator::generate_serialize_field(ostream& out, t_field* tfield, st } else if (type->is_enum()) { out << "writeI32($" << name << ");"; } - out << endl; + out << '\n'; } } else { printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n", @@ -2480,7 +2478,7 @@ void t_php_generator::generate_serialize_field(ostream& out, t_field* tfield, st */ void t_php_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) { (void)tstruct; - indent(out) << "$xfer += $" << prefix << "->write($output);" << endl; + indent(out) << "$xfer += $" << prefix << "->write($output);" << '\n'; } /** @@ -2490,35 +2488,35 @@ void t_php_generator::generate_serialize_container(ostream& out, t_type* ttype, if (ttype->is_map()) { if (binary_inline_) { out << indent() << "$output .= pack('c', " << type_to_enum(((t_map*)ttype)->get_key_type()) - << ");" << endl << indent() << "$output .= pack('c', " - << type_to_enum(((t_map*)ttype)->get_val_type()) << ");" << endl << indent() - << "$output .= strrev(pack('l', count($" << prefix << ")));" << endl; + << ");" << '\n' << indent() << "$output .= pack('c', " + << type_to_enum(((t_map*)ttype)->get_val_type()) << ");" << '\n' << indent() + << "$output .= strrev(pack('l', count($" << prefix << ")));" << '\n'; } else { indent(out) << "$output->writeMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " - << "count($" << prefix << "));" << endl; + << "count($" << prefix << "));" << '\n'; } } else if (ttype->is_set()) { if (binary_inline_) { out << indent() << "$output .= pack('c', " << type_to_enum(((t_set*)ttype)->get_elem_type()) - << ");" << endl << indent() << "$output .= strrev(pack('l', count($" << prefix << ")));" - << endl; + << ");" << '\n' << indent() << "$output .= strrev(pack('l', count($" << prefix << ")));" + << '\n'; } else { indent(out) << "$output->writeSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " - << "count($" << prefix << "));" << endl; + << "count($" << prefix << "));" << '\n'; } } else if (ttype->is_list()) { if (binary_inline_) { out << indent() << "$output .= pack('c', " << type_to_enum(((t_list*)ttype)->get_elem_type()) - << ");" << endl << indent() << "$output .= strrev(pack('l', count($" << prefix << ")));" - << endl; + << ");" << '\n' << indent() << "$output .= strrev(pack('l', count($" << prefix << ")));" + << '\n'; } else { indent(out) << "$output->writeListBegin(" << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " - << "count($" << prefix << "));" << endl; + << "count($" << prefix << "));" << '\n'; } } @@ -2526,14 +2524,14 @@ void t_php_generator::generate_serialize_container(ostream& out, t_type* ttype, string kiter = tmp("kiter"); string viter = tmp("viter"); indent(out) << "foreach ($" << prefix << " as " - << "$" << kiter << " => $" << viter << ") {" << endl; + << "$" << kiter << " => $" << viter << ") {" << '\n'; indent_up(); generate_serialize_map_element(out, (t_map*)ttype, kiter, viter); scope_down(out); } else if (ttype->is_set()) { string iter = tmp("iter"); string iter_val = tmp("iter"); - indent(out) << "foreach ($" << prefix << " as $" << iter << " => $" << iter_val << ") {" << endl; + indent(out) << "foreach ($" << prefix << " as $" << iter << " => $" << iter_val << ") {" << '\n'; indent_up(); t_type* elem_type = ((t_set*)ttype)->get_elem_type(); @@ -2545,7 +2543,7 @@ void t_php_generator::generate_serialize_container(ostream& out, t_type* ttype, scope_down(out); } else if (ttype->is_list()) { string iter = tmp("iter"); - indent(out) << "foreach ($" << prefix << " as $" << iter << ") {" << endl; + indent(out) << "foreach ($" << prefix << " as $" << iter << ") {" << '\n'; indent_up(); generate_serialize_list_element(out, (t_list*)ttype, iter); scope_down(out); @@ -2553,11 +2551,11 @@ void t_php_generator::generate_serialize_container(ostream& out, t_type* ttype, if (!binary_inline_) { if (ttype->is_map()) { - indent(out) << "$output->writeMapEnd();" << endl; + indent(out) << "$output->writeMapEnd();" << '\n'; } else if (ttype->is_set()) { - indent(out) << "$output->writeSetEnd();" << endl; + indent(out) << "$output->writeSetEnd();" << '\n'; } else if (ttype->is_list()) { - indent(out) << "$output->writeListEnd();" << endl; + indent(out) << "$output->writeListEnd();" << '\n'; } } } @@ -2617,12 +2615,12 @@ void t_php_generator::generate_php_doc(ostream& out, t_field* field) { // prepend free-style doc if available if (field->has_doc()) { - ss << field->get_doc() << endl; + ss << field->get_doc() << '\n'; } // append @var tag t_type* type = get_true_type(field->get_type()); - ss << "@var " << type_to_phpdoc(type) << endl; + ss << "@var " << type_to_phpdoc(type) << '\n'; generate_php_docstring_comment(out, ss.str()); } @@ -2633,7 +2631,7 @@ void t_php_generator::generate_php_doc(ostream& out, t_field* field) { void t_php_generator::generate_php_doc(ostream& out, t_function* function) { stringstream ss; if (function->has_doc()) { - ss << function->get_doc() << endl; + ss << function->get_doc() << '\n'; } // generate parameter types doc @@ -2645,7 +2643,7 @@ void t_php_generator::generate_php_doc(ostream& out, t_function* function) { if (arg->has_doc()) { ss << " " << arg->get_doc(); } - ss << endl; + ss << '\n'; } // generate return type doc @@ -2655,7 +2653,7 @@ void t_php_generator::generate_php_doc(ostream& out, t_function* function) { if (ret_type->has_doc()) { ss << " " << ret_type->get_doc(); } - ss << endl; + ss << '\n'; } // generate exceptions doc @@ -2667,7 +2665,7 @@ void t_php_generator::generate_php_doc(ostream& out, t_function* function) { if (exc->has_doc()) { ss << " " << exc->get_doc(); } - ss << endl; + ss << '\n'; } generate_docstring_comment(out, "/**\n", " * ", ss.str(), " */\n"); diff --git a/compiler/cpp/src/thrift/generate/t_py_generator.cc b/compiler/cpp/src/thrift/generate/t_py_generator.cc index ffabd56521f..d3f23b6c89e 100644 --- a/compiler/cpp/src/thrift/generate/t_py_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_py_generator.cc @@ -40,8 +40,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /** * Python code generator. * @@ -414,22 +412,22 @@ void t_py_generator::init_generator() { for (sv_iter = services.begin(); sv_iter != services.end(); ++sv_iter) { f_init << ", '" << (*sv_iter)->get_name() << "'"; } - f_init << "]" << endl; + f_init << "]" << '\n'; f_init.close(); // Print header - f_types_ << py_autogen_comment() << endl - << py_imports() << endl - << render_includes() << endl - << "from thrift.transport import TTransport" << endl + f_types_ << py_autogen_comment() << '\n' + << py_imports() << '\n' + << render_includes() << '\n' + << "from thrift.transport import TTransport" << '\n' << import_dynbase_; - f_types_ << "all_structs = []" << endl; + f_types_ << "all_structs = []" << '\n'; f_consts_ << - py_autogen_comment() << endl << - py_imports() << endl << - "from .ttypes import *" << endl; + py_autogen_comment() << '\n' << + py_imports() << '\n' << + "from .ttypes import *" << '\n'; } /** @@ -464,16 +462,16 @@ string t_py_generator::py_imports() { ostringstream ss; ss << "from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, " "TApplicationException" - << endl + << '\n' << "from thrift.protocol.TProtocol import TProtocolException" - << endl + << '\n' << "from thrift.TRecursive import fix_spec" - << endl; + << '\n'; if (gen_enum_) { - ss << "from enum import IntEnum" << endl; + ss << "from enum import IntEnum" << '\n'; } if (gen_utf8strings_) { - ss << endl << "import sys"; + ss << '\n' << "import sys"; } return ss.str(); } @@ -484,8 +482,8 @@ string t_py_generator::py_imports() { void t_py_generator::close_generator() { // Fix thrift_spec definitions for recursive structs. - f_types_ << "fix_spec(all_structs)" << endl; - f_types_ << "del all_structs" << endl; + f_types_ << "fix_spec(all_structs)" << '\n'; + f_types_ << "del all_structs" << '\n'; // Close types file f_types_.close(); @@ -519,37 +517,37 @@ void t_py_generator::generate_enum(t_enum* tenum) { base_class = gen_dynbaseclass_; } - f_types_ << endl - << endl + f_types_ << '\n' + << '\n' << "class " << tenum->get_name() << (base_class.empty() ? "" : "(" + base_class + ")") << ":" - << endl; + << '\n'; indent_up(); generate_python_docstring(f_types_, tenum); - to_string_mapping << indent() << "_VALUES_TO_NAMES = {" << endl; - from_string_mapping << indent() << "_NAMES_TO_VALUES = {" << endl; + to_string_mapping << indent() << "_VALUES_TO_NAMES = {" << '\n'; + from_string_mapping << indent() << "_NAMES_TO_VALUES = {" << '\n'; vector constants = tenum->get_constants(); vector::iterator c_iter; for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { int value = (*c_iter)->get_value(); - indent(f_types_) << (*c_iter)->get_name() << " = " << value << endl; + indent(f_types_) << (*c_iter)->get_name() << " = " << value << '\n'; // Dictionaries to/from string names of enums to_string_mapping << indent() << indent() << value << ": \"" - << escape_string((*c_iter)->get_name()) << "\"," << endl; + << escape_string((*c_iter)->get_name()) << "\"," << '\n'; from_string_mapping << indent() << indent() << '"' << escape_string((*c_iter)->get_name()) - << "\": " << value << ',' << endl; + << "\": " << value << ',' << '\n'; } - to_string_mapping << indent() << "}" << endl; - from_string_mapping << indent() << "}" << endl; + to_string_mapping << indent() << "}" << '\n'; + from_string_mapping << indent() << "}" << '\n'; indent_down(); - f_types_ << endl; + f_types_ << '\n'; if (!gen_enum_) { - f_types_ << to_string_mapping.str() << endl << from_string_mapping.str(); + f_types_ << to_string_mapping.str() << '\n' << from_string_mapping.str(); } } @@ -562,7 +560,7 @@ void t_py_generator::generate_const(t_const* tconst) { t_const_value* value = tconst->get_value(); indent(f_consts_) << name << " = " << render_const_value(type, value); - f_consts_ << endl; + f_consts_ << '\n'; } /** @@ -612,7 +610,7 @@ string t_py_generator::render_const_value(t_type* type, t_const_value* value) { out << int_val; } } else if (type->is_struct() || type->is_xception()) { - out << type_name(type) << "(**{" << endl; + out << type_name(type) << "(**{" << '\n'; indent_up(); const vector& fields = ((t_struct*)type)->get_members(); vector::const_iterator f_iter; @@ -629,7 +627,7 @@ string t_py_generator::render_const_value(t_type* type, t_const_value* value) { throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string(); } indent(out) << render_const_value(g_type_string, v_iter->first) << ": " - << render_const_value(field_type, v_iter->second) << "," << endl; + << render_const_value(field_type, v_iter->second) << "," << '\n'; } indent_down(); indent(out) << "})"; @@ -639,13 +637,13 @@ string t_py_generator::render_const_value(t_type* type, t_const_value* value) { if (is_immutable(type)) { out << "TFrozenDict("; } - out << "{" << endl; + out << "{" << '\n'; indent_up(); const map& val = value->get_map(); map::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { indent(out) << render_const_value(ktype, v_iter->first) << ": " - << render_const_value(vtype, v_iter->second) << "," << endl; + << render_const_value(vtype, v_iter->second) << "," << '\n'; } indent_down(); indent(out) << "}"; @@ -666,15 +664,15 @@ string t_py_generator::render_const_value(t_type* type, t_const_value* value) { out << "set("; } if (is_immutable(type) || type->is_set()) { - out << "(" << endl; + out << "(" << '\n'; } else { - out << "[" << endl; + out << "[" << '\n'; } indent_up(); const vector& val = value->get_list(); vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { - indent(out) << render_const_value(etype, *v_iter) << "," << endl; + indent(out) << render_const_value(etype, *v_iter) << "," << '\n'; } indent_down(); if (is_immutable(type) || type->is_set()) { @@ -743,17 +741,17 @@ void t_py_generator::generate_py_thrift_spec(ostream& out, vector::const_iterator m_iter; // Add struct definition to list so thrift_spec can be fixed for recursive structures. - indent(out) << "all_structs.append(" << tstruct->get_name() << ")" << endl; + indent(out) << "all_structs.append(" << tstruct->get_name() << ")" << '\n'; if (sorted_members.empty() || (sorted_members[0]->get_key() >= 0)) { - indent(out) << tstruct->get_name() << ".thrift_spec = (" << endl; + indent(out) << tstruct->get_name() << ".thrift_spec = (" << '\n'; indent_up(); int sorted_keys_pos = 0; for (m_iter = sorted_members.begin(); m_iter != sorted_members.end(); ++m_iter) { for (; sorted_keys_pos != (*m_iter)->get_key(); sorted_keys_pos++) { - indent(out) << "None, # " << sorted_keys_pos << endl; + indent(out) << "None, # " << sorted_keys_pos << '\n'; } indent(out) << "(" << (*m_iter)->get_key() << ", " << type_to_enum((*m_iter)->get_type()) @@ -762,15 +760,15 @@ void t_py_generator::generate_py_thrift_spec(ostream& out, << ", " << type_to_spec_args((*m_iter)->get_type()) << ", " << render_field_default_value(*m_iter) << ", " << ")," - << " # " << sorted_keys_pos << endl; + << " # " << sorted_keys_pos << '\n'; sorted_keys_pos++; } indent_down(); - indent(out) << ")" << endl; + indent(out) << ")" << '\n'; } else { - indent(out) << tstruct->get_name() << ".thrift_spec = ()" << endl; + indent(out) << tstruct->get_name() << ".thrift_spec = ()" << '\n'; } } @@ -786,7 +784,7 @@ void t_py_generator::generate_py_struct_definition(ostream& out, const vector& sorted_members = tstruct->get_sorted_members(); vector::const_iterator m_iter; - out << endl << endl << "class " << tstruct->get_name(); + out << '\n' << '\n' << "class " << tstruct->get_name(); if (is_exception) { if (gen_dynamic_) { if (is_immutable(tstruct)) { @@ -806,11 +804,11 @@ void t_py_generator::generate_py_struct_definition(ostream& out, } else if (gen_newstyle_) { out << "(object)"; } - out << ":" << endl; + out << ":" << '\n'; indent_up(); generate_python_docstring(out, tstruct); - out << endl; + out << '\n'; /* Here we generate the structure specification for the fastbinary codec. @@ -833,13 +831,13 @@ void t_py_generator::generate_py_struct_definition(ostream& out, */ if (gen_slots_) { - indent(out) << "__slots__ = (" << endl; + indent(out) << "__slots__ = (" << '\n'; indent_up(); for (m_iter = sorted_members.begin(); m_iter != sorted_members.end(); ++m_iter) { - indent(out) << "'" << (*m_iter)->get_name() << "'," << endl; + indent(out) << "'" << (*m_iter)->get_name() << "'," << '\n'; } indent_down(); - indent(out) << ")" << endl << endl; + indent(out) << ")" << '\n' << '\n'; } // TODO(dreiss): Look into generating an empty tuple instead of None @@ -848,13 +846,13 @@ void t_py_generator::generate_py_struct_definition(ostream& out, // don't have thrift_spec. if (members.size() > 0) { - out << endl; + out << '\n'; out << indent() << "def __init__(self,"; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { out << " " << declare_argument(*m_iter) << ","; } - out << "):" << endl; + out << "):" << '\n'; indent_up(); @@ -863,10 +861,10 @@ void t_py_generator::generate_py_struct_definition(ostream& out, t_type* type = (*m_iter)->get_type(); if (!type->is_base_type() && !type->is_enum() && (*m_iter)->get_value() != nullptr) { indent(out) << "if " << (*m_iter)->get_name() << " is " - << "self.thrift_spec[" << (*m_iter)->get_key() << "][4]:" << endl; + << "self.thrift_spec[" << (*m_iter)->get_key() << "][4]:" << '\n'; indent_up(); indent(out) << (*m_iter)->get_name() << " = " << render_field_default_value(*m_iter) - << endl; + << '\n'; indent_down(); } @@ -875,16 +873,16 @@ void t_py_generator::generate_py_struct_definition(ostream& out, indent(out) << "super(" << tstruct->get_name() << ", self).__setattr__('" << (*m_iter)->get_name() << "', " << (*m_iter)->get_name() << " if hasattr(" << (*m_iter)->get_name() << ", 'value') else " - << type_name(type) << ".__members__.get(" << (*m_iter)->get_name() << "))" << endl; + << type_name(type) << ".__members__.get(" << (*m_iter)->get_name() << "))" << '\n'; } else if (gen_newstyle_ || gen_dynamic_) { indent(out) << "super(" << tstruct->get_name() << ", self).__setattr__('" - << (*m_iter)->get_name() << "', " << (*m_iter)->get_name() << ")" << endl; + << (*m_iter)->get_name() << "', " << (*m_iter)->get_name() << ")" << '\n'; } else { indent(out) << "self.__dict__['" << (*m_iter)->get_name() - << "'] = " << (*m_iter)->get_name() << endl; + << "'] = " << (*m_iter)->get_name() << '\n'; } } else { - indent(out) << "self." << (*m_iter)->get_name() << " = " << (*m_iter)->get_name() << endl; + indent(out) << "self." << (*m_iter)->get_name() << " = " << (*m_iter)->get_name() << '\n'; } } @@ -892,8 +890,8 @@ void t_py_generator::generate_py_struct_definition(ostream& out, } if (is_immutable(tstruct)) { - out << endl; - out << indent() << "def __setattr__(self, *args):" << endl; + out << '\n'; + out << indent() << "def __setattr__(self, *args):" << '\n'; indent_up(); // Not user-provided fields should be editable so that the Python Standard Library can edit @@ -902,16 +900,16 @@ void t_py_generator::generate_py_struct_definition(ostream& out, // trivial because we know which fields are user-provided, without slots we need to build a // way to know which fields are user-provided. if (gen_slots_ && !gen_dynamic_) { - out << indent() << "if args[0] not in self.__slots__:" << endl; + out << indent() << "if args[0] not in self.__slots__:" << '\n'; indent_up(); - out << indent() << "super().__setattr__(*args)" << endl - << indent() << "return" << endl; + out << indent() << "super().__setattr__(*args)" << '\n' + << indent() << "return" << '\n'; indent_down(); } - out << indent() << "raise TypeError(\"can't modify immutable instance\")" << endl; + out << indent() << "raise TypeError(\"can't modify immutable instance\")" << '\n'; indent_down(); - out << endl; - out << indent() << "def __delattr__(self, *args):" << endl; + out << '\n'; + out << indent() << "def __delattr__(self, *args):" << '\n'; indent_up(); // Not user-provided fields should be editable so that the Python Standard Library can edit @@ -920,26 +918,26 @@ void t_py_generator::generate_py_struct_definition(ostream& out, // trivial because we know which fields are user-provided, without slots we need to build a // way to know which fields are user-provided. if (gen_slots_ && !gen_dynamic_) { - out << indent() << "if args[0] not in self.__slots__:" << endl; + out << indent() << "if args[0] not in self.__slots__:" << '\n'; indent_up(); - out << indent() << "super().__delattr__(*args)" << endl - << indent() << "return" << endl; + out << indent() << "super().__delattr__(*args)" << '\n' + << indent() << "return" << '\n'; indent_down(); } - out << indent() << "raise TypeError(\"can't modify immutable instance\")" << endl; + out << indent() << "raise TypeError(\"can't modify immutable instance\")" << '\n'; indent_down(); - out << endl; + out << '\n'; // Hash all of the members in order, and also hash in the class // to avoid collisions for stuff like single-field structures. - out << indent() << "def __hash__(self):" << endl + out << indent() << "def __hash__(self):" << '\n' << indent() << indent_str() << "return hash(self.__class__) ^ hash(("; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { out << "self." << (*m_iter)->get_name() << ", "; } - out << "))" << endl; + out << "))" << '\n'; } else if (gen_enum_) { bool has_enum = false; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -951,25 +949,25 @@ void t_py_generator::generate_py_struct_definition(ostream& out, } if (has_enum) { - out << endl; - indent(out) << "def __setattr__(self, name, value):" << endl; + out << '\n'; + indent(out) << "def __setattr__(self, name, value):" << '\n'; indent_up(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_type* type = (*m_iter)->get_type(); if (type->is_enum()) { - out << indent() << "if name == \"" << (*m_iter)->get_name() << "\":" << endl + out << indent() << "if name == \"" << (*m_iter)->get_name() << "\":" << '\n' << indent() << indent_str() << "super().__setattr__(name, value if hasattr(value, 'value') else " - << type_name(type) << ".__members__.get(value))" << endl - << indent() << indent_str() << "return" << endl; + << type_name(type) << ".__members__.get(value))" << '\n' + << indent() << indent_str() << "return" << '\n'; } } - indent(out) << "super().__setattr__(name, value)" << endl << endl; + indent(out) << "super().__setattr__(name, value)" << '\n' << '\n'; indent_down(); } } if (!gen_dynamic_) { - out << endl; + out << '\n'; generate_py_struct_reader(out, tstruct); generate_py_struct_writer(out, tstruct); } @@ -978,64 +976,64 @@ void t_py_generator::generate_py_struct_definition(ostream& out, // because when raised exceptions are printed to the console, __repr__ // isn't used. See python bug #5882 if (is_exception) { - out << endl; - out << indent() << "def __str__(self):" << endl - << indent() << indent_str() << "return repr(self)" << endl; + out << '\n'; + out << indent() << "def __str__(self):" << '\n' + << indent() << indent_str() << "return repr(self)" << '\n'; } if (!gen_slots_) { - out << endl; + out << '\n'; // Printing utilities so that on the command line thrift // structs look pretty like dictionaries - indent(out) << "def __repr__(self):" << endl; + indent(out) << "def __repr__(self):" << '\n'; indent_up(); - out << indent() << "L = ['%s=%r' % (key, value)" << endl - << indent() << " for key, value in self.__dict__.items()]" << endl - << indent() << "return '%s(%s)' % (self.__class__.__name__, ', '.join(L))" << endl - << endl; + out << indent() << "L = ['%s=%r' % (key, value)" << '\n' + << indent() << " for key, value in self.__dict__.items()]" << '\n' + << indent() << "return '%s(%s)' % (self.__class__.__name__, ', '.join(L))" << '\n' + << '\n'; indent_down(); // Equality and inequality methods that compare by value - out << indent() << "def __eq__(self, other):" << endl; + out << indent() << "def __eq__(self, other):" << '\n'; indent_up(); out << indent() << "return isinstance(other, self.__class__) and " - "self.__dict__ == other.__dict__" << endl; + "self.__dict__ == other.__dict__" << '\n'; indent_down(); - out << endl; + out << '\n'; - out << indent() << "def __ne__(self, other):" << endl; + out << indent() << "def __ne__(self, other):" << '\n'; indent_up(); - out << indent() << "return not (self == other)" << endl; + out << indent() << "return not (self == other)" << '\n'; indent_down(); } else if (!gen_dynamic_) { - out << endl; + out << '\n'; // no base class available to implement __eq__ and __repr__ and __ne__ for us // so we must provide one that uses __slots__ - indent(out) << "def __repr__(self):" << endl; + indent(out) << "def __repr__(self):" << '\n'; indent_up(); - out << indent() << "L = ['%s=%r' % (key, getattr(self, key))" << endl - << indent() << " for key in self.__slots__]" << endl - << indent() << "return '%s(%s)' % (self.__class__.__name__, ', '.join(L))" << endl - << endl; + out << indent() << "L = ['%s=%r' % (key, getattr(self, key))" << '\n' + << indent() << " for key in self.__slots__]" << '\n' + << indent() << "return '%s(%s)' % (self.__class__.__name__, ', '.join(L))" << '\n' + << '\n'; indent_down(); // Equality method that compares each attribute by value and type, walking __slots__ - out << indent() << "def __eq__(self, other):" << endl; + out << indent() << "def __eq__(self, other):" << '\n'; indent_up(); - out << indent() << "if not isinstance(other, self.__class__):" << endl - << indent() << indent_str() << "return False" << endl - << indent() << "for attr in self.__slots__:" << endl - << indent() << indent_str() << "my_val = getattr(self, attr)" << endl - << indent() << indent_str() << "other_val = getattr(other, attr)" << endl - << indent() << indent_str() << "if my_val != other_val:" << endl - << indent() << indent_str() << indent_str() << "return False" << endl - << indent() << "return True" << endl - << endl; + out << indent() << "if not isinstance(other, self.__class__):" << '\n' + << indent() << indent_str() << "return False" << '\n' + << indent() << "for attr in self.__slots__:" << '\n' + << indent() << indent_str() << "my_val = getattr(self, attr)" << '\n' + << indent() << indent_str() << "other_val = getattr(other, attr)" << '\n' + << indent() << indent_str() << "if my_val != other_val:" << '\n' + << indent() << indent_str() << indent_str() << "return False" << '\n' + << indent() << "return True" << '\n' + << '\n'; indent_down(); - out << indent() << "def __ne__(self, other):" << endl - << indent() << indent_str() << "return not (self == other)" << endl; + out << indent() << "def __ne__(self, other):" << '\n' + << indent() << indent_str() << "return not (self == other)" << '\n'; } indent_down(); } @@ -1048,9 +1046,9 @@ void t_py_generator::generate_py_struct_reader(ostream& out, t_struct* tstruct) vector::const_iterator f_iter; if (is_immutable(tstruct)) { - out << indent() << "@classmethod" << endl << indent() << "def read(cls, iprot):" << endl; + out << indent() << "@classmethod" << '\n' << indent() << "def read(cls, iprot):" << '\n'; } else { - indent(out) << "def read(self, iprot):" << endl; + indent(out) << "def read(self, iprot):" << '\n'; } indent_up(); @@ -1059,18 +1057,18 @@ void t_py_generator::generate_py_struct_reader(ostream& out, t_struct* tstruct) indent(out) << "if iprot._fast_decode is not None " "and isinstance(iprot.trans, TTransport.CReadableTransport) " "and " - << id << ".thrift_spec is not None:" << endl; + << id << ".thrift_spec is not None:" << '\n'; indent_up(); if (is_immutable(tstruct)) { - indent(out) << "return iprot._fast_decode(None, iprot, [cls, cls.thrift_spec])" << endl; + indent(out) << "return iprot._fast_decode(None, iprot, [cls, cls.thrift_spec])" << '\n'; } else { - indent(out) << "iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])" << endl; - indent(out) << "return" << endl; + indent(out) << "iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])" << '\n'; + indent(out) << "return" << '\n'; } indent_down(); - indent(out) << "iprot.readStructBegin()" << endl; + indent(out) << "iprot.readStructBegin()" << '\n'; if (is_immutable(tstruct)) { for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { @@ -1082,21 +1080,21 @@ void t_py_generator::generate_py_struct_reader(ostream& out, t_struct* tstruct) } else { result << "None"; } - indent(out) << result.str() << endl; + indent(out) << result.str() << '\n'; } } // Loop over reading in fields - indent(out) << "while True:" << endl; + indent(out) << "while True:" << '\n'; indent_up(); // Read beginning field marker - indent(out) << "(fname, ftype, fid) = iprot.readFieldBegin()" << endl; + indent(out) << "(fname, ftype, fid) = iprot.readFieldBegin()" << '\n'; // Check for field STOP marker and break - indent(out) << "if ftype == TType.STOP:" << endl; + indent(out) << "if ftype == TType.STOP:" << '\n'; indent_up(); - indent(out) << "break" << endl; + indent(out) << "break" << '\n'; indent_down(); // Switch statement on the field we are reading @@ -1110,9 +1108,9 @@ void t_py_generator::generate_py_struct_reader(ostream& out, t_struct* tstruct) } else { out << indent() << "elif "; } - out << "fid == " << (*f_iter)->get_key() << ":" << endl; + out << "fid == " << (*f_iter)->get_key() << ":" << '\n'; indent_up(); - indent(out) << "if ftype == " << type_to_enum((*f_iter)->get_type()) << ":" << endl; + indent(out) << "if ftype == " << type_to_enum((*f_iter)->get_type()) << ":" << '\n'; indent_up(); if (is_immutable(tstruct)) { generate_deserialize_field(out, *f_iter); @@ -1120,32 +1118,32 @@ void t_py_generator::generate_py_struct_reader(ostream& out, t_struct* tstruct) generate_deserialize_field(out, *f_iter, "self."); } indent_down(); - out << indent() << "else:" << endl << indent() << indent_str() << "iprot.skip(ftype)" << endl; + out << indent() << "else:" << '\n' << indent() << indent_str() << "iprot.skip(ftype)" << '\n'; indent_down(); } // In the default case we skip the field - out << indent() << "else:" << endl << indent() << indent_str() << "iprot.skip(ftype)" << endl; + out << indent() << "else:" << '\n' << indent() << indent_str() << "iprot.skip(ftype)" << '\n'; // Read field end marker - indent(out) << "iprot.readFieldEnd()" << endl; + indent(out) << "iprot.readFieldEnd()" << '\n'; indent_down(); - indent(out) << "iprot.readStructEnd()" << endl; + indent(out) << "iprot.readStructEnd()" << '\n'; if (is_immutable(tstruct)) { - indent(out) << "return cls(" << endl; + indent(out) << "return cls(" << '\n'; indent_up(); for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - indent(out) << (*f_iter)->get_name() << "=" << (*f_iter)->get_name() << "," << endl; + indent(out) << (*f_iter)->get_name() << "=" << (*f_iter)->get_name() << "," << '\n'; } indent_down(); - indent(out) << ")" << endl; + indent(out) << ")" << '\n'; } indent_down(); - out << endl; + out << '\n'; } void t_py_generator::generate_py_struct_writer(ostream& out, t_struct* tstruct) { @@ -1153,49 +1151,49 @@ void t_py_generator::generate_py_struct_writer(ostream& out, t_struct* tstruct) const vector& fields = tstruct->get_sorted_members(); vector::const_iterator f_iter; - indent(out) << "def write(self, oprot):" << endl; + indent(out) << "def write(self, oprot):" << '\n'; indent_up(); - indent(out) << "if oprot._fast_encode is not None and self.thrift_spec is not None:" << endl; + indent(out) << "if oprot._fast_encode is not None and self.thrift_spec is not None:" << '\n'; indent_up(); indent(out) << "oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))" - << endl; - indent(out) << "return" << endl; + << '\n'; + indent(out) << "return" << '\n'; indent_down(); - indent(out) << "oprot.writeStructBegin('" << name << "')" << endl; + indent(out) << "oprot.writeStructBegin('" << name << "')" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { // Write field header - indent(out) << "if self." << (*f_iter)->get_name() << " is not None:" << endl; + indent(out) << "if self." << (*f_iter)->get_name() << " is not None:" << '\n'; indent_up(); indent(out) << "oprot.writeFieldBegin(" << "'" << (*f_iter)->get_name() << "', " << type_to_enum((*f_iter)->get_type()) - << ", " << (*f_iter)->get_key() << ")" << endl; + << ", " << (*f_iter)->get_key() << ")" << '\n'; // Write field contents generate_serialize_field(out, *f_iter, "self."); // Write field closer - indent(out) << "oprot.writeFieldEnd()" << endl; + indent(out) << "oprot.writeFieldEnd()" << '\n'; indent_down(); } // Write the struct map - out << indent() << "oprot.writeFieldStop()" << endl << indent() << "oprot.writeStructEnd()" - << endl; + out << indent() << "oprot.writeFieldStop()" << '\n' << indent() << "oprot.writeStructEnd()" + << '\n'; - out << endl; + out << '\n'; indent_down(); generate_py_struct_required_validator(out, tstruct); } void t_py_generator::generate_py_struct_required_validator(ostream& out, t_struct* tstruct) { - indent(out) << "def validate(self):" << endl; + indent(out) << "def validate(self):" << '\n'; indent_up(); const vector& fields = tstruct->get_members(); @@ -1206,14 +1204,14 @@ void t_py_generator::generate_py_struct_required_validator(ostream& out, t_struc for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { t_field* field = (*f_iter); if (field->get_req() == t_field::T_REQUIRED) { - indent(out) << "if self." << field->get_name() << " is None:" << endl; + indent(out) << "if self." << field->get_name() << " is None:" << '\n'; indent(out) << indent_str() << "raise TProtocolException(message='Required field " - << field->get_name() << " is unset!')" << endl; + << field->get_name() << " is unset!')" << '\n'; } } } - indent(out) << "return" << endl; + indent(out) << "return" << '\n'; indent_down(); } @@ -1226,32 +1224,32 @@ void t_py_generator::generate_service(t_service* tservice) { string f_service_name = package_dir_ + "/" + service_name_ + ".py"; f_service_.open(f_service_name.c_str()); - f_service_ << py_autogen_comment() << endl << py_imports() << endl; + f_service_ << py_autogen_comment() << '\n' << py_imports() << '\n'; if (tservice->get_extends() != nullptr) { f_service_ << "import " << get_real_py_module(tservice->get_extends()->get_program(), gen_twisted_, package_prefix_) << "." - << tservice->get_extends()->get_name() << endl; + << tservice->get_extends()->get_name() << '\n'; } - f_service_ << "import logging" << endl - << "from .ttypes import *" << endl - << "from thrift.Thrift import TProcessor" << endl - << "from thrift.transport import TTransport" << endl + f_service_ << "import logging" << '\n' + << "from .ttypes import *" << '\n' + << "from thrift.Thrift import TProcessor" << '\n' + << "from thrift.transport import TTransport" << '\n' << import_dynbase_; if (gen_zope_interface_) { - f_service_ << "from zope.interface import Interface, implementer" << endl; + f_service_ << "from zope.interface import Interface, implementer" << '\n'; } if (gen_twisted_) { - f_service_ << "from twisted.internet import defer" << endl - << "from thrift.transport import TTwisted" << endl; + f_service_ << "from twisted.internet import defer" << '\n' + << "from thrift.transport import TTwisted" << '\n'; } else if (gen_tornado_) { - f_service_ << "from tornado import gen" << endl; - f_service_ << "from tornado import concurrent" << endl; + f_service_ << "from tornado import gen" << '\n'; + f_service_ << "from tornado import concurrent" << '\n'; } - f_service_ << "all_structs = []" << endl; + f_service_ << "all_structs = []" << '\n'; // Generate the three main parts of the service generate_service_interface(tservice); @@ -1261,8 +1259,8 @@ void t_py_generator::generate_service(t_service* tservice) { generate_service_remote(tservice); // Close service file - f_service_ << "fix_spec(all_structs)" << endl - << "del all_structs" << endl; + f_service_ << "fix_spec(all_structs)" << '\n' + << "del all_structs" << '\n'; f_service_.close(); } @@ -1275,7 +1273,7 @@ void t_py_generator::generate_service_helpers(t_service* tservice) { vector functions = tservice->get_functions(); vector::iterator f_iter; - f_service_ << endl << "# HELPER FUNCTIONS AND STRUCTURES" << endl; + f_service_ << '\n' << "# HELPER FUNCTIONS AND STRUCTURES" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { t_struct* ts = (*f_iter)->get_arglist(); @@ -1328,12 +1326,12 @@ void t_py_generator::generate_service_interface(t_service* tservice) { } } - f_service_ << endl << endl << "class Iface" << extends_if << ":" << endl; + f_service_ << '\n' << '\n' << "class Iface" << extends_if << ":" << '\n'; indent_up(); generate_python_docstring(f_service_, tservice); vector functions = tservice->get_functions(); if (functions.empty()) { - f_service_ << indent() << "pass" << endl; + f_service_ << indent() << "pass" << '\n'; } else { vector::iterator f_iter; bool first = true; @@ -1341,12 +1339,12 @@ void t_py_generator::generate_service_interface(t_service* tservice) { if (first) { first = false; } else { - f_service_ << endl; + f_service_ << '\n'; } - f_service_ << indent() << "def " << function_signature(*f_iter, true) << ":" << endl; + f_service_ << indent() << "def " << function_signature(*f_iter, true) << ":" << '\n'; indent_up(); generate_python_docstring(f_service_, (*f_iter)); - f_service_ << indent() << "pass" << endl; + f_service_ << indent() << "pass" << '\n'; indent_down(); } } @@ -1375,91 +1373,91 @@ void t_py_generator::generate_service_client(t_service* tservice) { } } - f_service_ << endl << endl; + f_service_ << '\n' << '\n'; if (gen_zope_interface_) { - f_service_ << "@implementer(Iface)" << endl - << "class Client" << extends_client << ":" << endl - << endl; + f_service_ << "@implementer(Iface)" << '\n' + << "class Client" << extends_client << ":" << '\n' + << '\n'; } else { - f_service_ << "class Client(" << extends_client << "Iface):" << endl; + f_service_ << "class Client(" << extends_client << "Iface):" << '\n'; } indent_up(); generate_python_docstring(f_service_, tservice); // Constructor function if (gen_twisted_) { - f_service_ << indent() << "def __init__(self, transport, oprot_factory):" << endl; + f_service_ << indent() << "def __init__(self, transport, oprot_factory):" << '\n'; } else if (gen_tornado_) { f_service_ << indent() - << "def __init__(self, transport, iprot_factory, oprot_factory=None):" << endl; + << "def __init__(self, transport, iprot_factory, oprot_factory=None):" << '\n'; } else { - f_service_ << indent() << "def __init__(self, iprot, oprot=None):" << endl; + f_service_ << indent() << "def __init__(self, iprot, oprot=None):" << '\n'; } indent_up(); if (extends.empty()) { if (gen_twisted_) { - f_service_ << indent() << "self._transport = transport" << endl - << indent() << "self._oprot_factory = oprot_factory" << endl - << indent() << "self._seqid = 0" << endl - << indent() << "self._reqs = {}" << endl; + f_service_ << indent() << "self._transport = transport" << '\n' + << indent() << "self._oprot_factory = oprot_factory" << '\n' + << indent() << "self._seqid = 0" << '\n' + << indent() << "self._reqs = {}" << '\n'; } else if (gen_tornado_) { - f_service_ << indent() << "self._transport = transport" << endl - << indent() << "self._iprot_factory = iprot_factory" << endl + f_service_ << indent() << "self._transport = transport" << '\n' + << indent() << "self._iprot_factory = iprot_factory" << '\n' << indent() << "self._oprot_factory = (oprot_factory if oprot_factory is not None" - << endl - << indent() << " else iprot_factory)" << endl - << indent() << "self._seqid = 0" << endl - << indent() << "self._reqs = {}" << endl + << '\n' + << indent() << " else iprot_factory)" << '\n' + << indent() << "self._seqid = 0" << '\n' + << indent() << "self._reqs = {}" << '\n' << indent() << "self._transport.io_loop.spawn_callback(self._start_receiving)" - << endl; + << '\n'; } else { - f_service_ << indent() << "self._iprot = self._oprot = iprot" << endl - << indent() << "if oprot is not None:" << endl - << indent() << indent_str() << "self._oprot = oprot" << endl - << indent() << "self._seqid = 0" << endl; + f_service_ << indent() << "self._iprot = self._oprot = iprot" << '\n' + << indent() << "if oprot is not None:" << '\n' + << indent() << indent_str() << "self._oprot = oprot" << '\n' + << indent() << "self._seqid = 0" << '\n'; } } else { if (gen_twisted_) { f_service_ << indent() << extends - << ".Client.__init__(self, transport, oprot_factory)" << endl; + << ".Client.__init__(self, transport, oprot_factory)" << '\n'; } else if (gen_tornado_) { f_service_ << indent() << extends - << ".Client.__init__(self, transport, iprot_factory, oprot_factory)" << endl; + << ".Client.__init__(self, transport, iprot_factory, oprot_factory)" << '\n'; } else { - f_service_ << indent() << extends << ".Client.__init__(self, iprot, oprot)" << endl; + f_service_ << indent() << extends << ".Client.__init__(self, iprot, oprot)" << '\n'; } } indent_down(); if (gen_tornado_ && extends.empty()) { - f_service_ << endl << - indent() << "@gen.engine" << endl << - indent() << "def _start_receiving(self):" << endl; + f_service_ << '\n' << + indent() << "@gen.engine" << '\n' << + indent() << "def _start_receiving(self):" << '\n'; indent_up(); - indent(f_service_) << "while True:" << endl; + indent(f_service_) << "while True:" << '\n'; indent_up(); - f_service_ << indent() << "try:" << endl - << indent() << indent_str() << "frame = yield self._transport.readFrame()" << endl - << indent() << "except TTransport.TTransportException as e:" << endl - << indent() << indent_str() << "for future in self._reqs.values():" << endl - << indent() << indent_str() << indent_str() << "future.set_exception(e)" << endl - << indent() << indent_str() << "self._reqs = {}" << endl - << indent() << indent_str() << "return" << endl - << indent() << "tr = TTransport.TMemoryBuffer(frame)" << endl - << indent() << "iprot = self._iprot_factory.getProtocol(tr)" << endl - << indent() << "(fname, mtype, rseqid) = iprot.readMessageBegin()" << endl - << indent() << "method = getattr(self, 'recv_' + fname)" << endl - << indent() << "future = self._reqs.pop(rseqid, None)" << endl - << indent() << "if not future:" << endl - << indent() << indent_str() << "# future has already been discarded" << endl - << indent() << indent_str() << "continue" << endl - << indent() << "try:" << endl - << indent() << indent_str() << "result = method(iprot, mtype, rseqid)" << endl - << indent() << "except Exception as e:" << endl - << indent() << indent_str() << "future.set_exception(e)" << endl - << indent() << "else:" << endl - << indent() << indent_str() << "future.set_result(result)" << endl; + f_service_ << indent() << "try:" << '\n' + << indent() << indent_str() << "frame = yield self._transport.readFrame()" << '\n' + << indent() << "except TTransport.TTransportException as e:" << '\n' + << indent() << indent_str() << "for future in self._reqs.values():" << '\n' + << indent() << indent_str() << indent_str() << "future.set_exception(e)" << '\n' + << indent() << indent_str() << "self._reqs = {}" << '\n' + << indent() << indent_str() << "return" << '\n' + << indent() << "tr = TTransport.TMemoryBuffer(frame)" << '\n' + << indent() << "iprot = self._iprot_factory.getProtocol(tr)" << '\n' + << indent() << "(fname, mtype, rseqid) = iprot.readMessageBegin()" << '\n' + << indent() << "method = getattr(self, 'recv_' + fname)" << '\n' + << indent() << "future = self._reqs.pop(rseqid, None)" << '\n' + << indent() << "if not future:" << '\n' + << indent() << indent_str() << "# future has already been discarded" << '\n' + << indent() << indent_str() << "continue" << '\n' + << indent() << "try:" << '\n' + << indent() << indent_str() << "result = method(iprot, mtype, rseqid)" << '\n' + << indent() << "except Exception as e:" << '\n' + << indent() << indent_str() << "future.set_exception(e)" << '\n' + << indent() << "else:" << '\n' + << indent() << indent_str() << "future.set_result(result)" << '\n'; indent_down(); indent_down(); } @@ -1473,20 +1471,20 @@ void t_py_generator::generate_service_client(t_service* tservice) { vector::const_iterator fld_iter; string funname = (*f_iter)->get_name(); - f_service_ << endl; + f_service_ << '\n'; // Open function - indent(f_service_) << "def " << function_signature(*f_iter, false) << ":" << endl; + indent(f_service_) << "def " << function_signature(*f_iter, false) << ":" << '\n'; indent_up(); generate_python_docstring(f_service_, (*f_iter)); if (gen_twisted_) { - indent(f_service_) << "seqid = self._seqid = self._seqid + 1" << endl; - indent(f_service_) << "self._reqs[seqid] = defer.Deferred()" << endl << endl; + indent(f_service_) << "seqid = self._seqid = self._seqid + 1" << '\n'; + indent(f_service_) << "self._reqs[seqid] = defer.Deferred()" << '\n' << '\n'; indent(f_service_) << "d = defer.maybeDeferred(self.send_" << funname; } else if (gen_tornado_) { - indent(f_service_) << "self._seqid += 1" << endl; + indent(f_service_) << "self._seqid += 1" << '\n'; if (!(*f_iter)->is_oneway()) { - indent(f_service_) << "future = self._reqs[self._seqid] = concurrent.Future()" << endl; + indent(f_service_) << "future = self._reqs[self._seqid] = concurrent.Future()" << '\n'; } indent(f_service_) << "self.send_" << funname << "("; @@ -1509,19 +1507,19 @@ void t_py_generator::generate_service_client(t_service* tservice) { f_service_ << (*fld_iter)->get_name(); } - f_service_ << ")" << endl; + f_service_ << ")" << '\n'; if (!(*f_iter)->is_oneway()) { if (gen_twisted_) { // nothing. See the next block. } else if (gen_tornado_) { - indent(f_service_) << "return future" << endl; + indent(f_service_) << "return future" << '\n'; } else { f_service_ << indent(); if (!(*f_iter)->get_returntype()->is_void()) { f_service_ << "return "; } - f_service_ << "self.recv_" << funname << "()" << endl; + f_service_ << "self.recv_" << funname << "()" << '\n'; } } indent_down(); @@ -1529,40 +1527,40 @@ void t_py_generator::generate_service_client(t_service* tservice) { if (gen_twisted_) { // This block injects the body of the send_<> method for twisted (and a cb/eb pair) indent_up(); - indent(f_service_) << "d.addCallbacks(" << endl; + indent(f_service_) << "d.addCallbacks(" << '\n'; indent_up(); - f_service_ << indent() << "callback=self.cb_send_" << funname << "," << endl << indent() - << "callbackArgs=(seqid,)," << endl << indent() << "errback=self.eb_send_" - << funname << "," << endl << indent() << "errbackArgs=(seqid,))" << endl; + f_service_ << indent() << "callback=self.cb_send_" << funname << "," << '\n' << indent() + << "callbackArgs=(seqid,)," << '\n' << indent() << "errback=self.eb_send_" + << funname << "," << '\n' << indent() << "errbackArgs=(seqid,))" << '\n'; indent_down(); - indent(f_service_) << "return d" << endl; + indent(f_service_) << "return d" << '\n'; indent_down(); - f_service_ << endl; + f_service_ << '\n'; - indent(f_service_) << "def cb_send_" << funname << "(self, _, seqid):" << endl; + indent(f_service_) << "def cb_send_" << funname << "(self, _, seqid):" << '\n'; indent_up(); if ((*f_iter)->is_oneway()) { // if one-way, fire the deferred & remove it from _reqs - f_service_ << indent() << "d = self._reqs.pop(seqid)" << endl << indent() - << "d.callback(None)" << endl << indent() << "return d" << endl; + f_service_ << indent() << "d = self._reqs.pop(seqid)" << '\n' << indent() + << "d.callback(None)" << '\n' << indent() << "return d" << '\n'; } else { - f_service_ << indent() << "return self._reqs[seqid]" << endl; + f_service_ << indent() << "return self._reqs[seqid]" << '\n'; } indent_down(); - f_service_ << endl; + f_service_ << '\n'; // add an errback to fail the request if the call to send_<> raised an exception - indent(f_service_) << "def eb_send_" << funname << "(self, f, seqid):" << endl; + indent(f_service_) << "def eb_send_" << funname << "(self, f, seqid):" << '\n'; indent_up(); - f_service_ << indent() << "d = self._reqs.pop(seqid)" << endl << indent() << "d.errback(f)" - << endl << indent() << "return d" << endl; + f_service_ << indent() << "d = self._reqs.pop(seqid)" << '\n' << indent() << "d.errback(f)" + << '\n' << indent() << "return d" << '\n'; indent_down(); } - f_service_ << endl; - indent(f_service_) << "def send_" << function_signature(*f_iter, false) << ":" << endl; + f_service_ << '\n'; + indent(f_service_) << "def send_" << function_signature(*f_iter, false) << ":" << '\n'; indent_up(); std::string argsname = (*f_iter)->get_name() + "_args"; @@ -1570,29 +1568,29 @@ void t_py_generator::generate_service_client(t_service* tservice) { // Serialize the request header if (gen_twisted_ || gen_tornado_) { - f_service_ << indent() << "oprot = self._oprot_factory.getProtocol(self._transport)" << endl + f_service_ << indent() << "oprot = self._oprot_factory.getProtocol(self._transport)" << '\n' << indent() << "oprot.writeMessageBegin('" << (*f_iter)->get_name() << "', " - << messageType << ", self._seqid)" << endl; + << messageType << ", self._seqid)" << '\n'; } else { f_service_ << indent() << "self._oprot.writeMessageBegin('" << (*f_iter)->get_name() << "', " - << messageType << ", self._seqid)" << endl; + << messageType << ", self._seqid)" << '\n'; } - f_service_ << indent() << "args = " << argsname << "()" << endl; + f_service_ << indent() << "args = " << argsname << "()" << '\n'; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { f_service_ << indent() << "args." << (*fld_iter)->get_name() << " = " - << (*fld_iter)->get_name() << endl; + << (*fld_iter)->get_name() << '\n'; } // Write to the stream if (gen_twisted_ || gen_tornado_) { - f_service_ << indent() << "args.write(oprot)" << endl << indent() << "oprot.writeMessageEnd()" - << endl << indent() << "oprot.trans.flush()" << endl; + f_service_ << indent() << "args.write(oprot)" << '\n' << indent() << "oprot.writeMessageEnd()" + << '\n' << indent() << "oprot.trans.flush()" << '\n'; } else { - f_service_ << indent() << "args.write(self._oprot)" << endl << indent() - << "self._oprot.writeMessageEnd()" << endl << indent() - << "self._oprot.trans.flush()" << endl; + f_service_ << indent() << "args.write(self._oprot)" << '\n' << indent() + << "self._oprot.writeMessageEnd()" << '\n' << indent() + << "self._oprot.trans.flush()" << '\n'; } indent_down(); @@ -1600,51 +1598,51 @@ void t_py_generator::generate_service_client(t_service* tservice) { if (!(*f_iter)->is_oneway()) { std::string resultname = (*f_iter)->get_name() + "_result"; // Open function - f_service_ << endl; + f_service_ << '\n'; if (gen_twisted_ || gen_tornado_) { f_service_ << indent() << "def recv_" << (*f_iter)->get_name() - << "(self, iprot, mtype, rseqid):" << endl; + << "(self, iprot, mtype, rseqid):" << '\n'; } else { t_struct noargs(program_); t_function recv_function((*f_iter)->get_returntype(), string("recv_") + (*f_iter)->get_name(), &noargs); - f_service_ << indent() << "def " << function_signature(&recv_function) << ":" << endl; + f_service_ << indent() << "def " << function_signature(&recv_function) << ":" << '\n'; } indent_up(); // TODO(mcslee): Validate message reply here, seq ids etc. if (gen_twisted_) { - f_service_ << indent() << "d = self._reqs.pop(rseqid)" << endl; + f_service_ << indent() << "d = self._reqs.pop(rseqid)" << '\n'; } else if (gen_tornado_) { } else { - f_service_ << indent() << "iprot = self._iprot" << endl << indent() - << "(fname, mtype, rseqid) = iprot.readMessageBegin()" << endl; + f_service_ << indent() << "iprot = self._iprot" << '\n' << indent() + << "(fname, mtype, rseqid) = iprot.readMessageBegin()" << '\n'; } - f_service_ << indent() << "if mtype == TMessageType.EXCEPTION:" << endl - << indent() << indent_str() << "x = TApplicationException()" << endl; + f_service_ << indent() << "if mtype == TMessageType.EXCEPTION:" << '\n' + << indent() << indent_str() << "x = TApplicationException()" << '\n'; if (gen_twisted_) { - f_service_ << indent() << indent_str() << "x.read(iprot)" << endl << indent() - << indent_str() << "iprot.readMessageEnd()" << endl << indent() << indent_str() << "return d.errback(x)" - << endl << indent() << "result = " << resultname << "()" << endl << indent() - << "result.read(iprot)" << endl << indent() << "iprot.readMessageEnd()" << endl; + f_service_ << indent() << indent_str() << "x.read(iprot)" << '\n' << indent() + << indent_str() << "iprot.readMessageEnd()" << '\n' << indent() << indent_str() << "return d.errback(x)" + << '\n' << indent() << "result = " << resultname << "()" << '\n' << indent() + << "result.read(iprot)" << '\n' << indent() << "iprot.readMessageEnd()" << '\n'; } else { - f_service_ << indent() << indent_str() << "x.read(iprot)" << endl << indent() - << indent_str() << "iprot.readMessageEnd()" << endl << indent() << indent_str() << "raise x" << endl - << indent() << "result = " << resultname << "()" << endl << indent() - << "result.read(iprot)" << endl << indent() << "iprot.readMessageEnd()" << endl; + f_service_ << indent() << indent_str() << "x.read(iprot)" << '\n' << indent() + << indent_str() << "iprot.readMessageEnd()" << '\n' << indent() << indent_str() << "raise x" << '\n' + << indent() << "result = " << resultname << "()" << '\n' << indent() + << "result.read(iprot)" << '\n' << indent() << "iprot.readMessageEnd()" << '\n'; } // Careful, only return _result if not a void function if (!(*f_iter)->get_returntype()->is_void()) { - f_service_ << indent() << "if result.success is not None:" << endl; + f_service_ << indent() << "if result.success is not None:" << '\n'; if (gen_twisted_) { - f_service_ << indent() << indent_str() << "return d.callback(result.success)" << endl; + f_service_ << indent() << indent_str() << "return d.callback(result.success)" << '\n'; } else { - f_service_ << indent() << indent_str() << "return result.success" << endl; + f_service_ << indent() << indent_str() << "return result.success" << '\n'; } } @@ -1653,32 +1651,32 @@ void t_py_generator::generate_service_client(t_service* tservice) { vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { const string& xname = (*x_iter)->get_name(); - f_service_ << indent() << "if result." << xname << " is not None:" << endl; + f_service_ << indent() << "if result." << xname << " is not None:" << '\n'; if (gen_twisted_) { f_service_ << indent() << indent_str() << "return d.errback(result." << xname << ")" - << endl; + << '\n'; } else { - f_service_ << indent() << indent_str() << "raise result." << xname << "" << endl; + f_service_ << indent() << indent_str() << "raise result." << xname << "" << '\n'; } } // Careful, only return _result if not a void function if ((*f_iter)->get_returntype()->is_void()) { if (gen_twisted_) { - f_service_ << indent() << "return d.callback(None)" << endl; + f_service_ << indent() << "return d.callback(None)" << '\n'; } else { - f_service_ << indent() << "return" << endl; + f_service_ << indent() << "return" << '\n'; } } else { if (gen_twisted_) { f_service_ << indent() << "return d.errback(TApplicationException(TApplicationException.MISSING_RESULT, \"" - << (*f_iter)->get_name() << " failed: unknown result\"))" << endl; + << (*f_iter)->get_name() << " failed: unknown result\"))" << '\n'; } else { f_service_ << indent() << "raise TApplicationException(TApplicationException.MISSING_RESULT, \"" - << (*f_iter)->get_name() << " failed: unknown result\")" << endl; + << (*f_iter)->get_name() << " failed: unknown result\")" << '\n'; } } @@ -1711,29 +1709,27 @@ void t_py_generator::generate_service_remote(t_service* tservice) { f_remote.open(f_remote_name.c_str()); f_remote << - "#!/usr/bin/env python" << endl << - py_autogen_comment() << endl << - "import sys" << endl << - "import pprint" << endl << - "if sys.version_info[0] > 2:" << endl << - indent_str() << "from urllib.parse import urlparse" << endl << - "else:" << endl << - indent_str() << "from urlparse import urlparse" << endl << - "from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient" << endl << - "from thrift.protocol.TBinaryProtocol import TBinaryProtocol" << endl << - endl; + "#!/usr/bin/env python" << '\n' << + py_autogen_comment() << '\n' << + "import sys" << '\n' << + "import pprint" << '\n' << + "if sys.version_info[0] > 2:" << '\n' << + indent_str() << "from urllib.parse import urlparse" << '\n' << + "else:" << '\n' << + indent_str() << "from urlparse import urlparse" << '\n' << + "from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient" << '\n' << + "from thrift.protocol.TBinaryProtocol import TBinaryProtocol" << '\n' << '\n'; f_remote << - "from " << module_ << " import " << service_name_ << endl << - "from " << module_ << ".ttypes import *" << endl << - endl; + "from " << module_ << " import " << service_name_ << '\n' << + "from " << module_ << ".ttypes import *" << '\n' << '\n'; f_remote << - "if len(sys.argv) <= 1 or sys.argv[1] == '--help':" << endl << - indent_str() << "print('')" << endl << - indent_str() << "print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')" << endl << - indent_str() << "print('')" << endl << - indent_str() << "print('Functions:')" << endl; + "if len(sys.argv) <= 1 or sys.argv[1] == '--help':" << '\n' << + indent_str() << "print('')" << '\n' << + indent_str() << "print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')" << '\n' << + indent_str() << "print('')" << '\n' << + indent_str() << "print('Functions:')" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { f_remote << indent_str() << "print(' " << (*f_iter)->get_returntype()->get_name() << " " << (*f_iter)->get_name() << "("; @@ -1749,88 +1745,88 @@ void t_py_generator::generate_service_remote(t_service* tservice) { } f_remote << args[i]->get_type()->get_name() << " " << args[i]->get_name(); } - f_remote << ")')" << endl; - } - f_remote << indent_str() << "print('')" << endl << indent_str() << "sys.exit(0)" << endl << endl; - - f_remote << "pp = pprint.PrettyPrinter(indent=2)" << endl - << "host = 'localhost'" << endl - << "port = 9090" << endl - << "uri = ''" << endl - << "framed = False" << endl - << "ssl = False" << endl - << "validate = True" << endl - << "ca_certs = None" << endl - << "keyfile = None" << endl - << "certfile = None" << endl - << "http = False" << endl - << "argi = 1" << endl - << endl - << "if sys.argv[argi] == '-h':" << endl - << indent_str() << "parts = sys.argv[argi + 1].split(':')" << endl - << indent_str() << "host = parts[0]" << endl - << indent_str() << "if len(parts) > 1:" << endl - << indent_str() << indent_str() << "port = int(parts[1])" << endl - << indent_str() << "argi += 2" << endl - << endl - << "if sys.argv[argi] == '-u':" << endl - << indent_str() << "url = urlparse(sys.argv[argi + 1])" << endl - << indent_str() << "parts = url[1].split(':')" << endl - << indent_str() << "host = parts[0]" << endl - << indent_str() << "if len(parts) > 1:" << endl - << indent_str() << indent_str() << "port = int(parts[1])" << endl - << indent_str() << "else:" << endl - << indent_str() << indent_str() << "port = 80" << endl - << indent_str() << "uri = url[2]" << endl - << indent_str() << "if url[4]:" << endl - << indent_str() << indent_str() << "uri += '?%s' % url[4]" << endl - << indent_str() << "http = True" << endl - << indent_str() << "argi += 2" << endl - << endl - << "if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':" << endl - << indent_str() << "framed = True" << endl - << indent_str() << "argi += 1" << endl - << endl - << "if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':" << endl - << indent_str() << "ssl = True" << endl - << indent_str() << "argi += 1" << endl - << endl - << "if sys.argv[argi] == '-novalidate':" << endl - << indent_str() << "validate = False" << endl - << indent_str() << "argi += 1" << endl - << endl - << "if sys.argv[argi] == '-ca_certs':" << endl - << indent_str() << "ca_certs = sys.argv[argi+1]" << endl - << indent_str() << "argi += 2" << endl - << endl - << "if sys.argv[argi] == '-keyfile':" << endl - << indent_str() << "keyfile = sys.argv[argi+1]" << endl - << indent_str() << "argi += 2" << endl - << endl - << "if sys.argv[argi] == '-certfile':" << endl - << indent_str() << "certfile = sys.argv[argi+1]" << endl - << indent_str() << "argi += 2" << endl - << endl - << "cmd = sys.argv[argi]" << endl - << "args = sys.argv[argi + 1:]" << endl - << endl - << "if http:" << endl - << indent_str() << "transport = THttpClient.THttpClient(host, port, uri)" << endl - << "else:" << endl - << indent_str() << "if ssl:" << endl + f_remote << ")')" << '\n'; + } + f_remote << indent_str() << "print('')" << '\n' << indent_str() << "sys.exit(0)" << '\n' << '\n'; + + f_remote << "pp = pprint.PrettyPrinter(indent=2)" << '\n' + << "host = 'localhost'" << '\n' + << "port = 9090" << '\n' + << "uri = ''" << '\n' + << "framed = False" << '\n' + << "ssl = False" << '\n' + << "validate = True" << '\n' + << "ca_certs = None" << '\n' + << "keyfile = None" << '\n' + << "certfile = None" << '\n' + << "http = False" << '\n' + << "argi = 1" << '\n' + << '\n' + << "if sys.argv[argi] == '-h':" << '\n' + << indent_str() << "parts = sys.argv[argi + 1].split(':')" << '\n' + << indent_str() << "host = parts[0]" << '\n' + << indent_str() << "if len(parts) > 1:" << '\n' + << indent_str() << indent_str() << "port = int(parts[1])" << '\n' + << indent_str() << "argi += 2" << '\n' + << '\n' + << "if sys.argv[argi] == '-u':" << '\n' + << indent_str() << "url = urlparse(sys.argv[argi + 1])" << '\n' + << indent_str() << "parts = url[1].split(':')" << '\n' + << indent_str() << "host = parts[0]" << '\n' + << indent_str() << "if len(parts) > 1:" << '\n' + << indent_str() << indent_str() << "port = int(parts[1])" << '\n' + << indent_str() << "else:" << '\n' + << indent_str() << indent_str() << "port = 80" << '\n' + << indent_str() << "uri = url[2]" << '\n' + << indent_str() << "if url[4]:" << '\n' + << indent_str() << indent_str() << "uri += '?%s' % url[4]" << '\n' + << indent_str() << "http = True" << '\n' + << indent_str() << "argi += 2" << '\n' + << '\n' + << "if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':" << '\n' + << indent_str() << "framed = True" << '\n' + << indent_str() << "argi += 1" << '\n' + << '\n' + << "if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':" << '\n' + << indent_str() << "ssl = True" << '\n' + << indent_str() << "argi += 1" << '\n' + << '\n' + << "if sys.argv[argi] == '-novalidate':" << '\n' + << indent_str() << "validate = False" << '\n' + << indent_str() << "argi += 1" << '\n' + << '\n' + << "if sys.argv[argi] == '-ca_certs':" << '\n' + << indent_str() << "ca_certs = sys.argv[argi+1]" << '\n' + << indent_str() << "argi += 2" << '\n' + << '\n' + << "if sys.argv[argi] == '-keyfile':" << '\n' + << indent_str() << "keyfile = sys.argv[argi+1]" << '\n' + << indent_str() << "argi += 2" << '\n' + << '\n' + << "if sys.argv[argi] == '-certfile':" << '\n' + << indent_str() << "certfile = sys.argv[argi+1]" << '\n' + << indent_str() << "argi += 2" << '\n' + << '\n' + << "cmd = sys.argv[argi]" << '\n' + << "args = sys.argv[argi + 1:]" << '\n' + << '\n' + << "if http:" << '\n' + << indent_str() << "transport = THttpClient.THttpClient(host, port, uri)" << '\n' + << "else:" << '\n' + << indent_str() << "if ssl:" << '\n' << indent_str() << indent_str() << "socket = TSSLSocket.TSSLSocket(host, port, " "validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile)" - << endl - << indent_str() << "else:" << endl - << indent_str() << indent_str() << "socket = TSocket.TSocket(host, port)" << endl - << indent_str() << "if framed:" << endl - << indent_str() << indent_str() << "transport = TTransport.TFramedTransport(socket)" << endl - << indent_str() << "else:" << endl - << indent_str() << indent_str() << "transport = TTransport.TBufferedTransport(socket)" << endl - << "protocol = TBinaryProtocol(transport)" << endl - << "client = " << service_name_ << ".Client(protocol)" << endl - << "transport.open()" << endl - << endl; + << '\n' + << indent_str() << "else:" << '\n' + << indent_str() << indent_str() << "socket = TSocket.TSocket(host, port)" << '\n' + << indent_str() << "if framed:" << '\n' + << indent_str() << indent_str() << "transport = TTransport.TFramedTransport(socket)" << '\n' + << indent_str() << "else:" << '\n' + << indent_str() << indent_str() << "transport = TTransport.TBufferedTransport(socket)" << '\n' + << "protocol = TBinaryProtocol(transport)" << '\n' + << "client = " << service_name_ << ".Client(protocol)" << '\n' + << "transport.open()" << '\n' + << '\n'; // Generate the dispatch methods bool first = true; @@ -1846,12 +1842,12 @@ void t_py_generator::generate_service_remote(t_service* tservice) { const std::vector& args = arg_struct->get_members(); std::vector::size_type num_args = args.size(); - f_remote << "if cmd == '" << (*f_iter)->get_name() << "':" << endl; + f_remote << "if cmd == '" << (*f_iter)->get_name() << "':" << '\n'; indent_up(); - f_remote << indent() << "if len(args) != " << num_args << ":" << endl + f_remote << indent() << "if len(args) != " << num_args << ":" << '\n' << indent() << indent_str() << "print('" << (*f_iter)->get_name() << " requires " << num_args - << " args')" << endl - << indent() << indent_str() << "sys.exit(1)" << endl + << " args')" << '\n' + << indent() << indent_str() << "sys.exit(1)" << '\n' << indent() << "pp.pprint(client." << (*f_iter)->get_name() << "("; indent_down(); bool first_arg = true; @@ -1866,19 +1862,19 @@ void t_py_generator::generate_service_remote(t_service* tservice) { f_remote << "eval(args[" << i << "]),"; } } - f_remote << "))" << endl; + f_remote << "))" << '\n'; - f_remote << endl; + f_remote << '\n'; } if (functions.size() > 0) { - f_remote << "else:" << endl; - f_remote << indent_str() << "print('Unrecognized method %s' % cmd)" << endl; - f_remote << indent_str() << "sys.exit(1)" << endl; - f_remote << endl; + f_remote << "else:" << '\n'; + f_remote << indent_str() << "print('Unrecognized method %s' % cmd)" << '\n'; + f_remote << indent_str() << "sys.exit(1)" << '\n'; + f_remote << '\n'; } - f_remote << "transport.close()" << endl; + f_remote << "transport.close()" << '\n'; // Close service file f_remote.close(); @@ -1913,100 +1909,100 @@ void t_py_generator::generate_service_server(t_service* tservice) { extends_processor = extends + ".Processor, "; } - f_service_ << endl << endl; + f_service_ << '\n' << '\n'; // Generate the header portion if (gen_zope_interface_) { - f_service_ << "@implementer(Iface)" << endl - << "class Processor(" << extends_processor << "TProcessor):" << endl; + f_service_ << "@implementer(Iface)" << '\n' + << "class Processor(" << extends_processor << "TProcessor):" << '\n'; } else { - f_service_ << "class Processor(" << extends_processor << "Iface, TProcessor):" << endl; + f_service_ << "class Processor(" << extends_processor << "Iface, TProcessor):" << '\n'; } indent_up(); - indent(f_service_) << "def __init__(self, handler):" << endl; + indent(f_service_) << "def __init__(self, handler):" << '\n'; indent_up(); if (extends.empty()) { if (gen_zope_interface_) { - f_service_ << indent() << "self._handler = Iface(handler)" << endl; + f_service_ << indent() << "self._handler = Iface(handler)" << '\n'; } else { - f_service_ << indent() << "self._handler = handler" << endl; + f_service_ << indent() << "self._handler = handler" << '\n'; } - f_service_ << indent() << "self._processMap = {}" << endl; + f_service_ << indent() << "self._processMap = {}" << '\n'; } else { if (gen_zope_interface_) { - f_service_ << indent() << extends << ".Processor.__init__(self, Iface(handler))" << endl; + f_service_ << indent() << extends << ".Processor.__init__(self, Iface(handler))" << '\n'; } else { - f_service_ << indent() << extends << ".Processor.__init__(self, handler)" << endl; + f_service_ << indent() << extends << ".Processor.__init__(self, handler)" << '\n'; } } for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { f_service_ << indent() << "self._processMap[\"" << (*f_iter)->get_name() - << "\"] = Processor.process_" << (*f_iter)->get_name() << endl; + << "\"] = Processor.process_" << (*f_iter)->get_name() << '\n'; } - f_service_ << indent() << "self._on_message_begin = None" << endl; + f_service_ << indent() << "self._on_message_begin = None" << '\n'; indent_down(); - f_service_ << endl; + f_service_ << '\n'; - f_service_ << indent() << "def on_message_begin(self, func):" << endl; + f_service_ << indent() << "def on_message_begin(self, func):" << '\n'; indent_up(); - f_service_ << indent() << "self._on_message_begin = func" << endl; + f_service_ << indent() << "self._on_message_begin = func" << '\n'; indent_down(); - f_service_ << endl; + f_service_ << '\n'; // Generate the server implementation - f_service_ << indent() << "def process(self, iprot, oprot):" << endl; + f_service_ << indent() << "def process(self, iprot, oprot):" << '\n'; indent_up(); - f_service_ << indent() << "(name, type, seqid) = iprot.readMessageBegin()" << endl; - f_service_ << indent() << "if self._on_message_begin:" << endl; + f_service_ << indent() << "(name, type, seqid) = iprot.readMessageBegin()" << '\n'; + f_service_ << indent() << "if self._on_message_begin:" << '\n'; indent_up(); - f_service_ << indent() << "self._on_message_begin(name, type, seqid)" << endl; + f_service_ << indent() << "self._on_message_begin(name, type, seqid)" << '\n'; indent_down(); // TODO(mcslee): validate message // HOT: dictionary function lookup - f_service_ << indent() << "if name not in self._processMap:" << endl; + f_service_ << indent() << "if name not in self._processMap:" << '\n'; indent_up(); - f_service_ << indent() << "iprot.skip(TType.STRUCT)" << endl - << indent() << "iprot.readMessageEnd()" << endl + f_service_ << indent() << "iprot.skip(TType.STRUCT)" << '\n' + << indent() << "iprot.readMessageEnd()" << '\n' << indent() << "x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown " "function %s' % (name))" - << endl - << indent() << "oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)" << endl - << indent() << "x.write(oprot)" << endl - << indent() << "oprot.writeMessageEnd()" << endl - << indent() << "oprot.trans.flush()" << endl; + << '\n' + << indent() << "oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)" << '\n' + << indent() << "x.write(oprot)" << '\n' + << indent() << "oprot.writeMessageEnd()" << '\n' + << indent() << "oprot.trans.flush()" << '\n'; if (gen_twisted_) { - f_service_ << indent() << "return defer.succeed(None)" << endl; + f_service_ << indent() << "return defer.succeed(None)" << '\n'; } else { - f_service_ << indent() << "return" << endl; + f_service_ << indent() << "return" << '\n'; } indent_down(); - f_service_ << indent() << "else:" << endl; + f_service_ << indent() << "else:" << '\n'; if (gen_twisted_ || gen_tornado_) { f_service_ << indent() << indent_str() - << "return self._processMap[name](self, seqid, iprot, oprot)" << endl; + << "return self._processMap[name](self, seqid, iprot, oprot)" << '\n'; } else { f_service_ << indent() << indent_str() << "self._processMap[name](self, seqid, iprot, oprot)" - << endl; + << '\n'; // Read end of args field, the T_STOP, and the struct close - f_service_ << indent() << "return True" << endl; + f_service_ << indent() << "return True" << '\n'; } indent_down(); // Generate the process subfunctions for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { - f_service_ << endl; + f_service_ << '\n'; generate_process_function(tservice, *f_iter); } @@ -2022,11 +2018,11 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* (void)tservice; // Open function if (gen_tornado_) { - f_service_ << indent() << "@gen.coroutine" << endl << indent() << "def process_" - << tfunction->get_name() << "(self, seqid, iprot, oprot):" << endl; + f_service_ << indent() << "@gen.coroutine" << '\n' << indent() << "def process_" + << tfunction->get_name() << "(self, seqid, iprot, oprot):" << '\n'; } else { f_service_ << indent() << "def process_" << tfunction->get_name() - << "(self, seqid, iprot, oprot):" << endl; + << "(self, seqid, iprot, oprot):" << '\n'; } indent_up(); @@ -2034,8 +2030,8 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* string argsname = tfunction->get_name() + "_args"; string resultname = tfunction->get_name() + "_result"; - f_service_ << indent() << "args = " << argsname << "()" << endl << indent() << "args.read(iprot)" - << endl << indent() << "iprot.readMessageEnd()" << endl; + f_service_ << indent() << "args = " << argsname << "()" << '\n' << indent() << "args.read(iprot)" + << '\n' << indent() << "iprot.readMessageEnd()" << '\n'; t_struct* xs = tfunction->get_xceptions(); const std::vector& xceptions = xs->get_members(); @@ -2043,7 +2039,7 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* // Declare result for non oneway function if (!tfunction->is_oneway()) { - f_service_ << indent() << "result = " << resultname << "()" << endl; + f_service_ << indent() << "result = " << resultname << "()" << '\n'; } if (gen_twisted_) { @@ -2063,85 +2059,85 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* } f_service_ << "args." << (*f_iter)->get_name(); } - f_service_ << ")" << endl; + f_service_ << ")" << '\n'; if (tfunction->is_oneway()) { f_service_ << indent() << "d.addErrback(self.handle_exception_" << tfunction->get_name() - << ", seqid)" << endl; + << ", seqid)" << '\n'; } else { f_service_ << indent() << "d.addCallback(self.write_results_success_" << tfunction->get_name() - << ", result, seqid, oprot)" << endl + << ", result, seqid, oprot)" << '\n' << indent() << "d.addErrback(self.write_results_exception_" - << tfunction->get_name() << ", result, seqid, oprot)" << endl; + << tfunction->get_name() << ", result, seqid, oprot)" << '\n'; } - f_service_ << indent() << "return d" << endl << endl; + f_service_ << indent() << "return d" << '\n' << '\n'; indent_down(); if (tfunction->is_oneway()) { indent(f_service_) << "def handle_exception_" << tfunction->get_name() - << "(self, error, seqid):" << endl; + << "(self, error, seqid):" << '\n'; } else { indent(f_service_) << "def write_results_success_" << tfunction->get_name() - << "(self, success, result, seqid, oprot):" << endl; + << "(self, success, result, seqid, oprot):" << '\n'; indent_up(); if (!tfunction->get_returntype()->is_void()) { - f_service_ << indent() << "result.success = success" << endl; + f_service_ << indent() << "result.success = success" << '\n'; } f_service_ << indent() << "oprot.writeMessageBegin(\"" << tfunction->get_name() - << "\", TMessageType.REPLY, seqid)" << endl - << indent() << "result.write(oprot)" << endl - << indent() << "oprot.writeMessageEnd()" << endl - << indent() << "oprot.trans.flush()" << endl - << endl; + << "\", TMessageType.REPLY, seqid)" << '\n' + << indent() << "result.write(oprot)" << '\n' + << indent() << "oprot.writeMessageEnd()" << '\n' + << indent() << "oprot.trans.flush()" << '\n' + << '\n'; indent_down(); indent(f_service_) << "def write_results_exception_" << tfunction->get_name() - << "(self, error, result, seqid, oprot):" << endl; + << "(self, error, result, seqid, oprot):" << '\n'; } indent_up(); if (!tfunction->is_oneway()) { - f_service_ << indent() << "msg_type = TMessageType.REPLY" << endl; + f_service_ << indent() << "msg_type = TMessageType.REPLY" << '\n'; } - f_service_ << indent() << "try:" << endl; + f_service_ << indent() << "try:" << '\n'; // Kinda absurd - f_service_ << indent() << indent_str() << "error.raiseException()" << endl; + f_service_ << indent() << indent_str() << "error.raiseException()" << '\n'; if (!tfunction->is_oneway()) { for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { const string& xname = (*x_iter)->get_name(); f_service_ << indent() << "except " << type_name((*x_iter)->get_type()) << " as " << xname - << ":" << endl; + << ":" << '\n'; indent_up(); - f_service_ << indent() << "result." << xname << " = " << xname << endl; + f_service_ << indent() << "result." << xname << " = " << xname << '\n'; indent_down(); } } - f_service_ << indent() << "except TTransport.TTransportException:" << endl - << indent() << indent_str() << "raise" << endl; + f_service_ << indent() << "except TTransport.TTransportException:" << '\n' + << indent() << indent_str() << "raise" << '\n'; if (!tfunction->is_oneway()) { - f_service_ << indent() << "except TApplicationException as ex:" << endl + f_service_ << indent() << "except TApplicationException as ex:" << '\n' << indent() << indent_str() - << "logging.exception('TApplication exception in handler')" << endl - << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl - << indent() << indent_str() << "result = ex" << endl - << indent() << "except Exception:" << endl + << "logging.exception('TApplication exception in handler')" << '\n' + << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << '\n' + << indent() << indent_str() << "result = ex" << '\n' + << indent() << "except Exception:" << '\n' << indent() << indent_str() - << "logging.exception('Unexpected exception in handler')" << endl - << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl + << "logging.exception('Unexpected exception in handler')" << '\n' + << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << '\n' << indent() << indent_str() << "result = TApplicationException(TApplicationException.INTERNAL_ERROR, " "'Internal error')" - << endl + << '\n' << indent() << "oprot.writeMessageBegin(\"" << tfunction->get_name() - << "\", msg_type, seqid)" << endl - << indent() << "result.write(oprot)" << endl - << indent() << "oprot.writeMessageEnd()" << endl - << indent() << "oprot.trans.flush()" << endl; + << "\", msg_type, seqid)" << '\n' + << indent() << "result.write(oprot)" << '\n' + << indent() << "oprot.writeMessageEnd()" << '\n' + << indent() << "oprot.trans.flush()" << '\n'; } else { - f_service_ << indent() << "except Exception:" << endl + f_service_ << indent() << "except Exception:" << '\n' << indent() << indent_str() - << "logging.exception('Exception in oneway handler')" << endl; + << "logging.exception('Exception in oneway handler')" << '\n'; } indent_down(); @@ -2152,9 +2148,9 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* vector::const_iterator f_iter; if (!tfunction->is_oneway()) { - indent(f_service_) << "msg_type = TMessageType.REPLY" << endl; + indent(f_service_) << "msg_type = TMessageType.REPLY" << '\n'; } - f_service_ << indent() << "try:" << endl; + f_service_ << indent() << "try:" << '\n'; indent_up(); f_service_ << indent(); if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()) { @@ -2170,45 +2166,45 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* } f_service_ << "args." << (*f_iter)->get_name(); } - f_service_ << "))" << endl; + f_service_ << "))" << '\n'; indent_down(); if (!tfunction->is_oneway()) { for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { const string& xname = (*x_iter)->get_name(); f_service_ << indent() << "except " << type_name((*x_iter)->get_type()) << " as " << xname - << ":" << endl - << indent() << indent_str() << "result." << xname << " = " << xname << endl; + << ":" << '\n' + << indent() << indent_str() << "result." << xname << " = " << xname << '\n'; } } - f_service_ << indent() << "except TTransport.TTransportException:" << endl - << indent() << indent_str() << "raise" << endl; + f_service_ << indent() << "except TTransport.TTransportException:" << '\n' + << indent() << indent_str() << "raise" << '\n'; if (!tfunction->is_oneway()) { - f_service_ << indent() << "except TApplicationException as ex:" << endl + f_service_ << indent() << "except TApplicationException as ex:" << '\n' << indent() << indent_str() - << "logging.exception('TApplication exception in handler')" << endl - << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl - << indent() << indent_str() << "result = ex" << endl - << indent() << "except Exception:" << endl + << "logging.exception('TApplication exception in handler')" << '\n' + << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << '\n' + << indent() << indent_str() << "result = ex" << '\n' + << indent() << "except Exception:" << '\n' << indent() << indent_str() - << "logging.exception('Unexpected exception in handler')" << endl - << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl + << "logging.exception('Unexpected exception in handler')" << '\n' + << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << '\n' << indent() << indent_str() << "result = TApplicationException(TApplicationException.INTERNAL_ERROR, " "'Internal error')" - << endl; + << '\n'; } else { - f_service_ << indent() << "except Exception:" << endl + f_service_ << indent() << "except Exception:" << '\n' << indent() << indent_str() - << "logging.exception('Exception in oneway handler')" << endl; + << "logging.exception('Exception in oneway handler')" << '\n'; } if (!tfunction->is_oneway()) { f_service_ << indent() << "oprot.writeMessageBegin(\"" << tfunction->get_name() - << "\", msg_type, seqid)" << endl - << indent() << "result.write(oprot)" << endl - << indent() << "oprot.writeMessageEnd()" << endl - << indent() << "oprot.trans.flush()" << endl; + << "\", msg_type, seqid)" << '\n' + << indent() << "result.write(oprot)" << '\n' + << indent() << "oprot.writeMessageEnd()" << '\n' + << indent() << "oprot.trans.flush()" << '\n'; } // Close function @@ -2217,7 +2213,7 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* } else { // py // Try block for a function with exceptions // It also catches arbitrary exceptions raised by handler method to propagate them to the client - f_service_ << indent() << "try:" << endl; + f_service_ << indent() << "try:" << '\n'; indent_up(); // Generate the function call @@ -2239,48 +2235,48 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* } f_service_ << "args." << (*f_iter)->get_name(); } - f_service_ << ")" << endl; + f_service_ << ")" << '\n'; if (!tfunction->is_oneway()) { - f_service_ << indent() << "msg_type = TMessageType.REPLY" << endl; + f_service_ << indent() << "msg_type = TMessageType.REPLY" << '\n'; } indent_down(); f_service_ << indent() - << "except TTransport.TTransportException:" << endl - << indent() << indent_str() << "raise" << endl; + << "except TTransport.TTransportException:" << '\n' + << indent() << indent_str() << "raise" << '\n'; if (!tfunction->is_oneway()) { for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { const string& xname = (*x_iter)->get_name(); f_service_ << indent() << "except " << type_name((*x_iter)->get_type()) << " as " << xname - << ":" << endl; + << ":" << '\n'; indent_up(); - f_service_ << indent() << "msg_type = TMessageType.REPLY" << endl; - f_service_ << indent() << "result." << xname << " = " << xname << endl; + f_service_ << indent() << "msg_type = TMessageType.REPLY" << '\n'; + f_service_ << indent() << "result." << xname << " = " << xname << '\n'; indent_down(); } - f_service_ << indent() << "except TApplicationException as ex:" << endl + f_service_ << indent() << "except TApplicationException as ex:" << '\n' << indent() << indent_str() - << "logging.exception('TApplication exception in handler')" << endl - << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl - << indent() << indent_str() << "result = ex" << endl - << indent() << "except Exception:" << endl + << "logging.exception('TApplication exception in handler')" << '\n' + << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << '\n' + << indent() << indent_str() << "result = ex" << '\n' + << indent() << "except Exception:" << '\n' << indent() << indent_str() - << "logging.exception('Unexpected exception in handler')" << endl - << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl + << "logging.exception('Unexpected exception in handler')" << '\n' + << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << '\n' << indent() << indent_str() << "result = TApplicationException(TApplicationException.INTERNAL_ERROR, " "'Internal error')" - << endl + << '\n' << indent() << "oprot.writeMessageBegin(\"" << tfunction->get_name() - << "\", msg_type, seqid)" << endl - << indent() << "result.write(oprot)" << endl - << indent() << "oprot.writeMessageEnd()" << endl - << indent() << "oprot.trans.flush()" << endl; + << "\", msg_type, seqid)" << '\n' + << indent() << "result.write(oprot)" << '\n' + << indent() << "oprot.writeMessageEnd()" << '\n' + << indent() << "oprot.trans.flush()" << '\n'; } else { - f_service_ << indent() << "except Exception:" << endl - << indent() << indent_str() << "logging.exception('Exception in oneway handler')" << endl; + f_service_ << indent() << "except Exception:" << '\n' + << indent() << indent_str() << "logging.exception('Exception in oneway handler')" << '\n'; } // Close function @@ -2345,14 +2341,14 @@ void t_py_generator::generate_deserialize_field(ostream& out, throw "compiler error: no Python name for base type " + t_base_type::t_base_name(tbase); } } - out << endl; + out << '\n'; } else if (type->is_enum()) { if (gen_enum_) { indent(out) << name << " = " << type_name(type) << "(iprot.readI32())"; } else { indent(out) << name << " = iprot.readI32()"; } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", tfield->get_name().c_str(), @@ -2365,10 +2361,10 @@ void t_py_generator::generate_deserialize_field(ostream& out, */ void t_py_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) { if (is_immutable(tstruct)) { - out << indent() << prefix << " = " << type_name(tstruct) << ".read(iprot)" << endl; + out << indent() << prefix << " = " << type_name(tstruct) << ".read(iprot)" << '\n'; } else { - out << indent() << prefix << " = " << type_name(tstruct) << "()" << endl - << indent() << prefix << ".read(iprot)" << endl; + out << indent() << prefix << " = " << type_name(tstruct) << "()" << '\n' + << indent() << prefix << ".read(iprot)" << '\n'; } } @@ -2389,20 +2385,20 @@ void t_py_generator::generate_deserialize_container(ostream& out, t_type* ttype, // Declare variables, read header if (ttype->is_map()) { - out << indent() << prefix << " = {}" << endl << indent() << "(" << ktype << ", " << vtype - << ", " << size << ") = iprot.readMapBegin()" << endl; + out << indent() << prefix << " = {}" << '\n' << indent() << "(" << ktype << ", " << vtype + << ", " << size << ") = iprot.readMapBegin()" << '\n'; } else if (ttype->is_set()) { - out << indent() << prefix << " = set()" << endl << indent() << "(" << etype << ", " << size - << ") = iprot.readSetBegin()" << endl; + out << indent() << prefix << " = set()" << '\n' << indent() << "(" << etype << ", " << size + << ") = iprot.readSetBegin()" << '\n'; } else if (ttype->is_list()) { - out << indent() << prefix << " = []" << endl << indent() << "(" << etype << ", " << size - << ") = iprot.readListBegin()" << endl; + out << indent() << prefix << " = []" << '\n' << indent() << "(" << etype << ", " << size + << ") = iprot.readListBegin()" << '\n'; } // For loop iterates over elements string i = tmp("_i"); indent(out) << - "for " << i << " in range(" << size << "):" << endl; + "for " << i << " in range(" << size << "):" << '\n'; indent_up(); @@ -2418,20 +2414,20 @@ void t_py_generator::generate_deserialize_container(ostream& out, t_type* ttype, // Read container end if (ttype->is_map()) { - indent(out) << "iprot.readMapEnd()" << endl; + indent(out) << "iprot.readMapEnd()" << '\n'; if (is_immutable(ttype)) { - indent(out) << prefix << " = TFrozenDict(" << prefix << ")" << endl; + indent(out) << prefix << " = TFrozenDict(" << prefix << ")" << '\n'; } } else if (ttype->is_set()) { - indent(out) << "iprot.readSetEnd()" << endl; + indent(out) << "iprot.readSetEnd()" << '\n'; if (is_immutable(ttype)) { - indent(out) << prefix << " = frozenset(" << prefix << ")" << endl; + indent(out) << prefix << " = frozenset(" << prefix << ")" << '\n'; } } else if (ttype->is_list()) { if (is_immutable(ttype)) { - indent(out) << prefix << " = tuple(" << prefix << ")" << endl; + indent(out) << prefix << " = tuple(" << prefix << ")" << '\n'; } - indent(out) << "iprot.readListEnd()" << endl; + indent(out) << "iprot.readListEnd()" << '\n'; } } @@ -2447,7 +2443,7 @@ void t_py_generator::generate_deserialize_map_element(ostream& out, t_map* tmap, generate_deserialize_field(out, &fkey); generate_deserialize_field(out, &fval); - indent(out) << prefix << "[" << key << "] = " << val << endl; + indent(out) << prefix << "[" << key << "] = " << val << '\n'; } /** @@ -2459,7 +2455,7 @@ void t_py_generator::generate_deserialize_set_element(ostream& out, t_set* tset, generate_deserialize_field(out, &felem); - indent(out) << prefix << ".add(" << elem << ")" << endl; + indent(out) << prefix << ".add(" << elem << ")" << '\n'; } /** @@ -2473,7 +2469,7 @@ void t_py_generator::generate_deserialize_list_element(ostream& out, generate_deserialize_field(out, &felem); - indent(out) << prefix << ".append(" << elem << ")" << endl; + indent(out) << prefix << ".append(" << elem << ")" << '\n'; } /** @@ -2543,7 +2539,7 @@ void t_py_generator::generate_serialize_field(ostream& out, t_field* tfield, str out << "writeI32(" << name << ")"; } } - out << endl; + out << '\n'; } else { printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n", prefix.c_str(), @@ -2560,50 +2556,50 @@ void t_py_generator::generate_serialize_field(ostream& out, t_field* tfield, str */ void t_py_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) { (void)tstruct; - indent(out) << prefix << ".write(oprot)" << endl; + indent(out) << prefix << ".write(oprot)" << '\n'; } void t_py_generator::generate_serialize_container(ostream& out, t_type* ttype, string prefix) { if (ttype->is_map()) { indent(out) << "oprot.writeMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " - << "len(" << prefix << "))" << endl; + << "len(" << prefix << "))" << '\n'; } else if (ttype->is_set()) { indent(out) << "oprot.writeSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " - << "len(" << prefix << "))" << endl; + << "len(" << prefix << "))" << '\n'; } else if (ttype->is_list()) { indent(out) << "oprot.writeListBegin(" << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " - << "len(" << prefix << "))" << endl; + << "len(" << prefix << "))" << '\n'; } if (ttype->is_map()) { string kiter = tmp("kiter"); string viter = tmp("viter"); - indent(out) << "for " << kiter << ", " << viter << " in " << prefix << ".items():" << endl; + indent(out) << "for " << kiter << ", " << viter << " in " << prefix << ".items():" << '\n'; indent_up(); generate_serialize_map_element(out, (t_map*)ttype, kiter, viter); indent_down(); } else if (ttype->is_set()) { string iter = tmp("iter"); - indent(out) << "for " << iter << " in " << prefix << ":" << endl; + indent(out) << "for " << iter << " in " << prefix << ":" << '\n'; indent_up(); generate_serialize_set_element(out, (t_set*)ttype, iter); indent_down(); } else if (ttype->is_list()) { string iter = tmp("iter"); - indent(out) << "for " << iter << " in " << prefix << ":" << endl; + indent(out) << "for " << iter << " in " << prefix << ":" << '\n'; indent_up(); generate_serialize_list_element(out, (t_list*)ttype, iter); indent_down(); } if (ttype->is_map()) { - indent(out) << "oprot.writeMapEnd()" << endl; + indent(out) << "oprot.writeMapEnd()" << '\n'; } else if (ttype->is_set()) { - indent(out) << "oprot.writeSetEnd()" << endl; + indent(out) << "oprot.writeSetEnd()" << '\n'; } else if (ttype->is_list()) { - indent(out) << "oprot.writeListEnd()" << endl; + indent(out) << "oprot.writeListEnd()" << '\n'; } } @@ -2669,7 +2665,7 @@ void t_py_generator::generate_python_docstring(ostream& out, const vector& fields = tstruct->get_members(); if (fields.size() > 0) { if (has_doc) { - ss << endl; + ss << '\n'; } has_doc = true; ss << subheader << ":\n"; @@ -2680,7 +2676,7 @@ void t_py_generator::generate_python_docstring(ostream& out, if (p->has_doc()) { ss << ": " << p->get_doc(); } else { - ss << endl; + ss << '\n'; } } } diff --git a/compiler/cpp/src/thrift/generate/t_rb_generator.cc b/compiler/cpp/src/thrift/generate/t_rb_generator.cc index 17e57cf95df..e9465736692 100644 --- a/compiler/cpp/src/thrift/generate/t_rb_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_rb_generator.cc @@ -43,8 +43,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /** * A subclass of std::ofstream that includes indenting functionality. */ @@ -283,11 +281,11 @@ void t_rb_generator::init_generator() { f_consts_.open(f_consts_name.c_str()); // Print header - f_types_ << rb_autogen_comment() << endl << render_require_thrift() << render_includes() << endl; + f_types_ << rb_autogen_comment() << '\n' << render_require_thrift() << render_includes() << '\n'; begin_namespace(f_types_, ruby_modules(program_)); - f_consts_ << rb_autogen_comment() << endl << render_require_thrift() << "require '" - << require_prefix_ << underscore(program_name_) << "_types'" << endl << endl; + f_consts_ << rb_autogen_comment() << '\n' << render_require_thrift() << "require '" + << require_prefix_ << underscore(program_name_) << "_types'" << '\n' << '\n'; begin_namespace(f_consts_, ruby_modules(program_)); } @@ -360,7 +358,7 @@ void t_rb_generator::generate_typedef(t_typedef* ttypedef) { * @param tenum The enumeration */ void t_rb_generator::generate_enum(t_enum* tenum) { - f_types_.indent() << "module " << capitalize(tenum->get_name()) << endl; + f_types_.indent() << "module " << capitalize(tenum->get_name()) << '\n'; f_types_.indent_up(); vector constants = tenum->get_constants(); @@ -374,7 +372,7 @@ void t_rb_generator::generate_enum(t_enum* tenum) { string name = capitalize((*c_iter)->get_name()); generate_rdoc(f_types_, *c_iter); - f_types_.indent() << name << " = " << value << endl; + f_types_.indent() << name << " = " << value << '\n'; } // Create a hash mapping values back to their names (as strings) since ruby has no native enum @@ -387,7 +385,7 @@ void t_rb_generator::generate_enum(t_enum* tenum) { f_types_ << ", "; f_types_ << value << " => \"" << capitalize((*c_iter)->get_name()) << "\""; } - f_types_ << "}" << endl; + f_types_ << "}" << '\n'; // Create a set with valid values for this enum f_types_.indent() << "VALID_VALUES = Set.new(["; @@ -397,10 +395,10 @@ void t_rb_generator::generate_enum(t_enum* tenum) { f_types_ << ", "; f_types_ << capitalize((*c_iter)->get_name()); } - f_types_ << "]).freeze" << endl; + f_types_ << "]).freeze" << '\n'; f_types_.indent_down(); - f_types_.indent() << "end" << endl << endl; + f_types_.indent() << "end" << '\n' << '\n'; } /** @@ -414,7 +412,7 @@ void t_rb_generator::generate_const(t_const* tconst) { name[0] = toupper(name[0]); f_consts_.indent() << name << " = "; - render_const_value(f_consts_, type, value) << endl << endl; + render_const_value(f_consts_, type, value) << '\n' << '\n'; } /** @@ -454,7 +452,7 @@ t_rb_ofstream& t_rb_generator::render_const_value(t_rb_ofstream& out, } else if (type->is_enum()) { out.indent() << value->get_integer(); } else if (type->is_struct() || type->is_xception()) { - out << full_type_name(type) << ".new({" << endl; + out << full_type_name(type) << ".new({" << '\n'; out.indent_up(); const vector& fields = ((t_struct*)type)->get_members(); vector::const_iterator f_iter; @@ -472,21 +470,21 @@ t_rb_ofstream& t_rb_generator::render_const_value(t_rb_ofstream& out, } out.indent(); render_const_value(out, g_type_string, v_iter->first) << " => "; - render_const_value(out, field_type, v_iter->second) << "," << endl; + render_const_value(out, field_type, v_iter->second) << "," << '\n'; } out.indent_down(); out.indent() << "})"; } else if (type->is_map()) { t_type* ktype = ((t_map*)type)->get_key_type(); t_type* vtype = ((t_map*)type)->get_val_type(); - out << "{" << endl; + out << "{" << '\n'; out.indent_up(); const map& val = value->get_map(); map::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { out.indent(); render_const_value(out, ktype, v_iter->first) << " => "; - render_const_value(out, vtype, v_iter->second) << "," << endl; + render_const_value(out, vtype, v_iter->second) << "," << '\n'; } out.indent_down(); out.indent() << "}"; @@ -498,16 +496,16 @@ t_rb_ofstream& t_rb_generator::render_const_value(t_rb_ofstream& out, etype = ((t_set*)type)->get_elem_type(); } if (type->is_set()) { - out << "Set.new([" << endl; + out << "Set.new([" << '\n'; } else { - out << "[" << endl; + out << "[" << '\n'; } out.indent_up(); const vector& val = value->get_list(); vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { out.indent(); - render_const_value(out, etype, *v_iter) << "," << endl; + render_const_value(out, etype, *v_iter) << "," << '\n'; } out.indent_down(); if (type->is_set()) { @@ -552,7 +550,7 @@ void t_rb_generator::generate_rb_struct_declaration(t_rb_ofstream& out, t_struct if (is_exception) { out << " < ::Thrift::Exception"; } - out << "; end" << endl << endl; + out << "; end" << '\n' << '\n'; } /** @@ -576,10 +574,10 @@ void t_rb_generator::generate_rb_struct(t_rb_ofstream& out, if (is_exception) { out << " < ::Thrift::Exception"; } - out << endl; + out << '\n'; out.indent_up(); - out.indent() << "include ::Thrift::Struct, ::Thrift::Struct_Union" << endl; + out.indent() << "include ::Thrift::Struct, ::Thrift::Struct_Union" << '\n'; if (is_exception) { generate_rb_simple_exception_constructor(out, tstruct); @@ -589,10 +587,10 @@ void t_rb_generator::generate_rb_struct(t_rb_ofstream& out, generate_field_defns(out, tstruct); generate_rb_struct_required_validator(out, tstruct); - out.indent() << "::Thrift::Struct.generate_accessors self" << endl; + out.indent() << "::Thrift::Struct.generate_accessors self" << '\n'; out.indent_down(); - out.indent() << "end" << endl << endl; + out.indent() << "end" << '\n' << '\n'; } /** @@ -603,10 +601,10 @@ void t_rb_generator::generate_rb_union(t_rb_ofstream& out, bool is_exception = false) { (void)is_exception; generate_rdoc(out, tstruct); - out.indent() << "class " << type_name(tstruct) << " < ::Thrift::Union" << endl; + out.indent() << "class " << type_name(tstruct) << " < ::Thrift::Union" << '\n'; out.indent_up(); - out.indent() << "include ::Thrift::Struct_Union" << endl; + out.indent() << "include ::Thrift::Struct_Union" << '\n'; generate_field_constructors(out, tstruct); @@ -614,15 +612,15 @@ void t_rb_generator::generate_rb_union(t_rb_ofstream& out, generate_field_defns(out, tstruct); generate_rb_union_validator(out, tstruct); - out.indent() << "::Thrift::Union.generate_accessors self" << endl; + out.indent() << "::Thrift::Union.generate_accessors self" << '\n'; out.indent_down(); - out.indent() << "end" << endl << endl; + out.indent() << "end" << '\n' << '\n'; } void t_rb_generator::generate_field_constructors(t_rb_ofstream& out, t_struct* tstruct) { - out.indent() << "class << self" << endl; + out.indent() << "class << self" << '\n'; out.indent_up(); const vector& fields = tstruct->get_members(); @@ -630,19 +628,19 @@ void t_rb_generator::generate_field_constructors(t_rb_ofstream& out, t_struct* t for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if (f_iter != fields.begin()) { - out << endl; + out << '\n'; } std::string field_name = (*f_iter)->get_name(); - out.indent() << "def " << field_name << "(val)" << endl; - out.indent() << " " << tstruct->get_name() << ".new(:" << field_name << ", val)" << endl; - out.indent() << "end" << endl; + out.indent() << "def " << field_name << "(val)" << '\n'; + out.indent() << " " << tstruct->get_name() << ".new(:" << field_name << ", val)" << '\n'; + out.indent() << "end" << '\n'; } out.indent_down(); - out.indent() << "end" << endl; + out.indent() << "end" << '\n'; - out << endl; + out << '\n'; } void t_rb_generator::generate_rb_simple_exception_constructor(t_rb_ofstream& out, @@ -655,15 +653,15 @@ void t_rb_generator::generate_rb_simple_exception_constructor(t_rb_ofstream& out if ((*m_iter)->get_type()->is_string()) { string name = (*m_iter)->get_name(); - out.indent() << "def initialize(message=nil)" << endl; + out.indent() << "def initialize(message=nil)" << '\n'; out.indent_up(); - out.indent() << "super()" << endl; - out.indent() << "self." << name << " = message" << endl; + out.indent() << "super()" << '\n'; + out.indent() << "self." << name << " = message" << '\n'; out.indent_down(); - out.indent() << "end" << endl << endl; + out.indent() << "end" << '\n' << '\n'; if (name != "message") { - out.indent() << "def message; " << name << " end" << endl << endl; + out.indent() << "def message; " << name << " end" << '\n' << '\n'; } } } @@ -677,20 +675,20 @@ void t_rb_generator::generate_field_constants(t_rb_ofstream& out, t_struct* tstr std::string field_name = (*f_iter)->get_name(); std::string cap_field_name = upcase_string(field_name); - out.indent() << cap_field_name << " = " << (*f_iter)->get_key() << endl; + out.indent() << cap_field_name << " = " << (*f_iter)->get_key() << '\n'; } - out << endl; + out << '\n'; } void t_rb_generator::generate_field_defns(t_rb_ofstream& out, t_struct* tstruct) { const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; - out.indent() << "FIELDS = {" << endl; + out.indent() << "FIELDS = {" << '\n'; out.indent_up(); for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if (f_iter != fields.begin()) { - out << "," << endl; + out << "," << '\n'; } // generate the field docstrings within the FIELDS constant. no real better place... @@ -705,10 +703,10 @@ void t_rb_generator::generate_field_defns(t_rb_ofstream& out, t_struct* tstruct) (*f_iter)->get_req() == t_field::T_OPTIONAL); } out.indent_down(); - out << endl; - out.indent() << "}" << endl << endl; + out << '\n'; + out.indent() << "}" << '\n' << '\n'; - out.indent() << "def struct_fields; FIELDS; end" << endl << endl; + out.indent() << "def struct_fields; FIELDS; end" << '\n' << '\n'; } void t_rb_generator::generate_field_data(t_rb_ofstream& out, @@ -765,7 +763,7 @@ void t_rb_generator::generate_field_data(t_rb_ofstream& out, void t_rb_generator::begin_namespace(t_rb_ofstream& out, vector modules) { for (auto & module : modules) { - out.indent() << "module " << module << endl; + out.indent() << "module " << module << '\n'; out.indent_up(); } } @@ -774,7 +772,7 @@ void t_rb_generator::end_namespace(t_rb_ofstream& out, vector modul for (vector::reverse_iterator m_iter = modules.rbegin(); m_iter != modules.rend(); ++m_iter) { out.indent_down(); - out.indent() << "end" << endl; + out.indent() << "end" << '\n'; } } @@ -787,25 +785,25 @@ void t_rb_generator::generate_service(t_service* tservice) { string f_service_name = namespace_dir_ + underscore(service_name_) + ".rb"; f_service_.open(f_service_name.c_str()); - f_service_ << rb_autogen_comment() << endl << render_require_thrift(); + f_service_ << rb_autogen_comment() << '\n' << render_require_thrift(); if (tservice->get_extends() != nullptr) { if (namespaced_) { f_service_ << "require '" << rb_namespace_to_path_prefix( tservice->get_extends()->get_program()->get_namespace("rb")) - << underscore(tservice->get_extends()->get_name()) << "'" << endl; + << underscore(tservice->get_extends()->get_name()) << "'" << '\n'; } else { f_service_ << "require '" << require_prefix_ - << underscore(tservice->get_extends()->get_name()) << "'" << endl; + << underscore(tservice->get_extends()->get_name()) << "'" << '\n'; } } - f_service_ << "require '" << require_prefix_ << underscore(program_name_) << "_types'" << endl - << endl; + f_service_ << "require '" << require_prefix_ << underscore(program_name_) << "_types'" << '\n' + << '\n'; begin_namespace(f_service_, ruby_modules(tservice->get_program())); - f_service_.indent() << "module " << capitalize(tservice->get_name()) << endl; + f_service_.indent() << "module " << capitalize(tservice->get_name()) << '\n'; f_service_.indent_up(); // Generate the three main parts of the service (well, two for now in PHP) @@ -814,7 +812,7 @@ void t_rb_generator::generate_service(t_service* tservice) { generate_service_helpers(tservice); f_service_.indent_down(); - f_service_.indent() << "end" << endl << endl; + f_service_.indent() << "end" << '\n' << '\n'; end_namespace(f_service_, ruby_modules(tservice->get_program())); @@ -831,7 +829,7 @@ void t_rb_generator::generate_service_helpers(t_service* tservice) { vector functions = tservice->get_functions(); vector::iterator f_iter; - f_service_.indent() << "# HELPER FUNCTIONS AND STRUCTURES" << endl << endl; + f_service_.indent() << "# HELPER FUNCTIONS AND STRUCTURES" << '\n' << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { t_struct* ts = (*f_iter)->get_arglist(); @@ -874,10 +872,10 @@ void t_rb_generator::generate_service_client(t_service* tservice) { extends_client = " < " + extends + "::Client "; } - f_service_.indent() << "class Client" << extends_client << endl; + f_service_.indent() << "class Client" << extends_client << '\n'; f_service_.indent_up(); - f_service_.indent() << "include ::Thrift::Client" << endl << endl; + f_service_.indent() << "include ::Thrift::Client" << '\n' << '\n'; // Generate client method implementations vector functions = tservice->get_functions(); @@ -889,7 +887,7 @@ void t_rb_generator::generate_service_client(t_service* tservice) { string funname = (*f_iter)->get_name(); // Open function - f_service_.indent() << "def " << function_signature(*f_iter) << endl; + f_service_.indent() << "def " << function_signature(*f_iter) << '\n'; f_service_.indent_up(); f_service_.indent() << "send_" << funname << "("; @@ -902,20 +900,20 @@ void t_rb_generator::generate_service_client(t_service* tservice) { } f_service_ << (*fld_iter)->get_name(); } - f_service_ << ")" << endl; + f_service_ << ")" << '\n'; if (!(*f_iter)->is_oneway()) { f_service_.indent(); if (!(*f_iter)->get_returntype()->is_void()) { f_service_ << "return "; } - f_service_ << "recv_" << funname << "()" << endl; + f_service_ << "recv_" << funname << "()" << '\n'; } f_service_.indent_down(); - f_service_.indent() << "end" << endl; - f_service_ << endl; + f_service_.indent() << "end" << '\n'; + f_service_ << '\n'; - f_service_.indent() << "def send_" << function_signature(*f_iter) << endl; + f_service_.indent() << "def send_" << function_signature(*f_iter) << '\n'; f_service_.indent_up(); std::string argsname = capitalize((*f_iter)->get_name() + "_args"); @@ -927,10 +925,10 @@ void t_rb_generator::generate_service_client(t_service* tservice) { f_service_ << ", :" << (*fld_iter)->get_name() << " => " << (*fld_iter)->get_name(); } - f_service_ << ")" << endl; + f_service_ << ")" << '\n'; f_service_.indent_down(); - f_service_.indent() << "end" << endl; + f_service_.indent() << "end" << '\n'; if (!(*f_iter)->is_oneway()) { std::string resultname = capitalize((*f_iter)->get_name() + "_result"); @@ -940,22 +938,22 @@ void t_rb_generator::generate_service_client(t_service* tservice) { string("recv_") + (*f_iter)->get_name(), &noargs); // Open function - f_service_ << endl; - f_service_.indent() << "def " << function_signature(&recv_function) << endl; + f_service_ << '\n'; + f_service_.indent() << "def " << function_signature(&recv_function) << '\n'; f_service_.indent_up(); - f_service_.indent() << "fname, mtype, rseqid = receive_message_begin()" << endl; - f_service_.indent() << "handle_exception(mtype)" << endl; + f_service_.indent() << "fname, mtype, rseqid = receive_message_begin()" << '\n'; + f_service_.indent() << "handle_exception(mtype)" << '\n'; - f_service_.indent() << "if reply_seqid(rseqid)==false" << endl; - f_service_.indent() << " raise \"seqid reply faild\"" << endl; - f_service_.indent() << "end" << endl; + f_service_.indent() << "if reply_seqid(rseqid)==false" << '\n'; + f_service_.indent() << " raise \"seqid reply faild\"" << '\n'; + f_service_.indent() << "end" << '\n'; - f_service_.indent() << "result = receive_message(" << resultname << ")" << endl; + f_service_.indent() << "result = receive_message(" << resultname << ")" << '\n'; // Careful, only return _result if not a void function if (!(*f_iter)->get_returntype()->is_void()) { - f_service_.indent() << "return result.success unless result.success.nil?" << endl; + f_service_.indent() << "return result.success unless result.success.nil?" << '\n'; } t_struct* xs = (*f_iter)->get_xceptions(); @@ -963,27 +961,27 @@ void t_rb_generator::generate_service_client(t_service* tservice) { vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { f_service_.indent() << "raise result." << (*x_iter)->get_name() << " unless result." - << (*x_iter)->get_name() << ".nil?" << endl; + << (*x_iter)->get_name() << ".nil?" << '\n'; } // Careful, only return _result if not a void function if ((*f_iter)->get_returntype()->is_void()) { - f_service_.indent() << "return" << endl; + f_service_.indent() << "return" << '\n'; } else { f_service_.indent() << "raise " "::Thrift::ApplicationException.new(::Thrift::ApplicationException::" "MISSING_RESULT, '" << (*f_iter)->get_name() - << " failed: unknown result')" << endl; + << " failed: unknown result')" << '\n'; } // Close function f_service_.indent_down(); - f_service_.indent() << "end" << endl << endl; + f_service_.indent() << "end" << '\n' << '\n'; } } f_service_.indent_down(); - f_service_.indent() << "end" << endl << endl; + f_service_.indent() << "end" << '\n' << '\n'; } /** @@ -1004,10 +1002,10 @@ void t_rb_generator::generate_service_server(t_service* tservice) { } // Generate the header portion - f_service_.indent() << "class Processor" << extends_processor << endl; + f_service_.indent() << "class Processor" << extends_processor << '\n'; f_service_.indent_up(); - f_service_.indent() << "include ::Thrift::Processor" << endl << endl; + f_service_.indent() << "include ::Thrift::Processor" << '\n' << '\n'; // Generate the process subfunctions for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { @@ -1015,7 +1013,7 @@ void t_rb_generator::generate_service_server(t_service* tservice) { } f_service_.indent_down(); - f_service_.indent() << "end" << endl << endl; + f_service_.indent() << "end" << '\n' << '\n'; } /** @@ -1026,13 +1024,13 @@ void t_rb_generator::generate_service_server(t_service* tservice) { void t_rb_generator::generate_process_function(t_service* tservice, t_function* tfunction) { (void)tservice; // Open function - f_service_.indent() << "def process_" << tfunction->get_name() << "(seqid, iprot, oprot)" << endl; + f_service_.indent() << "def process_" << tfunction->get_name() << "(seqid, iprot, oprot)" << '\n'; f_service_.indent_up(); string argsname = capitalize(tfunction->get_name()) + "_args"; string resultname = capitalize(tfunction->get_name()) + "_result"; - f_service_.indent() << "args = read_args(iprot, " << argsname << ")" << endl; + f_service_.indent() << "args = read_args(iprot, " << argsname << ")" << '\n'; t_struct* xs = tfunction->get_xceptions(); const std::vector& xceptions = xs->get_members(); @@ -1040,12 +1038,12 @@ void t_rb_generator::generate_process_function(t_service* tservice, t_function* // Declare result for non oneway function if (!tfunction->is_oneway()) { - f_service_.indent() << "result = " << resultname << ".new()" << endl; + f_service_.indent() << "result = " << resultname << ".new()" << '\n'; } // Try block for a function with exceptions if (xceptions.size() > 0) { - f_service_.indent() << "begin" << endl; + f_service_.indent() << "begin" << '\n'; f_service_.indent_up(); } @@ -1068,37 +1066,37 @@ void t_rb_generator::generate_process_function(t_service* tservice, t_function* } f_service_ << "args." << (*f_iter)->get_name(); } - f_service_ << ")" << endl; + f_service_ << ")" << '\n'; if (!tfunction->is_oneway() && xceptions.size() > 0) { f_service_.indent_down(); for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { f_service_.indent() << "rescue " << full_type_name((*x_iter)->get_type()) << " => " - << (*x_iter)->get_name() << endl; + << (*x_iter)->get_name() << '\n'; if (!tfunction->is_oneway()) { f_service_.indent_up(); f_service_.indent() << "result." << (*x_iter)->get_name() << " = " << (*x_iter)->get_name() - << endl; + << '\n'; f_service_.indent_down(); } } - f_service_.indent() << "end" << endl; + f_service_.indent() << "end" << '\n'; } // Shortcut out here for oneway functions if (tfunction->is_oneway()) { - f_service_.indent() << "return" << endl; + f_service_.indent() << "return" << '\n'; f_service_.indent_down(); - f_service_.indent() << "end" << endl << endl; + f_service_.indent() << "end" << '\n' << '\n'; return; } f_service_.indent() << "write_result(result, oprot, '" << tfunction->get_name() << "', seqid)" - << endl; + << '\n'; // Close function f_service_.indent_down(); - f_service_.indent() << "end" << endl << endl; + f_service_.indent() << "end" << '\n' << '\n'; } /** @@ -1219,7 +1217,7 @@ void t_rb_generator::generate_rdoc(t_rb_ofstream& out, t_doc* tdoc) { } void t_rb_generator::generate_rb_struct_required_validator(t_rb_ofstream& out, t_struct* tstruct) { - out.indent() << "def validate" << endl; + out.indent() << "def validate" << '\n'; out.indent_up(); const vector& fields = tstruct->get_members(); @@ -1235,7 +1233,7 @@ void t_rb_generator::generate_rb_struct_required_validator(t_rb_ofstream& out, t } else { out << " unless @" << field->get_name(); } - out << endl; + out << '\n'; } } @@ -1246,21 +1244,21 @@ void t_rb_generator::generate_rb_struct_required_validator(t_rb_ofstream& out, t if (field->get_type()->is_enum()) { out.indent() << "unless @" << field->get_name() << ".nil? || " << full_type_name(field->get_type()) << "::VALID_VALUES.include?(@" - << field->get_name() << ")" << endl; + << field->get_name() << ")" << '\n'; out.indent_up(); out.indent() << "raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, " - "'Invalid value of field " << field->get_name() << "!')" << endl; + "'Invalid value of field " << field->get_name() << "!')" << '\n'; out.indent_down(); - out.indent() << "end" << endl; + out.indent() << "end" << '\n'; } } out.indent_down(); - out.indent() << "end" << endl << endl; + out.indent() << "end" << '\n' << '\n'; } void t_rb_generator::generate_rb_union_validator(t_rb_ofstream& out, t_struct* tstruct) { - out.indent() << "def validate" << endl; + out.indent() << "def validate" << '\n'; out.indent_up(); const vector& fields = tstruct->get_members(); @@ -1268,25 +1266,25 @@ void t_rb_generator::generate_rb_union_validator(t_rb_ofstream& out, t_struct* t out.indent() << "raise(StandardError, 'Union fields are not set.') if get_set_field.nil? || get_value.nil?" - << endl; + << '\n'; // if field is an enum, check that its value is valid for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { const t_field* field = (*f_iter); if (field->get_type()->is_enum()) { - out.indent() << "if get_set_field == :" << field->get_name() << endl; + out.indent() << "if get_set_field == :" << field->get_name() << '\n'; out.indent() << " raise " "::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, " "'Invalid value of field " << field->get_name() << "!') unless " << full_type_name(field->get_type()) << "::VALID_VALUES.include?(get_value)" - << endl; - out.indent() << "end" << endl; + << '\n'; + out.indent() << "end" << '\n'; } } out.indent_down(); - out.indent() << "end" << endl << endl; + out.indent() << "end" << '\n' << '\n'; } std::string t_rb_generator::display_name() const { diff --git a/compiler/cpp/src/thrift/generate/t_rs_generator.cc b/compiler/cpp/src/thrift/generate/t_rs_generator.cc index 2742724a605..780c8fd2914 100644 --- a/compiler/cpp/src/thrift/generate/t_rs_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_rs_generator.cc @@ -31,7 +31,6 @@ using std::set; using std::string; using std::vector; -static const string endl("\n"); // avoid ostream << std::endl flushes static const string SERVICE_RESULT_VARIABLE("result_value"); static const string RESULT_STRUCT_SUFFIX("Result"); static const string RUST_RESERVED_WORDS[] @@ -521,9 +520,9 @@ void t_rs_generator::init_generator() { f_gen_.open(f_gen_name.c_str()); // header comment - f_gen_ << "// " << autogen_summary() << endl; - f_gen_ << "// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING" << endl; - f_gen_ << endl; + f_gen_ << "// " << autogen_summary() << '\n'; + f_gen_ << "// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING" << '\n'; + f_gen_ << '\n'; render_attributes_and_includes(); } @@ -532,11 +531,11 @@ void t_rs_generator::render_attributes_and_includes() { // turn off some compiler/clippy warnings // code may not be used - f_gen_ << "#![allow(dead_code)]" << endl; + f_gen_ << "#![allow(dead_code)]" << '\n'; // code always includes BTreeMap/BTreeSet/OrderedFloat - f_gen_ << "#![allow(unused_imports)]" << endl; + f_gen_ << "#![allow(unused_imports)]" << '\n'; // code might not include imports from crates - f_gen_ << "#![allow(unused_extern_crates)]" << endl; + f_gen_ << "#![allow(unused_extern_crates)]" << '\n'; // constructors take *all* struct parameters, which can trigger the "too many arguments" warning // some auto-gen'd types can be deeply nested. clippy recommends factoring them out which is hard // to autogen some methods may start with "is_" @@ -548,38 +547,38 @@ void t_rs_generator::render_attributes_and_includes() { // 2. When you define types out of order f_gen_ << "#![allow(clippy::too_many_arguments, clippy::type_complexity, clippy::vec_box, " "clippy::wrong_self_convention)]" - << endl; + << '\n'; // prevent rustfmt from running against this file // lines are too long, code is (thankfully!) not visual-indented, etc. // can't use #[rustfmt::skip] see: https://github.com/rust-lang/rust/issues/54726 - f_gen_ << "#![cfg_attr(rustfmt, rustfmt_skip)]" << endl; - f_gen_ << endl; + f_gen_ << "#![cfg_attr(rustfmt, rustfmt_skip)]" << '\n'; + f_gen_ << '\n'; // add standard includes - f_gen_ << "use std::cell::RefCell;" << endl; - f_gen_ << "use std::collections::{BTreeMap, BTreeSet};" << endl; - f_gen_ << "use std::convert::{From, TryFrom};" << endl; - f_gen_ << "use std::default::Default;" << endl; - f_gen_ << "use std::error::Error;" << endl; - f_gen_ << "use std::fmt;" << endl; - f_gen_ << "use std::fmt::{Display, Formatter};" << endl; - f_gen_ << "use std::rc::Rc;" << endl; - f_gen_ << endl; - f_gen_ << "use thrift::OrderedFloat;" << endl; + f_gen_ << "use std::cell::RefCell;" << '\n'; + f_gen_ << "use std::collections::{BTreeMap, BTreeSet};" << '\n'; + f_gen_ << "use std::convert::{From, TryFrom};" << '\n'; + f_gen_ << "use std::default::Default;" << '\n'; + f_gen_ << "use std::error::Error;" << '\n'; + f_gen_ << "use std::fmt;" << '\n'; + f_gen_ << "use std::fmt::{Display, Formatter};" << '\n'; + f_gen_ << "use std::rc::Rc;" << '\n'; + f_gen_ << '\n'; + f_gen_ << "use thrift::OrderedFloat;" << '\n'; f_gen_ << "use thrift::{ApplicationError, ApplicationErrorKind, ProtocolError, " "ProtocolErrorKind, TThriftClient};" - << endl; + << '\n'; f_gen_ << "use thrift::protocol::{TFieldIdentifier, TListIdentifier, TMapIdentifier, " "TMessageIdentifier, TMessageType, TInputProtocol, TOutputProtocol, TSerializable, " "TSetIdentifier, TStructIdentifier, TType};" - << endl; - f_gen_ << "use thrift::protocol::field_id;" << endl; - f_gen_ << "use thrift::protocol::verify_expected_message_type;" << endl; - f_gen_ << "use thrift::protocol::verify_expected_sequence_number;" << endl; - f_gen_ << "use thrift::protocol::verify_expected_service_call;" << endl; - f_gen_ << "use thrift::protocol::verify_required_field_exists;" << endl; - f_gen_ << "use thrift::server::TProcessor;" << endl; - f_gen_ << endl; + << '\n'; + f_gen_ << "use thrift::protocol::field_id;" << '\n'; + f_gen_ << "use thrift::protocol::verify_expected_message_type;" << '\n'; + f_gen_ << "use thrift::protocol::verify_expected_sequence_number;" << '\n'; + f_gen_ << "use thrift::protocol::verify_expected_service_call;" << '\n'; + f_gen_ << "use thrift::protocol::verify_required_field_exists;" << '\n'; + f_gen_ << "use thrift::server::TProcessor;" << '\n'; + f_gen_ << '\n'; // add all the program includes // NOTE: this is more involved than you would expect because of service extension @@ -615,13 +614,13 @@ void t_rs_generator::render_attributes_and_includes() { string_replace(module_namespace, ".", "::"); if (module_namespace.empty()) { - f_gen_ << "use crate::" << rust_snake_case(module_name) << ";" << endl; + f_gen_ << "use crate::" << rust_snake_case(module_name) << ";" << '\n'; } else { f_gen_ << "use crate::" << module_namespace << "::" << rust_snake_case(module_name) << ";" - << endl; + << '\n'; } } - f_gen_ << endl; + f_gen_ << '\n'; } } @@ -673,8 +672,8 @@ void t_rs_generator::render_const_value(const string& name, t_type* ttype, t_con f_gen_ << "pub const " << rust_upper_case(name) << ": " << to_rust_const_type(ttype) << " = "; render_const_value(ttype, tvalue, false); - f_gen_ << ";" << endl; - f_gen_ << endl; + f_gen_ << ";" << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_const_value_holder(const string& name, @@ -686,19 +685,19 @@ void t_rs_generator::render_const_value_holder(const string& name, string holder_name("Const" + rust_camel_case(name)); - f_gen_ << indent() << "pub struct " << holder_name << ";" << endl; - f_gen_ << indent() << "impl " << holder_name << " {" << endl; + f_gen_ << indent() << "pub struct " << holder_name << ";" << '\n'; + f_gen_ << indent() << "impl " << holder_name << " {" << '\n'; indent_up(); - f_gen_ << indent() << "pub fn const_value() -> " << to_rust_type(ttype) << " {" << endl; + f_gen_ << indent() << "pub fn const_value() -> " << to_rust_type(ttype) << " {" << '\n'; indent_up(); render_const_value(ttype, tvalue, true, false); indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_const_value(t_type* ttype, @@ -748,10 +747,10 @@ void t_rs_generator::render_const_value(t_type* ttype, } else if (ttype->is_typedef()) { render_const_value(get_true_type(ttype), tvalue, is_owned, true); } else if (ttype->is_enum()) { - f_gen_ << "{" << endl; + f_gen_ << "{" << '\n'; indent_up(); f_gen_ << indent() << to_rust_type(ttype) << "::try_from(" << tvalue->get_integer() - << ").expect(\"expecting valid const value\")" << endl; + << ").expect(\"expecting valid const value\")" << '\n'; indent_down(); f_gen_ << indent() << "}"; } else if (ttype->is_struct() || ttype->is_xception()) { @@ -772,21 +771,21 @@ void t_rs_generator::render_const_value(t_type* ttype, } if (!is_inline) { - f_gen_ << endl; + f_gen_ << '\n'; } } void t_rs_generator::render_const_struct(t_type* ttype, t_const_value*) { if (((t_struct*)ttype)->is_union()) { - f_gen_ << "{" << endl; + f_gen_ << "{" << '\n'; indent_up(); - f_gen_ << indent() << "unimplemented!()" << endl; + f_gen_ << indent() << "unimplemented!()" << '\n'; indent_down(); f_gen_ << indent() << "}"; } else { - f_gen_ << "{" << endl; + f_gen_ << "{" << '\n'; indent_up(); - f_gen_ << indent() << "unimplemented!()" << endl; + f_gen_ << indent() << "unimplemented!()" << '\n'; indent_down(); f_gen_ << indent() << "}"; } @@ -794,7 +793,7 @@ void t_rs_generator::render_const_struct(t_type* ttype, t_const_value*) { void t_rs_generator::render_const_list(t_type* ttype, t_const_value* tvalue) { t_type* elem_type = ((t_list*)ttype)->get_elem_type(); - f_gen_ << "vec![" << endl; + f_gen_ << "vec![" << '\n'; indent_up(); const vector& elems = tvalue->get_list(); vector::const_iterator elem_iter; @@ -802,7 +801,7 @@ void t_rs_generator::render_const_list(t_type* ttype, t_const_value* tvalue) { f_gen_ << indent(); t_const_value* elem_value = (*elem_iter); render_const_value(elem_type, elem_value); - f_gen_ << "," << endl; + f_gen_ << "," << '\n'; } indent_down(); f_gen_ << indent() << "]"; @@ -810,7 +809,7 @@ void t_rs_generator::render_const_list(t_type* ttype, t_const_value* tvalue) { void t_rs_generator::render_const_set(t_type* ttype, t_const_value* tvalue) { t_type* elem_type = ((t_set*)ttype)->get_elem_type(); - f_gen_ << "BTreeSet::from([" << endl; + f_gen_ << "BTreeSet::from([" << '\n'; indent_up(); const vector& elems = tvalue->get_list(); vector::const_iterator elem_iter; @@ -818,7 +817,7 @@ void t_rs_generator::render_const_set(t_type* ttype, t_const_value* tvalue) { f_gen_ << indent(); t_const_value* elem_value = (*elem_iter); render_const_value(elem_type, elem_value); - f_gen_ << "," << endl; + f_gen_ << "," << '\n'; } indent_down(); f_gen_ << indent() << "])"; @@ -827,7 +826,7 @@ void t_rs_generator::render_const_set(t_type* ttype, t_const_value* tvalue) { void t_rs_generator::render_const_map(t_type* ttype, t_const_value* tvalue) { t_type* key_type = ((t_map*)ttype)->get_key_type(); t_type* val_type = ((t_map*)ttype)->get_val_type(); - f_gen_ << "BTreeMap::from([" << endl; + f_gen_ << "BTreeMap::from([" << '\n'; indent_up(); const map& elems = tvalue->get_map(); @@ -836,16 +835,16 @@ void t_rs_generator::render_const_map(t_type* ttype, t_const_value* tvalue) { t_const_value* key_value = elem_iter->first; t_const_value* val_value = elem_iter->second; - f_gen_ << indent() << "(" << endl; + f_gen_ << indent() << "(" << '\n'; indent_up(); f_gen_ << indent(); render_const_value(key_type, key_value); - f_gen_ << "," << endl; + f_gen_ << "," << '\n'; f_gen_ << indent(); render_const_value(val_type, val_value); - f_gen_ << "," << endl; + f_gen_ << "," << '\n'; indent_down(); - f_gen_ << indent() << ")," << endl; + f_gen_ << indent() << ")," << '\n'; } indent_down(); f_gen_ << indent() << "])"; @@ -860,8 +859,8 @@ void t_rs_generator::render_const_map(t_type* ttype, t_const_value* tvalue) { void t_rs_generator::generate_typedef(t_typedef* ttypedef) { std::string actual_type = to_rust_type(ttypedef->get_type()); f_gen_ << "pub type " << rust_safe_name(ttypedef->get_symbolic()) << " = " << actual_type << ";" - << endl; - f_gen_ << endl; + << '\n'; + f_gen_ << '\n'; } //----------------------------------------------------------------------------- @@ -879,13 +878,13 @@ void t_rs_generator::generate_enum(t_enum* tenum) { void t_rs_generator::render_enum_definition(t_enum* tenum, const string& enum_name) { render_rustdoc((t_doc*)tenum); - f_gen_ << "#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]" << endl; - f_gen_ << "pub struct " << enum_name << "(pub i32);" << endl; - f_gen_ << endl; + f_gen_ << "#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]" << '\n'; + f_gen_ << "pub struct " << enum_name << "(pub i32);" << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_enum_impl(t_enum* tenum, const string& enum_name) { - f_gen_ << "impl " << enum_name << " {" << endl; + f_gen_ << "impl " << enum_name << " {" << '\n'; indent_up(); vector constants = tenum->get_constants(); @@ -898,114 +897,114 @@ void t_rs_generator::render_enum_impl(t_enum* tenum, const string& enum_name) { render_rustdoc((t_doc*)val); f_gen_ << indent() << "pub const " << rust_enum_variant_name(val->get_name()) << ": " << enum_name << " = " << enum_name << "(" << val->get_value() << ")" - << ";" << endl; + << ";" << '\n'; } } // array containing all IDL-defined enum variants { - f_gen_ << indent() << "pub const ENUM_VALUES: &'static [Self] = &[" << endl; + f_gen_ << indent() << "pub const ENUM_VALUES: &'static [Self] = &[" << '\n'; indent_up(); vector::iterator constants_iter; for (constants_iter = constants.begin(); constants_iter != constants.end(); ++constants_iter) { t_enum_value* val = (*constants_iter); - f_gen_ << indent() << "Self::" << rust_enum_variant_name(val->get_name()) << "," << endl; + f_gen_ << indent() << "Self::" << rust_enum_variant_name(val->get_name()) << "," << '\n'; } indent_down(); - f_gen_ << indent() << "];" << endl; + f_gen_ << indent() << "];" << '\n'; } indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; - f_gen_ << "impl TSerializable for " << enum_name << " {" << endl; + f_gen_ << "impl TSerializable for " << enum_name << " {" << '\n'; indent_up(); - f_gen_ << indent() << "#[allow(clippy::trivially_copy_pass_by_ref)]" << endl; + f_gen_ << indent() << "#[allow(clippy::trivially_copy_pass_by_ref)]" << '\n'; f_gen_ << indent() << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {" - << endl; + << '\n'; indent_up(); - f_gen_ << indent() << "o_prot.write_i32(self.0)" << endl; + f_gen_ << indent() << "o_prot.write_i32(self.0)" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; f_gen_ << indent() << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<" - << enum_name << "> {" << endl; + << enum_name << "> {" << '\n'; indent_up(); - f_gen_ << indent() << "let enum_value = i_prot.read_i32()?;" << endl; + f_gen_ << indent() << "let enum_value = i_prot.read_i32()?;" << '\n'; f_gen_ << indent() << "Ok(" << enum_name << "::from(enum_value)" - << ")" << endl; + << ")" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_enum_conversion(t_enum* tenum, const string& enum_name) { // From trait: i32 -> ENUM_TYPE - f_gen_ << "impl From for " << enum_name << " {" << endl; + f_gen_ << "impl From for " << enum_name << " {" << '\n'; indent_up(); - f_gen_ << indent() << "fn from(i: i32) -> Self {" << endl; + f_gen_ << indent() << "fn from(i: i32) -> Self {" << '\n'; indent_up(); - f_gen_ << indent() << "match i {" << endl; + f_gen_ << indent() << "match i {" << '\n'; indent_up(); vector constants = tenum->get_constants(); vector::iterator constants_iter; for (constants_iter = constants.begin(); constants_iter != constants.end(); ++constants_iter) { t_enum_value* val = (*constants_iter); f_gen_ << indent() << val->get_value() << " => " << enum_name - << "::" << rust_enum_variant_name(val->get_name()) << "," << endl; + << "::" << rust_enum_variant_name(val->get_name()) << "," << '\n'; } - f_gen_ << indent() << "_ => " << enum_name << "(i)" << endl; + f_gen_ << indent() << "_ => " << enum_name << "(i)" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; // From trait: &i32 -> ENUM_TYPE - f_gen_ << "impl From<&i32> for " << enum_name << " {" << endl; + f_gen_ << "impl From<&i32> for " << enum_name << " {" << '\n'; indent_up(); - f_gen_ << indent() << "fn from(i: &i32) -> Self {" << endl; + f_gen_ << indent() << "fn from(i: &i32) -> Self {" << '\n'; indent_up(); - f_gen_ << indent() << enum_name << "::from(*i)" << endl; + f_gen_ << indent() << enum_name << "::from(*i)" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; // From trait: ENUM_TYPE -> int - f_gen_ << "impl From<" << enum_name << "> for i32 {" << endl; + f_gen_ << "impl From<" << enum_name << "> for i32 {" << '\n'; indent_up(); - f_gen_ << indent() << "fn from(e: " << enum_name << ") -> i32 {" << endl; + f_gen_ << indent() << "fn from(e: " << enum_name << ") -> i32 {" << '\n'; indent_up(); - f_gen_ << indent() << "e.0" << endl; + f_gen_ << indent() << "e.0" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; // From trait: &ENUM_TYPE -> int - f_gen_ << "impl From<&" << enum_name << "> for i32 {" << endl; + f_gen_ << "impl From<&" << enum_name << "> for i32 {" << '\n'; indent_up(); - f_gen_ << indent() << "fn from(e: &" << enum_name << ") -> i32 {" << endl; + f_gen_ << indent() << "fn from(e: &" << enum_name << ") -> i32 {" << '\n'; indent_up(); - f_gen_ << indent() << "e.0" << endl; + f_gen_ << indent() << "e.0" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; } //----------------------------------------------------------------------------- @@ -1056,8 +1055,8 @@ void t_rs_generator::render_struct_definition(const string& struct_name, } } f_gen_ << "#[derive(Clone, Debug" << (need_default ? ", Default" : "") - << ", Eq, Hash, Ord, PartialEq, PartialOrd)]" << endl; - f_gen_ << visibility_qualifier(struct_type) << "struct " << struct_name << " {" << endl; + << ", Eq, Hash, Ord, PartialEq, PartialOrd)]" << '\n'; + f_gen_ << visibility_qualifier(struct_type) << "struct " << struct_name << " {" << '\n'; // render the members if (!members.empty()) { @@ -1072,53 +1071,53 @@ void t_rs_generator::render_struct_definition(const string& struct_name, render_rustdoc((t_doc*)member); f_gen_ << indent() << visibility_qualifier(struct_type) << rust_field_name(member) << ": " - << rust_type << "," << endl; + << rust_type << "," << '\n'; } indent_down(); } - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_exception_struct_error_trait_impls(const string& struct_name, t_struct* tstruct) { // error::Error trait - f_gen_ << "impl Error for " << struct_name << " {}" << endl; - f_gen_ << endl; + f_gen_ << "impl Error for " << struct_name << " {}" << '\n'; + f_gen_ << '\n'; // convert::From trait - f_gen_ << "impl From<" << struct_name << "> for thrift::Error {" << endl; + f_gen_ << "impl From<" << struct_name << "> for thrift::Error {" << '\n'; indent_up(); - f_gen_ << indent() << "fn from(e: " << struct_name << ") -> Self {" << endl; + f_gen_ << indent() << "fn from(e: " << struct_name << ") -> Self {" << '\n'; indent_up(); - f_gen_ << indent() << "thrift::Error::User(Box::new(e))" << endl; + f_gen_ << indent() << "thrift::Error::User(Box::new(e))" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; // fmt::Display trait - f_gen_ << "impl Display for " << struct_name << " {" << endl; + f_gen_ << "impl Display for " << struct_name << " {" << '\n'; indent_up(); - f_gen_ << indent() << "fn fmt(&self, f: &mut Formatter) -> fmt::Result {" << endl; + f_gen_ << indent() << "fn fmt(&self, f: &mut Formatter) -> fmt::Result {" << '\n'; indent_up(); f_gen_ << indent() << "write!(f, " << "\"remote service threw " << tstruct->get_name() << "\"" // use *original* name - << ")" << endl; + << ")" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_struct_impl(const string& struct_name, t_struct* tstruct, t_rs_generator::e_struct_type struct_type) { - f_gen_ << "impl " << struct_name << " {" << endl; + f_gen_ << "impl " << struct_name << " {" << '\n'; indent_up(); if (struct_type == t_rs_generator::T_REGULAR || struct_type == t_rs_generator::T_EXCEPTION) { @@ -1131,10 +1130,10 @@ void t_rs_generator::render_struct_impl(const string& struct_name, if (struct_type == t_rs_generator::T_REGULAR || struct_type == t_rs_generator::T_EXCEPTION) { indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; - f_gen_ << "impl TSerializable for " << struct_name << " {" << endl; + f_gen_ << "impl TSerializable for " << struct_name << " {" << '\n'; indent_up(); } @@ -1142,8 +1141,8 @@ void t_rs_generator::render_struct_impl(const string& struct_name, render_struct_sync_write(tstruct, struct_type); indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_struct_constructor(const string& struct_name, @@ -1213,13 +1212,13 @@ void t_rs_generator::render_struct_constructor(const string& struct_name, string visibility(visibility_qualifier(struct_type)); f_gen_ << indent() << visibility << "fn new" << type_parameter_string << "(" << arg_string - << ") -> " << struct_name << " " << type_qualifier_string << "{" << endl; + << ") -> " << struct_name << " " << type_qualifier_string << "{" << '\n'; indent_up(); if (members.empty()) { - f_gen_ << indent() << struct_name << " {}" << endl; + f_gen_ << indent() << struct_name << " {}" << '\n'; } else { - f_gen_ << indent() << struct_name << " {" << endl; + f_gen_ << indent() << struct_name << " {" << '\n'; indent_up(); for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) { @@ -1228,18 +1227,18 @@ void t_rs_generator::render_struct_constructor(const string& struct_name, string member_name(rust_field_name(member)); if (is_optional(member_req)) { - f_gen_ << indent() << member_name << ": " << member_name << ".into()," << endl; + f_gen_ << indent() << member_name << ": " << member_name << ".into()," << '\n'; } else { - f_gen_ << indent() << member_name << "," << endl; + f_gen_ << indent() << member_name << "," << '\n'; } } indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } void t_rs_generator::render_result_struct_to_result_method(t_struct* tstruct) { @@ -1272,7 +1271,7 @@ void t_rs_generator::render_result_struct_to_result_method(t_struct* tstruct) { // maintaining a rendered branch count (while a little ugly) got me the // rendering I wanted with code that was reasonably understandable - f_gen_ << indent() << "fn ok_or(self) -> thrift::Result<" << rust_return_type << "> {" << endl; + f_gen_ << indent() << "fn ok_or(self) -> thrift::Result<" << rust_return_type << "> {" << '\n'; indent_up(); int rendered_branch_count = 0; @@ -1284,10 +1283,10 @@ void t_rs_generator::render_result_struct_to_result_method(t_struct* tstruct) { string field_name("self." + rust_field_name(tfield)); string branch_statement = rendered_branch_count == 0 ? "if" : "} else if"; - f_gen_ << indent() << branch_statement << " " << field_name << ".is_some() {" << endl; + f_gen_ << indent() << branch_statement << " " << field_name << ".is_some() {" << '\n'; indent_up(); f_gen_ << indent() << "Err(thrift::Error::User(Box::new(" << field_name << ".unwrap())))" - << endl; + << '\n'; indent_down(); rendered_branch_count++; @@ -1299,35 +1298,35 @@ void t_rs_generator::render_result_struct_to_result_method(t_struct* tstruct) { if (rendered_branch_count == 0) { // we have the unit return and this service call has no user-defined // exceptions. this means that we've a trivial return (happens with oneways) - f_gen_ << indent() << "Ok(())" << endl; + f_gen_ << indent() << "Ok(())" << '\n'; } else { // we have the unit return, but there are user-defined exceptions // if we've gotten this far then we have the default return (i.e. call successful) - f_gen_ << indent() << "} else {" << endl; + f_gen_ << indent() << "} else {" << '\n'; indent_up(); - f_gen_ << indent() << "Ok(())" << endl; + f_gen_ << indent() << "Ok(())" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } } else { string branch_statement = rendered_branch_count == 0 ? "if" : "} else if"; f_gen_ << indent() << branch_statement << " self." << SERVICE_RESULT_VARIABLE << ".is_some() {" - << endl; + << '\n'; indent_up(); - f_gen_ << indent() << "Ok(self." << SERVICE_RESULT_VARIABLE << ".unwrap())" << endl; + f_gen_ << indent() << "Ok(self." << SERVICE_RESULT_VARIABLE << ".unwrap())" << '\n'; indent_down(); - f_gen_ << indent() << "} else {" << endl; + f_gen_ << indent() << "} else {" << '\n'; indent_up(); // if we haven't found a valid return value *or* a user exception // then we're in trouble; return a default error render_thrift_error("Application", "ApplicationError", "ApplicationErrorKind::MissingResult", "\"no result received for " + service_call_name + "\""); indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } void t_rs_generator::render_union(t_struct* tstruct) { @@ -1343,32 +1342,32 @@ void t_rs_generator::render_union_definition(const string& union_name, t_struct* throw "cannot generate rust enum with 0 members"; // may be valid thrift, but it's invalid rust } - f_gen_ << "#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]" << endl; - f_gen_ << "pub enum " << union_name << " {" << endl; + f_gen_ << "#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]" << '\n'; + f_gen_ << "pub enum " << union_name << " {" << '\n'; indent_up(); vector::const_iterator member_iter; for (member_iter = members.begin(); member_iter != members.end(); ++member_iter) { t_field* tfield = (*member_iter); f_gen_ << indent() << rust_union_field_name(tfield) << "(" << to_rust_type(tfield->get_type()) - << ")," << endl; + << ")," << '\n'; } indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_union_impl(const string& union_name, t_struct* tstruct) { - f_gen_ << "impl TSerializable for " << union_name << " {" << endl; + f_gen_ << "impl TSerializable for " << union_name << " {" << '\n'; indent_up(); render_union_sync_read(union_name, tstruct); render_union_sync_write(union_name, tstruct); indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; } //----------------------------------------------------------------------------- @@ -1382,14 +1381,14 @@ void t_rs_generator::render_struct_sync_write(t_struct* tstruct, f_gen_ << indent() << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {" - << endl; + << '\n'; indent_up(); // write struct header to output protocol // note: use the *original* struct name here f_gen_ << indent() - << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << endl; - f_gen_ << indent() << "o_prot.write_struct_begin(&struct_ident)?;" << endl; + << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << '\n'; + f_gen_ << indent() << "o_prot.write_struct_begin(&struct_ident)?;" << '\n'; // write struct members to output protocol vector members = tstruct->get_sorted_members(); @@ -1404,30 +1403,30 @@ void t_rs_generator::render_struct_sync_write(t_struct* tstruct, } // write struct footer to output protocol - f_gen_ << indent() << "o_prot.write_field_stop()?;" << endl; - f_gen_ << indent() << "o_prot.write_struct_end()" << endl; + f_gen_ << indent() << "o_prot.write_field_stop()?;" << '\n'; + f_gen_ << indent() << "o_prot.write_struct_end()" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } void t_rs_generator::render_union_sync_write(const string& union_name, t_struct* tstruct) { f_gen_ << indent() << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {" - << endl; + << '\n'; indent_up(); // write struct header to output protocol // note: use the *original* struct name here f_gen_ << indent() - << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << endl; - f_gen_ << indent() << "o_prot.write_struct_begin(&struct_ident)?;" << endl; + << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << '\n'; + f_gen_ << indent() << "o_prot.write_struct_begin(&struct_ident)?;" << '\n'; // write the enum field to the output protocol vector members = tstruct->get_sorted_members(); if (!members.empty()) { - f_gen_ << indent() << "match *self {" << endl; + f_gen_ << indent() << "match *self {" << '\n'; indent_up(); vector::iterator members_iter; for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) { @@ -1440,22 +1439,22 @@ void t_rs_generator::render_union_sync_write(const string& union_name, t_struct* } string match_var((ttype->is_base_type() && !ttype->is_string()) ? "f" : "ref f"); f_gen_ << indent() << union_name << "::" << rust_union_field_name(member) << "(" << match_var - << ") => {" << endl; + << ") => {" << '\n'; indent_up(); render_struct_field_sync_write("f", true, member, member_req); indent_down(); - f_gen_ << indent() << "}," << endl; + f_gen_ << indent() << "}," << '\n'; } indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } // write struct footer to output protocol - f_gen_ << indent() << "o_prot.write_field_stop()?;" << endl; - f_gen_ << indent() << "o_prot.write_struct_end()" << endl; + f_gen_ << indent() << "o_prot.write_field_stop()?;" << '\n'; + f_gen_ << indent() << "o_prot.write_struct_end()" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } void t_rs_generator::render_struct_field_sync_write(const string& field_var, @@ -1475,23 +1474,23 @@ void t_rs_generator::render_struct_field_sync_write(const string& field_var, if (is_optional(req)) { string let_var((actual_type->is_base_type() && !actual_type->is_string()) ? "fld_var" : "ref fld_var"); - f_gen_ << indent() << "if let Some(" << let_var << ") = " << field_var << " {" << endl; + f_gen_ << indent() << "if let Some(" << let_var << ") = " << field_var << " {" << '\n'; indent_up(); - f_gen_ << indent() << "o_prot.write_field_begin(&" << field_ident_string << ")?;" << endl; + f_gen_ << indent() << "o_prot.write_field_begin(&" << field_ident_string << ")?;" << '\n'; render_type_sync_write("fld_var", true, field_type); - f_gen_ << indent() << "o_prot.write_field_end()?" << endl; + f_gen_ << indent() << "o_prot.write_field_end()?" << '\n'; indent_down(); /* FIXME: rethink how I deal with OPT_IN_REQ_OUT if (req == t_field::T_OPT_IN_REQ_OUT) { - f_gen_ << indent() << "let field_ident = " << field_ident_string << ";" << endl; - f_gen_ << indent() << "o_prot.write_field_begin(&field_ident)?;" << endl; - f_gen_ << indent() << "o_prot.write_field_end()?;" << endl; + f_gen_ << indent() << "let field_ident = " << field_ident_string << ";" << '\n'; + f_gen_ << indent() << "o_prot.write_field_begin(&field_ident)?;" << '\n'; + f_gen_ << indent() << "o_prot.write_field_end()?;" << '\n'; }*/ - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } else { - f_gen_ << indent() << "o_prot.write_field_begin(&" << field_ident_string << ")?;" << endl; + f_gen_ << indent() << "o_prot.write_field_begin(&" << field_ident_string << ")?;" << '\n'; render_type_sync_write(field_var, field_var_is_ref, tfield->get_type()); - f_gen_ << indent() << "o_prot.write_field_end()?;" << endl; + f_gen_ << indent() << "o_prot.write_field_end()?;" << '\n'; } } @@ -1506,32 +1505,32 @@ void t_rs_generator::render_type_sync_write(const string& type_var, case t_base_type::TYPE_STRING: { string ref(type_var_is_ref ? "" : "&"); if (tbase_type->is_binary()) { - f_gen_ << indent() << "o_prot.write_bytes(" + ref + type_var + ")?;" << endl; + f_gen_ << indent() << "o_prot.write_bytes(" + ref + type_var + ")?;" << '\n'; } else { - f_gen_ << indent() << "o_prot.write_string(" + ref + type_var + ")?;" << endl; + f_gen_ << indent() << "o_prot.write_string(" + ref + type_var + ")?;" << '\n'; } return; } case t_base_type::TYPE_UUID: - f_gen_ << indent() << "o_prot.write_uuid(&" + type_var + ")?;" << endl; + f_gen_ << indent() << "o_prot.write_uuid(&" + type_var + ")?;" << '\n'; return; case t_base_type::TYPE_BOOL: - f_gen_ << indent() << "o_prot.write_bool(" + type_var + ")?;" << endl; + f_gen_ << indent() << "o_prot.write_bool(" + type_var + ")?;" << '\n'; return; case t_base_type::TYPE_I8: - f_gen_ << indent() << "o_prot.write_i8(" + type_var + ")?;" << endl; + f_gen_ << indent() << "o_prot.write_i8(" + type_var + ")?;" << '\n'; return; case t_base_type::TYPE_I16: - f_gen_ << indent() << "o_prot.write_i16(" + type_var + ")?;" << endl; + f_gen_ << indent() << "o_prot.write_i16(" + type_var + ")?;" << '\n'; return; case t_base_type::TYPE_I32: - f_gen_ << indent() << "o_prot.write_i32(" + type_var + ")?;" << endl; + f_gen_ << indent() << "o_prot.write_i32(" + type_var + ")?;" << '\n'; return; case t_base_type::TYPE_I64: - f_gen_ << indent() << "o_prot.write_i64(" + type_var + ")?;" << endl; + f_gen_ << indent() << "o_prot.write_i64(" + type_var + ")?;" << '\n'; return; case t_base_type::TYPE_DOUBLE: - f_gen_ << indent() << "o_prot.write_double(" + type_var + ".into())?;" << endl; + f_gen_ << indent() << "o_prot.write_double(" + type_var + ".into())?;" << '\n'; return; default: throw "compiler error: unhandled type"; @@ -1541,7 +1540,7 @@ void t_rs_generator::render_type_sync_write(const string& type_var, render_type_sync_write(type_var, type_var_is_ref, ttypedef->get_type()); return; } else if (ttype->is_enum() || ttype->is_struct() || ttype->is_xception()) { - f_gen_ << indent() << type_var + ".write_to_out_protocol(o_prot)?;" << endl; + f_gen_ << indent() << type_var + ".write_to_out_protocol(o_prot)?;" << '\n'; return; } else if (ttype->is_map()) { render_map_sync_write(type_var, type_var_is_ref, (t_map*)ttype); @@ -1566,15 +1565,15 @@ void t_rs_generator::render_list_sync_write(const string& list_var, << "&TListIdentifier::new(" << to_rust_field_type_enum(elem_type) << ", " << list_var << ".len() as i32" << ")" - << ")?;" << endl; + << ")?;" << '\n'; string ref(list_var_is_ref ? "" : "&"); - f_gen_ << indent() << "for e in " << ref << list_var << " {" << endl; + f_gen_ << indent() << "for e in " << ref << list_var << " {" << '\n'; indent_up(); render_type_sync_write(string_container_write_variable(elem_type, "e"), true, elem_type); indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << indent() << "o_prot.write_list_end()?;" << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << indent() << "o_prot.write_list_end()?;" << '\n'; } void t_rs_generator::render_set_sync_write(const string& set_var, @@ -1586,15 +1585,15 @@ void t_rs_generator::render_set_sync_write(const string& set_var, << "&TSetIdentifier::new(" << to_rust_field_type_enum(elem_type) << ", " << set_var << ".len() as i32" << ")" - << ")?;" << endl; + << ")?;" << '\n'; string ref(set_var_is_ref ? "" : "&"); - f_gen_ << indent() << "for e in " << ref << set_var << " {" << endl; + f_gen_ << indent() << "for e in " << ref << set_var << " {" << '\n'; indent_up(); render_type_sync_write(string_container_write_variable(elem_type, "e"), true, elem_type); indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << indent() << "o_prot.write_set_end()?;" << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << indent() << "o_prot.write_set_end()?;" << '\n'; } void t_rs_generator::render_map_sync_write(const string& map_var, @@ -1606,16 +1605,16 @@ void t_rs_generator::render_map_sync_write(const string& map_var, f_gen_ << indent() << "o_prot.write_map_begin(" << "&TMapIdentifier::new(" << to_rust_field_type_enum(key_type) << ", " << to_rust_field_type_enum(val_type) << ", " << map_var << ".len() as i32)" - << ")?;" << endl; + << ")?;" << '\n'; string ref(map_var_is_ref ? "" : "&"); - f_gen_ << indent() << "for (k, v) in " << ref << map_var << " {" << endl; + f_gen_ << indent() << "for (k, v) in " << ref << map_var << " {" << '\n'; indent_up(); render_type_sync_write(string_container_write_variable(key_type, "k"), true, key_type); render_type_sync_write(string_container_write_variable(val_type, "v"), true, val_type); indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << indent() << "o_prot.write_map_end()?;" << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << indent() << "o_prot.write_map_end()?;" << '\n'; } string t_rs_generator::string_container_write_variable(t_type* ttype, const string& base_var) { @@ -1651,11 +1650,11 @@ void t_rs_generator::render_struct_sync_read(const string& struct_name, t_rs_generator::e_struct_type struct_type) { f_gen_ << indent() << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<" - << struct_name << "> {" << endl; + << struct_name << "> {" << '\n'; indent_up(); - f_gen_ << indent() << "i_prot.read_struct_begin()?;" << endl; + f_gen_ << indent() << "i_prot.read_struct_begin()?;" << '\n'; // create temporary variables: one for each field in the struct const vector members = tstruct->get_sorted_members(); @@ -1671,55 +1670,55 @@ void t_rs_generator::render_struct_sync_read(const string& struct_name, } else { f_gen_ << "None;"; } - f_gen_ << endl; + f_gen_ << '\n'; } // now loop through the fields we've received - f_gen_ << indent() << "loop {" << endl; // start loop + f_gen_ << indent() << "loop {" << '\n'; // start loop indent_up(); // break out if you've found the Stop field - f_gen_ << indent() << "let field_ident = i_prot.read_field_begin()?;" << endl; - f_gen_ << indent() << "if field_ident.field_type == TType::Stop {" << endl; + f_gen_ << indent() << "let field_ident = i_prot.read_field_begin()?;" << '\n'; + f_gen_ << indent() << "if field_ident.field_type == TType::Stop {" << '\n'; indent_up(); - f_gen_ << indent() << "break;" << endl; + f_gen_ << indent() << "break;" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; // now read all the fields found // avoid clippy::match_single_binding if (members.empty()) { - f_gen_ << indent() << "i_prot.skip(field_ident.field_type)?;" << endl; + f_gen_ << indent() << "i_prot.skip(field_ident.field_type)?;" << '\n'; } else { - f_gen_ << indent() << "let field_id = field_id(&field_ident)?;" << endl; - f_gen_ << indent() << "match field_id {" << endl; // start match + f_gen_ << indent() << "let field_id = field_id(&field_ident)?;" << '\n'; + f_gen_ << indent() << "match field_id {" << '\n'; // start match indent_up(); for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) { t_field* tfield = (*members_iter); - f_gen_ << indent() << rust_safe_field_id(tfield->get_key()) << " => {" << endl; + f_gen_ << indent() << rust_safe_field_id(tfield->get_key()) << " => {" << '\n'; indent_up(); render_type_sync_read("val", tfield->get_type()); - f_gen_ << indent() << struct_field_read_temp_variable(tfield) << " = Some(val);" << endl; + f_gen_ << indent() << struct_field_read_temp_variable(tfield) << " = Some(val);" << '\n'; indent_down(); - f_gen_ << indent() << "}," << endl; + f_gen_ << indent() << "}," << '\n'; } // default case (skip fields) - f_gen_ << indent() << "_ => {" << endl; + f_gen_ << indent() << "_ => {" << '\n'; indent_up(); - f_gen_ << indent() << "i_prot.skip(field_ident.field_type)?;" << endl; + f_gen_ << indent() << "i_prot.skip(field_ident.field_type)?;" << '\n'; indent_down(); - f_gen_ << indent() << "}," << endl; + f_gen_ << indent() << "}," << '\n'; indent_down(); - f_gen_ << indent() << "};" << endl; // finish match + f_gen_ << indent() << "};" << '\n'; // finish match } - f_gen_ << indent() << "i_prot.read_field_end()?;" << endl; + f_gen_ << indent() << "i_prot.read_field_end()?;" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; // finish loop - f_gen_ << indent() << "i_prot.read_struct_end()?;" << endl; // read message footer from the wire + f_gen_ << indent() << "}" << '\n'; // finish loop + f_gen_ << indent() << "i_prot.read_struct_end()?;" << '\n'; // read message footer from the wire // verify that all required fields exist for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) { @@ -1729,15 +1728,15 @@ void t_rs_generator::render_struct_sync_read(const string& struct_name, f_gen_ << indent() << "verify_required_field_exists(" << "\"" << struct_name << "." << rust_field_name(tfield) << "\"" << ", " - << "&" << struct_field_read_temp_variable(tfield) << ")?;" << endl; + << "&" << struct_field_read_temp_variable(tfield) << ")?;" << '\n'; } } // construct the struct if (members.size() == 0) { - f_gen_ << indent() << "let ret = " << struct_name << " {};" << endl; + f_gen_ << indent() << "let ret = " << struct_name << " {};" << '\n'; } else { - f_gen_ << indent() << "let ret = " << struct_name << " {" << endl; + f_gen_ << indent() << "let ret = " << struct_name << " {" << '\n'; indent_up(); for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) { @@ -1746,109 +1745,109 @@ void t_rs_generator::render_struct_sync_read(const string& struct_name, string field_name(rust_field_name(tfield)); string field_key = struct_field_read_temp_variable(tfield); if (is_optional(req)) { - f_gen_ << indent() << field_name << ": " << field_key << "," << endl; + f_gen_ << indent() << field_name << ": " << field_key << "," << '\n'; } else { f_gen_ << indent() << field_name << ": " << field_key << ".expect(\"auto-generated code should have checked for presence of required " "fields\")" - << "," << endl; + << "," << '\n'; } } indent_down(); - f_gen_ << indent() << "};" << endl; + f_gen_ << indent() << "};" << '\n'; } // return the constructed value - f_gen_ << indent() << "Ok(ret)" << endl; + f_gen_ << indent() << "Ok(ret)" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } void t_rs_generator::render_union_sync_read(const string& union_name, t_struct* tstruct) { f_gen_ << indent() << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<" - << union_name << "> {" << endl; + << union_name << "> {" << '\n'; indent_up(); // create temporary variables to hold the // completed union as well as a count of fields read - f_gen_ << indent() << "let mut ret: Option<" << union_name << "> = None;" << endl; - f_gen_ << indent() << "let mut received_field_count = 0;" << endl; + f_gen_ << indent() << "let mut ret: Option<" << union_name << "> = None;" << '\n'; + f_gen_ << indent() << "let mut received_field_count = 0;" << '\n'; // read the struct preamble - f_gen_ << indent() << "i_prot.read_struct_begin()?;" << endl; + f_gen_ << indent() << "i_prot.read_struct_begin()?;" << '\n'; // now loop through the fields we've received - f_gen_ << indent() << "loop {" << endl; // start loop + f_gen_ << indent() << "loop {" << '\n'; // start loop indent_up(); // break out if you've found the Stop field - f_gen_ << indent() << "let field_ident = i_prot.read_field_begin()?;" << endl; - f_gen_ << indent() << "if field_ident.field_type == TType::Stop {" << endl; + f_gen_ << indent() << "let field_ident = i_prot.read_field_begin()?;" << '\n'; + f_gen_ << indent() << "if field_ident.field_type == TType::Stop {" << '\n'; indent_up(); - f_gen_ << indent() << "break;" << endl; + f_gen_ << indent() << "break;" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; // now read all the fields found - f_gen_ << indent() << "let field_id = field_id(&field_ident)?;" << endl; - f_gen_ << indent() << "match field_id {" << endl; // start match + f_gen_ << indent() << "let field_id = field_id(&field_ident)?;" << '\n'; + f_gen_ << indent() << "match field_id {" << '\n'; // start match indent_up(); const vector members = tstruct->get_sorted_members(); vector::const_iterator members_iter; for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) { t_field* member = (*members_iter); - f_gen_ << indent() << rust_safe_field_id(member->get_key()) << " => {" << endl; + f_gen_ << indent() << rust_safe_field_id(member->get_key()) << " => {" << '\n'; indent_up(); render_type_sync_read("val", member->get_type()); - f_gen_ << indent() << "if ret.is_none() {" << endl; + f_gen_ << indent() << "if ret.is_none() {" << '\n'; indent_up(); f_gen_ << indent() << "ret = Some(" << union_name << "::" << rust_union_field_name(member) - << "(val));" << endl; + << "(val));" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << indent() << "received_field_count += 1;" << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << indent() << "received_field_count += 1;" << '\n'; indent_down(); - f_gen_ << indent() << "}," << endl; + f_gen_ << indent() << "}," << '\n'; } // default case (skip fields) - f_gen_ << indent() << "_ => {" << endl; + f_gen_ << indent() << "_ => {" << '\n'; indent_up(); - f_gen_ << indent() << "i_prot.skip(field_ident.field_type)?;" << endl; - f_gen_ << indent() << "received_field_count += 1;" << endl; + f_gen_ << indent() << "i_prot.skip(field_ident.field_type)?;" << '\n'; + f_gen_ << indent() << "received_field_count += 1;" << '\n'; indent_down(); - f_gen_ << indent() << "}," << endl; + f_gen_ << indent() << "}," << '\n'; indent_down(); - f_gen_ << indent() << "};" << endl; // finish match - f_gen_ << indent() << "i_prot.read_field_end()?;" << endl; + f_gen_ << indent() << "};" << '\n'; // finish match + f_gen_ << indent() << "i_prot.read_field_end()?;" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; // finish loop - f_gen_ << indent() << "i_prot.read_struct_end()?;" << endl; // finish reading message from wire + f_gen_ << indent() << "}" << '\n'; // finish loop + f_gen_ << indent() << "i_prot.read_struct_end()?;" << '\n'; // finish reading message from wire // return the value or an error - f_gen_ << indent() << "if received_field_count == 0 {" << endl; + f_gen_ << indent() << "if received_field_count == 0 {" << '\n'; indent_up(); render_thrift_error("Protocol", "ProtocolError", "ProtocolErrorKind::InvalidData", "\"received empty union from remote " + union_name + "\""); indent_down(); - f_gen_ << indent() << "} else if received_field_count > 1 {" << endl; + f_gen_ << indent() << "} else if received_field_count > 1 {" << '\n'; indent_up(); render_thrift_error("Protocol", "ProtocolError", "ProtocolErrorKind::InvalidData", "\"received multiple fields for union from remote " + union_name + "\""); indent_down(); - f_gen_ << indent() << "} else {" << endl; + f_gen_ << indent() << "} else {" << '\n'; indent_up(); - f_gen_ << indent() << "Ok(ret.expect(\"return value should have been constructed\"))" << endl; + f_gen_ << indent() << "Ok(ret.expect(\"return value should have been constructed\"))" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } // Construct the rust representation of all supported types from the wire. @@ -1860,32 +1859,32 @@ void t_rs_generator::render_type_sync_read(const string& type_var, t_type* ttype throw "cannot read field of type TYPE_VOID from input protocol"; case t_base_type::TYPE_STRING: if (tbase_type->is_binary()) { - f_gen_ << indent() << "let " << type_var << " = i_prot.read_bytes()?;" << endl; + f_gen_ << indent() << "let " << type_var << " = i_prot.read_bytes()?;" << '\n'; } else { - f_gen_ << indent() << "let " << type_var << " = i_prot.read_string()?;" << endl; + f_gen_ << indent() << "let " << type_var << " = i_prot.read_string()?;" << '\n'; } return; case t_base_type::TYPE_UUID: - f_gen_ << indent() << "let " << type_var << " = i_prot.read_uuid()?;" << endl; + f_gen_ << indent() << "let " << type_var << " = i_prot.read_uuid()?;" << '\n'; return; case t_base_type::TYPE_BOOL: - f_gen_ << indent() << "let " << type_var << " = i_prot.read_bool()?;" << endl; + f_gen_ << indent() << "let " << type_var << " = i_prot.read_bool()?;" << '\n'; return; case t_base_type::TYPE_I8: - f_gen_ << indent() << "let " << type_var << " = i_prot.read_i8()?;" << endl; + f_gen_ << indent() << "let " << type_var << " = i_prot.read_i8()?;" << '\n'; return; case t_base_type::TYPE_I16: - f_gen_ << indent() << "let " << type_var << " = i_prot.read_i16()?;" << endl; + f_gen_ << indent() << "let " << type_var << " = i_prot.read_i16()?;" << '\n'; return; case t_base_type::TYPE_I32: - f_gen_ << indent() << "let " << type_var << " = i_prot.read_i32()?;" << endl; + f_gen_ << indent() << "let " << type_var << " = i_prot.read_i32()?;" << '\n'; return; case t_base_type::TYPE_I64: - f_gen_ << indent() << "let " << type_var << " = i_prot.read_i64()?;" << endl; + f_gen_ << indent() << "let " << type_var << " = i_prot.read_i64()?;" << '\n'; return; case t_base_type::TYPE_DOUBLE: f_gen_ << indent() << "let " << type_var << " = OrderedFloat::from(i_prot.read_double()?);" - << endl; + << '\n'; return; default: throw "compiler error: unhandled type"; @@ -1905,7 +1904,7 @@ void t_rs_generator::render_type_sync_read(const string& type_var, t_type* ttype } else if (ttype->is_enum() || ttype->is_struct() || ttype->is_xception()) { string read_call(to_rust_type(ttype) + "::read_from_in_protocol(i_prot)?"); read_call = is_boxed ? "Box::new(" + read_call + ")" : read_call; - f_gen_ << indent() << "let " << type_var << " = " << read_call << ";" << endl; + f_gen_ << indent() << "let " << type_var << " = " << read_call << ";" << '\n'; return; } else if (ttype->is_map()) { render_map_sync_read((t_map*)ttype, type_var); @@ -1925,42 +1924,42 @@ void t_rs_generator::render_type_sync_read(const string& type_var, t_type* ttype void t_rs_generator::render_list_sync_read(t_list* tlist, const string& list_var) { t_type* elem_type = tlist->get_elem_type(); - f_gen_ << indent() << "let list_ident = i_prot.read_list_begin()?;" << endl; + f_gen_ << indent() << "let list_ident = i_prot.read_list_begin()?;" << '\n'; f_gen_ << indent() << "let mut " << list_var << ": " << to_rust_type((t_type*)tlist) - << " = Vec::with_capacity(list_ident.size as usize);" << endl; - f_gen_ << indent() << "for _ in 0..list_ident.size {" << endl; + << " = Vec::with_capacity(list_ident.size as usize);" << '\n'; + f_gen_ << indent() << "for _ in 0..list_ident.size {" << '\n'; indent_up(); string list_elem_var = tmp("list_elem_"); render_type_sync_read(list_elem_var, elem_type); - f_gen_ << indent() << list_var << ".push(" << list_elem_var << ");" << endl; + f_gen_ << indent() << list_var << ".push(" << list_elem_var << ");" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << indent() << "i_prot.read_list_end()?;" << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << indent() << "i_prot.read_list_end()?;" << '\n'; } // Construct the rust representation of a set from the wire. void t_rs_generator::render_set_sync_read(t_set* tset, const string& set_var) { t_type* elem_type = tset->get_elem_type(); - f_gen_ << indent() << "let set_ident = i_prot.read_set_begin()?;" << endl; + f_gen_ << indent() << "let set_ident = i_prot.read_set_begin()?;" << '\n'; f_gen_ << indent() << "let mut " << set_var << ": " << to_rust_type((t_type*)tset) - << " = BTreeSet::new();" << endl; - f_gen_ << indent() << "for _ in 0..set_ident.size {" << endl; + << " = BTreeSet::new();" << '\n'; + f_gen_ << indent() << "for _ in 0..set_ident.size {" << '\n'; indent_up(); string set_elem_var = tmp("set_elem_"); render_type_sync_read(set_elem_var, elem_type); - f_gen_ << indent() << set_var << ".insert(" << set_elem_var << ");" << endl; + f_gen_ << indent() << set_var << ".insert(" << set_elem_var << ");" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << indent() << "i_prot.read_set_end()?;" << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << indent() << "i_prot.read_set_end()?;" << '\n'; } // Construct the rust representation of a map from the wire. @@ -1968,10 +1967,10 @@ void t_rs_generator::render_map_sync_read(t_map* tmap, const string& map_var) { t_type* key_type = tmap->get_key_type(); t_type* val_type = tmap->get_val_type(); - f_gen_ << indent() << "let map_ident = i_prot.read_map_begin()?;" << endl; + f_gen_ << indent() << "let map_ident = i_prot.read_map_begin()?;" << '\n'; f_gen_ << indent() << "let mut " << map_var << ": " << to_rust_type((t_type*)tmap) - << " = BTreeMap::new();" << endl; - f_gen_ << indent() << "for _ in 0..map_ident.size {" << endl; + << " = BTreeMap::new();" << '\n'; + f_gen_ << indent() << "for _ in 0..map_ident.size {" << '\n'; indent_up(); @@ -1980,12 +1979,12 @@ void t_rs_generator::render_map_sync_read(t_map* tmap, const string& map_var) { string val_elem_var = tmp("map_val_"); render_type_sync_read(val_elem_var, val_type); f_gen_ << indent() << map_var << ".insert(" << key_elem_var << ", " << val_elem_var << ");" - << endl; + << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << indent() << "i_prot.read_map_end()?;" << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << indent() << "i_prot.read_map_end()?;" << '\n'; } string t_rs_generator::struct_field_read_temp_variable(t_field* tfield) { @@ -2036,7 +2035,7 @@ void t_rs_generator::render_sync_client(t_service* tservice) { render_sync_client_definition_and_impl(client_impl_name); render_sync_client_tthriftclient_impl(client_impl_name); render_sync_client_marker_trait_impls(tservice, client_impl_name); - f_gen_ << endl; + f_gen_ << '\n'; render_sync_client_process_impl(tservice); } @@ -2048,7 +2047,7 @@ void t_rs_generator::render_sync_client_trait(t_service* tservice) { } render_rustdoc((t_doc*)tservice); - f_gen_ << "pub trait " << rust_sync_client_trait_name(tservice) << extension << " {" << endl; + f_gen_ << "pub trait " << rust_sync_client_trait_name(tservice) << extension << " {" << '\n'; indent_up(); const std::vector functions = tservice->get_functions(); @@ -2060,25 +2059,25 @@ void t_rs_generator::render_sync_client_trait(t_service* tservice) { string func_return = to_rust_type(tfunc->get_returntype()); render_rustdoc((t_doc*)tfunc); f_gen_ << indent() << "fn " << func_name << func_args << " -> thrift::Result<" << func_return - << ">;" << endl; + << ">;" << '\n'; } indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_sync_client_marker_trait(t_service* tservice) { f_gen_ << indent() << "pub trait " << rust_sync_client_marker_trait_name(tservice) << " {}" - << endl; - f_gen_ << endl; + << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_sync_client_marker_trait_impls(t_service* tservice, const string& impl_struct_name) { f_gen_ << indent() << "impl " << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << rust_namespace(tservice) << rust_sync_client_marker_trait_name(tservice) << " for " << impl_struct_name - << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS << " {}" << endl; + << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS << " {}" << '\n'; t_service* extends = tservice->get_extends(); if (extends) { @@ -2090,64 +2089,64 @@ void t_rs_generator::render_sync_client_definition_and_impl(const string& client // render the definition for the client struct f_gen_ << "pub struct " << client_impl_name << SYNC_CLIENT_GENERIC_BOUND_VARS << " " - << SYNC_CLIENT_GENERIC_BOUNDS << " {" << endl; + << SYNC_CLIENT_GENERIC_BOUNDS << " {" << '\n'; indent_up(); - f_gen_ << indent() << "_i_prot: IP," << endl; - f_gen_ << indent() << "_o_prot: OP," << endl; - f_gen_ << indent() << "_sequence_number: i32," << endl; + f_gen_ << indent() << "_i_prot: IP," << '\n'; + f_gen_ << indent() << "_o_prot: OP," << '\n'; + f_gen_ << indent() << "_sequence_number: i32," << '\n'; indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; // render the struct implementation // this includes the new() function as well as the helper send/recv methods for each service call f_gen_ << "impl " << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << client_impl_name - << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS << " {" << endl; + << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS << " {" << '\n'; indent_up(); render_sync_client_lifecycle_functions(client_impl_name); indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_sync_client_lifecycle_functions(const string& client_struct) { f_gen_ << indent() << "pub fn new(input_protocol: IP, output_protocol: OP) -> " << client_struct - << SYNC_CLIENT_GENERIC_BOUND_VARS << " {" << endl; + << SYNC_CLIENT_GENERIC_BOUND_VARS << " {" << '\n'; indent_up(); f_gen_ << indent() << client_struct - << " { _i_prot: input_protocol, _o_prot: output_protocol, _sequence_number: 0 }" << endl; + << " { _i_prot: input_protocol, _o_prot: output_protocol, _sequence_number: 0 }" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } void t_rs_generator::render_sync_client_tthriftclient_impl(const string& client_impl_name) { f_gen_ << indent() << "impl " << SYNC_CLIENT_GENERIC_BOUND_VARS << " TThriftClient for " << client_impl_name << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS - << " {" << endl; + << " {" << '\n'; indent_up(); f_gen_ << indent() << "fn i_prot_mut(&mut self) -> &mut dyn TInputProtocol { &mut self._i_prot }" - << endl; + << '\n'; f_gen_ << indent() << "fn o_prot_mut(&mut self) -> &mut dyn TOutputProtocol { &mut self._o_prot }" - << endl; - f_gen_ << indent() << "fn sequence_number(&self) -> i32 { self._sequence_number }" << endl; + << '\n'; + f_gen_ << indent() << "fn sequence_number(&self) -> i32 { self._sequence_number }" << '\n'; f_gen_ << indent() << "fn increment_sequence_number(&mut self) -> i32 { self._sequence_number += 1; " "self._sequence_number }" - << endl; + << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_sync_client_process_impl(t_service* tservice) { string marker_extension = "" + sync_client_marker_traits_for_extension(tservice); f_gen_ << "impl " << rust_sync_client_trait_name(tservice) << " for C {" << endl; + << marker_extension << "> " << rust_sync_client_trait_name(tservice) << " for C {" << '\n'; indent_up(); const std::vector functions = tservice->get_functions(); @@ -2158,8 +2157,8 @@ void t_rs_generator::render_sync_client_process_impl(t_service* tservice) { } indent_down(); - f_gen_ << "}" << endl; - f_gen_ << endl; + f_gen_ << "}" << '\n'; + f_gen_ << '\n'; } string t_rs_generator::sync_client_marker_traits_for_extension(t_service* tservice) { @@ -2182,35 +2181,35 @@ void t_rs_generator::render_sync_send_recv_wrapper(t_function* tfunc) { string func_return = to_rust_type(tfunc->get_returntype()); f_gen_ << indent() << "fn " << func_name << func_decl_args << " -> thrift::Result<" << func_return - << "> {" << endl; + << "> {" << '\n'; indent_up(); - f_gen_ << indent() << "(" << endl; + f_gen_ << indent() << "(" << '\n'; indent_up(); render_sync_send(tfunc); indent_down(); - f_gen_ << indent() << ")?;" << endl; + f_gen_ << indent() << ")?;" << '\n'; if (tfunc->is_oneway()) { - f_gen_ << indent() << "Ok(())" << endl; + f_gen_ << indent() << "Ok(())" << '\n'; } else { render_sync_recv(tfunc); } indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } void t_rs_generator::render_sync_send(t_function* tfunc) { - f_gen_ << indent() << "{" << endl; + f_gen_ << indent() << "{" << '\n'; indent_up(); // increment the sequence number and generate the call header string message_type = tfunc->is_oneway() ? "TMessageType::OneWay" : "TMessageType::Call"; - f_gen_ << indent() << "self.increment_sequence_number();" << endl; + f_gen_ << indent() << "self.increment_sequence_number();" << '\n'; f_gen_ << indent() << "let message_ident = " << "TMessageIdentifier::new(\"" << tfunc->get_name() << "\", " // note: use *original* name << message_type << ", " - << "self.sequence_number());" << endl; + << "self.sequence_number());" << '\n'; // pack the arguments into the containing struct that we'll write out over the wire // note that this struct is generated even if we have 0 args ostringstream struct_definition; @@ -2226,50 +2225,50 @@ void t_rs_generator::render_sync_send(t_function* tfunc) { struct_fields = struct_fields.substr(0, struct_fields.size() - 2); // strip trailing comma } f_gen_ << indent() << "let call_args = " << service_call_args_struct_name(tfunc) << " { " - << struct_fields << " };" << endl; + << struct_fields << " };" << '\n'; // write everything over the wire - f_gen_ << indent() << "self.o_prot_mut().write_message_begin(&message_ident)?;" << endl; + f_gen_ << indent() << "self.o_prot_mut().write_message_begin(&message_ident)?;" << '\n'; f_gen_ << indent() << "call_args.write_to_out_protocol(self.o_prot_mut())?;" - << endl; // written even if we have 0 args - f_gen_ << indent() << "self.o_prot_mut().write_message_end()?;" << endl; - f_gen_ << indent() << "self.o_prot_mut().flush()" << endl; + << '\n'; // written even if we have 0 args + f_gen_ << indent() << "self.o_prot_mut().write_message_end()?;" << '\n'; + f_gen_ << indent() << "self.o_prot_mut().flush()" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } void t_rs_generator::render_sync_recv(t_function* tfunc) { - f_gen_ << indent() << "{" << endl; + f_gen_ << indent() << "{" << '\n'; indent_up(); - f_gen_ << indent() << "let message_ident = self.i_prot_mut().read_message_begin()?;" << endl; + f_gen_ << indent() << "let message_ident = self.i_prot_mut().read_message_begin()?;" << '\n'; f_gen_ << indent() << "verify_expected_sequence_number(self.sequence_number(), message_ident.sequence_number)?;" - << endl; + << '\n'; f_gen_ << indent() << "verify_expected_service_call(\"" << tfunc->get_name() - << "\", &message_ident.name)?;" << endl; // note: use *original* name + << "\", &message_ident.name)?;" << '\n'; // note: use *original* name // FIXME: replace with a "try" block - f_gen_ << indent() << "if message_ident.message_type == TMessageType::Exception {" << endl; + f_gen_ << indent() << "if message_ident.message_type == TMessageType::Exception {" << '\n'; indent_up(); f_gen_ << indent() << "let remote_error = " "thrift::Error::read_application_error_from_in_protocol(self.i_prot_mut())?;" - << endl; - f_gen_ << indent() << "self.i_prot_mut().read_message_end()?;" << endl; - f_gen_ << indent() << "return Err(thrift::Error::Application(remote_error))" << endl; + << '\n'; + f_gen_ << indent() << "self.i_prot_mut().read_message_end()?;" << '\n'; + f_gen_ << indent() << "return Err(thrift::Error::Application(remote_error))" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; f_gen_ << indent() << "verify_expected_message_type(TMessageType::Reply, message_ident.message_type)?;" - << endl; + << '\n'; f_gen_ << indent() << "let result = " << service_call_result_struct_name(tfunc) - << "::read_from_in_protocol(self.i_prot_mut())?;" << endl; - f_gen_ << indent() << "self.i_prot_mut().read_message_end()?;" << endl; - f_gen_ << indent() << "result.ok_or()" << endl; + << "::read_from_in_protocol(self.i_prot_mut())?;" << '\n'; + f_gen_ << indent() << "self.i_prot_mut().read_message_end()?;" << '\n'; + f_gen_ << indent() << "result.ok_or()" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } string t_rs_generator::rust_sync_service_call_declaration(t_function* tfunc, bool self_is_mutable) { @@ -2400,7 +2399,7 @@ void t_rs_generator::render_sync_handler_trait(t_service* tservice) { std::vector::const_iterator func_iter; render_rustdoc((t_doc*)tservice); - f_gen_ << "pub trait " << rust_sync_handler_trait_name(tservice) << extension << " {" << endl; + f_gen_ << "pub trait " << rust_sync_handler_trait_name(tservice) << extension << " {" << '\n'; indent_up(); for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) { t_function* tfunc = (*func_iter); @@ -2409,11 +2408,11 @@ void t_rs_generator::render_sync_handler_trait(t_service* tservice) { string func_return = to_rust_type(tfunc->get_returntype()); render_rustdoc((t_doc*)tfunc); f_gen_ << indent() << "fn " << func_name << func_args << " -> thrift::Result<" << func_return - << ">;" << endl; + << ">;" << '\n'; } indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_sync_processor_definition_and_impl(t_service* tservice) { @@ -2422,36 +2421,36 @@ void t_rs_generator::render_sync_processor_definition_and_impl(t_service* tservi // struct f_gen_ << indent() << "pub struct " << service_processor_name << " {" << endl; + << "> {" << '\n'; indent_up(); - f_gen_ << indent() << "handler: H," << endl; + f_gen_ << indent() << "handler: H," << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << '\n'; // delegating impl f_gen_ << indent() << "impl " << service_processor_name - << " {" << endl; + << " {" << '\n'; indent_up(); - f_gen_ << indent() << "pub fn new(handler: H) -> " << service_processor_name << " {" << endl; + f_gen_ << indent() << "pub fn new(handler: H) -> " << service_processor_name << " {" << '\n'; indent_up(); - f_gen_ << indent() << service_processor_name << " {" << endl; + f_gen_ << indent() << service_processor_name << " {" << '\n'; indent_up(); - f_gen_ << indent() << "handler," << endl; + f_gen_ << indent() << "handler," << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; render_sync_process_delegation_functions(tservice); indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << '\n'; // actual impl string service_actual_processor_name = rust_sync_processor_impl_name(tservice); - f_gen_ << indent() << "pub struct " << service_actual_processor_name << ";" << endl; - f_gen_ << endl; - f_gen_ << indent() << "impl " << service_actual_processor_name << " {" << endl; + f_gen_ << indent() << "pub struct " << service_actual_processor_name << ";" << '\n'; + f_gen_ << '\n'; + f_gen_ << indent() << "impl " << service_actual_processor_name << " {" << '\n'; indent_up(); vector functions = tservice->get_functions(); @@ -2462,44 +2461,44 @@ void t_rs_generator::render_sync_processor_definition_and_impl(t_service* tservi } indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << '\n'; // processor impl f_gen_ << indent() << "impl TProcessor for " - << service_processor_name << " {" << endl; + << service_processor_name << " {" << '\n'; indent_up(); f_gen_ << indent() << "fn process(&self, i_prot: &mut dyn TInputProtocol, o_prot: &mut dyn TOutputProtocol) " "-> thrift::Result<()> {" - << endl; + << '\n'; indent_up(); - f_gen_ << indent() << "let message_ident = i_prot.read_message_begin()?;" << endl; + f_gen_ << indent() << "let message_ident = i_prot.read_message_begin()?;" << '\n'; f_gen_ << indent() << "let res = match &*message_ident.name {" - << endl; // [sigh] explicit deref coercion + << '\n'; // [sigh] explicit deref coercion indent_up(); render_process_match_statements(tservice); - f_gen_ << indent() << "method => {" << endl; + f_gen_ << indent() << "method => {" << '\n'; indent_up(); render_thrift_error("Application", "ApplicationError", "ApplicationErrorKind::UnknownMethod", "format!(\"unknown method {}\", method)"); indent_down(); - f_gen_ << indent() << "}," << endl; + f_gen_ << indent() << "}," << '\n'; indent_down(); - f_gen_ << indent() << "};" << endl; + f_gen_ << indent() << "};" << '\n'; f_gen_ << indent() << "thrift::server::handle_process_result(&message_ident, res, o_prot)" - << endl; + << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; - f_gen_ << endl; + f_gen_ << indent() << "}" << '\n'; + f_gen_ << '\n'; } void t_rs_generator::render_sync_process_delegation_functions(t_service* tservice) { @@ -2514,7 +2513,7 @@ void t_rs_generator::render_sync_process_delegation_functions(t_service* tservic << "incoming_sequence_number: i32, " << "i_prot: &mut dyn TInputProtocol, " << "o_prot: &mut dyn TOutputProtocol) " - << "-> thrift::Result<()> {" << endl; + << "-> thrift::Result<()> {" << '\n'; indent_up(); f_gen_ << indent() << actual_processor << "::" << function_name << "(" @@ -2522,10 +2521,10 @@ void t_rs_generator::render_sync_process_delegation_functions(t_service* tservic << "incoming_sequence_number, " << "i_prot, " << "o_prot" - << ")" << endl; + << ")" << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } t_service* extends = tservice->get_extends(); @@ -2540,12 +2539,12 @@ void t_rs_generator::render_process_match_statements(t_service* tservice) { for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) { t_function* tfunc = (*func_iter); f_gen_ << indent() << "\"" << tfunc->get_name() << "\"" - << " => {" << endl; // note: use *original* name + << " => {" << '\n'; // note: use *original* name indent_up(); f_gen_ << indent() << "self.process_" << rust_snake_case(tfunc->get_name()) - << "(message_ident.sequence_number, i_prot, o_prot)" << endl; + << "(message_ident.sequence_number, i_prot, o_prot)" << '\n'; indent_down(); - f_gen_ << indent() << "}," << endl; + f_gen_ << indent() << "}," << '\n'; } t_service* extends = tservice->get_extends(); @@ -2568,90 +2567,90 @@ void t_rs_generator::render_sync_process_function(t_function* tfunc, const strin << "(handler: &H, " << sequence_number_param << ": i32, " << "i_prot: &mut dyn TInputProtocol, " << output_protocol_param << ": &mut dyn TOutputProtocol) " - << "-> thrift::Result<()> {" << endl; + << "-> thrift::Result<()> {" << '\n'; indent_up(); // *always* read arguments from the input protocol f_gen_ << indent() << "let " << (has_non_void_args(tfunc) ? "args" : "_") << " = " - << service_call_args_struct_name(tfunc) << "::read_from_in_protocol(i_prot)?;" << endl; + << service_call_args_struct_name(tfunc) << "::read_from_in_protocol(i_prot)?;" << '\n'; f_gen_ << indent() << "match handler." << service_call_handler_function_name(tfunc) - << rust_sync_service_call_invocation(tfunc, "args.") << " {" << endl; // start match + << rust_sync_service_call_invocation(tfunc, "args.") << " {" << '\n'; // start match indent_up(); // handler succeeded string handler_return_variable = tfunc->is_oneway() || tfunc->get_returntype()->is_void() ? "_" : "handler_return"; - f_gen_ << indent() << "Ok(" << handler_return_variable << ") => {" << endl; + f_gen_ << indent() << "Ok(" << handler_return_variable << ") => {" << '\n'; indent_up(); render_sync_handler_succeeded(tfunc); indent_down(); - f_gen_ << indent() << "}," << endl; + f_gen_ << indent() << "}," << '\n'; // handler failed - f_gen_ << indent() << "Err(e) => {" << endl; + f_gen_ << indent() << "Err(e) => {" << '\n'; indent_up(); render_sync_handler_failed(tfunc); indent_down(); - f_gen_ << indent() << "}," << endl; + f_gen_ << indent() << "}," << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; // end match + f_gen_ << indent() << "}" << '\n'; // end match indent_down(); - f_gen_ << indent() << "}" << endl; // end function + f_gen_ << indent() << "}" << '\n'; // end function } void t_rs_generator::render_sync_handler_succeeded(t_function* tfunc) { if (tfunc->is_oneway()) { - f_gen_ << indent() << "Ok(())" << endl; + f_gen_ << indent() << "Ok(())" << '\n'; } else { f_gen_ << indent() << "let message_ident = TMessageIdentifier::new(" << "\"" << tfunc->get_name() << "\", " // note: use *original* name << "TMessageType::Reply, " - << "incoming_sequence_number);" << endl; - f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << endl; - f_gen_ << indent() << "let ret = " << handler_successful_return_struct(tfunc) << ";" << endl; - f_gen_ << indent() << "ret.write_to_out_protocol(o_prot)?;" << endl; - f_gen_ << indent() << "o_prot.write_message_end()?;" << endl; - f_gen_ << indent() << "o_prot.flush()" << endl; + << "incoming_sequence_number);" << '\n'; + f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << '\n'; + f_gen_ << indent() << "let ret = " << handler_successful_return_struct(tfunc) << ";" << '\n'; + f_gen_ << indent() << "ret.write_to_out_protocol(o_prot)?;" << '\n'; + f_gen_ << indent() << "o_prot.write_message_end()?;" << '\n'; + f_gen_ << indent() << "o_prot.flush()" << '\n'; } } void t_rs_generator::render_sync_handler_failed(t_function* tfunc) { string err_var("e"); - f_gen_ << indent() << "match " << err_var << " {" << endl; + f_gen_ << indent() << "match " << err_var << " {" << '\n'; indent_up(); // if there are any user-defined exceptions for this service call handle them first if (tfunc->get_xceptions() != nullptr && tfunc->get_xceptions()->get_sorted_members().size() > 0) { string user_err_var("usr_err"); - f_gen_ << indent() << "thrift::Error::User(" << user_err_var << ") => {" << endl; + f_gen_ << indent() << "thrift::Error::User(" << user_err_var << ") => {" << '\n'; indent_up(); render_sync_handler_failed_user_exception_branch(tfunc); indent_down(); - f_gen_ << indent() << "}," << endl; + f_gen_ << indent() << "}," << '\n'; } // application error string app_err_var("app_err"); - f_gen_ << indent() << "thrift::Error::Application(" << app_err_var << ") => {" << endl; + f_gen_ << indent() << "thrift::Error::Application(" << app_err_var << ") => {" << '\n'; indent_up(); render_sync_handler_failed_application_exception_branch(tfunc, app_err_var); indent_down(); - f_gen_ << indent() << "}," << endl; + f_gen_ << indent() << "}," << '\n'; // default case - f_gen_ << indent() << "_ => {" << endl; + f_gen_ << indent() << "_ => {" << '\n'; indent_up(); render_sync_handler_failed_default_exception_branch(tfunc); indent_down(); - f_gen_ << indent() << "}," << endl; + f_gen_ << indent() << "}," << '\n'; indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } void t_rs_generator::render_sync_handler_failed_user_exception_branch(t_function* tfunc) { @@ -2670,11 +2669,11 @@ void t_rs_generator::render_sync_handler_failed_user_exception_branch(t_function string if_statement(branches_rendered == 0 ? "if usr_err" : "} else if usr_err"); string exception_type(to_rust_type(xception_field->get_type())); f_gen_ << indent() << if_statement << ".downcast_ref::<" << exception_type << ">().is_some() {" - << endl; + << '\n'; indent_up(); f_gen_ << indent() << "let err = usr_err.downcast::<" << exception_type - << ">().expect(\"downcast already checked\");" << endl; + << ">().expect(\"downcast already checked\");" << '\n'; // render the members of the return struct ostringstream members; @@ -2701,17 +2700,17 @@ void t_rs_generator::render_sync_handler_failed_user_exception_branch(t_function // now write out the return struct f_gen_ << indent() << "let ret_err = " << service_call_result_struct_name(tfunc) << "{ " - << member_string << "};" << endl; + << member_string << "};" << '\n'; f_gen_ << indent() << "let message_ident = " << "TMessageIdentifier::new(" << "\"" << tfunc->get_name() << "\", " // note: use *original* name << "TMessageType::Reply, " - << "incoming_sequence_number);" << endl; - f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << endl; - f_gen_ << indent() << "ret_err.write_to_out_protocol(o_prot)?;" << endl; - f_gen_ << indent() << "o_prot.write_message_end()?;" << endl; - f_gen_ << indent() << "o_prot.flush()" << endl; + << "incoming_sequence_number);" << '\n'; + f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << '\n'; + f_gen_ << indent() << "ret_err.write_to_out_protocol(o_prot)?;" << '\n'; + f_gen_ << indent() << "o_prot.write_message_end()?;" << '\n'; + f_gen_ << indent() << "o_prot.flush()" << '\n'; indent_down(); @@ -2719,41 +2718,41 @@ void t_rs_generator::render_sync_handler_failed_user_exception_branch(t_function } // the catch all, if somehow it was a user exception that we don't support - f_gen_ << indent() << "} else {" << endl; + f_gen_ << indent() << "} else {" << '\n'; indent_up(); // FIXME: same as default block below - f_gen_ << indent() << "let ret_err = {" << endl; + f_gen_ << indent() << "let ret_err = {" << '\n'; indent_up(); render_thrift_error_struct("ApplicationError", "ApplicationErrorKind::Unknown", "usr_err.to_string()"); indent_down(); - f_gen_ << indent() << "};" << endl; + f_gen_ << indent() << "};" << '\n'; render_sync_handler_send_exception_response(tfunc, "ret_err"); indent_down(); - f_gen_ << indent() << "}" << endl; + f_gen_ << indent() << "}" << '\n'; } void t_rs_generator::render_sync_handler_failed_application_exception_branch( t_function* tfunc, const string& app_err_var) { if (tfunc->is_oneway()) { - f_gen_ << indent() << "Err(thrift::Error::Application(" << app_err_var << "))" << endl; + f_gen_ << indent() << "Err(thrift::Error::Application(" << app_err_var << "))" << '\n'; } else { render_sync_handler_send_exception_response(tfunc, app_err_var); } } void t_rs_generator::render_sync_handler_failed_default_exception_branch(t_function* tfunc) { - f_gen_ << indent() << "let ret_err = {" << endl; + f_gen_ << indent() << "let ret_err = {" << '\n'; indent_up(); render_thrift_error_struct("ApplicationError", "ApplicationErrorKind::Unknown", "e.to_string()"); indent_down(); - f_gen_ << indent() << "};" << endl; + f_gen_ << indent() << "};" << '\n'; if (tfunc->is_oneway()) { - f_gen_ << indent() << "Err(thrift::Error::Application(ret_err))" << endl; + f_gen_ << indent() << "Err(thrift::Error::Application(ret_err))" << '\n'; } else { render_sync_handler_send_exception_response(tfunc, "ret_err"); } @@ -2764,12 +2763,12 @@ void t_rs_generator::render_sync_handler_send_exception_response(t_function* tfu f_gen_ << indent() << "let message_ident = TMessageIdentifier::new(" << "\"" << tfunc->get_name() << "\", " // note: use *original* name << "TMessageType::Exception, " - << "incoming_sequence_number);" << endl; - f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << endl; + << "incoming_sequence_number);" << '\n'; + f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << '\n'; f_gen_ << indent() << "thrift::Error::write_application_error_to_out_protocol(&" << err_var - << ", o_prot)?;" << endl; - f_gen_ << indent() << "o_prot.write_message_end()?;" << endl; - f_gen_ << indent() << "o_prot.flush()" << endl; + << ", o_prot)?;" << '\n'; + f_gen_ << indent() << "o_prot.write_message_end()?;" << '\n'; + f_gen_ << indent() << "o_prot.flush()" << '\n'; } string t_rs_generator::handler_successful_return_struct(t_function* tfunc) { @@ -2811,10 +2810,10 @@ string t_rs_generator::handler_successful_return_struct(t_function* tfunc) { //----------------------------------------------------------------------------- void t_rs_generator::render_type_comment(const string& type_name) { - f_gen_ << "//" << endl; - f_gen_ << "// " << type_name << endl; - f_gen_ << "//" << endl; - f_gen_ << endl; + f_gen_ << "//" << '\n'; + f_gen_ << "// " << type_name << '\n'; + f_gen_ << "//" << '\n'; + f_gen_ << '\n'; } // NOTE: do *not* put in an extra newline after doc is generated. @@ -2831,26 +2830,26 @@ void t_rs_generator::render_thrift_error(const string& error_kind, const string& error_struct, const string& sub_error_kind, const string& error_message) { - f_gen_ << indent() << "Err(" << endl; + f_gen_ << indent() << "Err(" << '\n'; indent_up(); - f_gen_ << indent() << "thrift::Error::" << error_kind << "(" << endl; + f_gen_ << indent() << "thrift::Error::" << error_kind << "(" << '\n'; indent_up(); render_thrift_error_struct(error_struct, sub_error_kind, error_message); indent_down(); - f_gen_ << indent() << ")" << endl; + f_gen_ << indent() << ")" << '\n'; indent_down(); - f_gen_ << indent() << ")" << endl; + f_gen_ << indent() << ")" << '\n'; } void t_rs_generator::render_thrift_error_struct(const string& error_struct, const string& sub_error_kind, const string& error_message) { - f_gen_ << indent() << error_struct << "::new(" << endl; + f_gen_ << indent() << error_struct << "::new(" << '\n'; indent_up(); - f_gen_ << indent() << sub_error_kind << "," << endl; - f_gen_ << indent() << error_message << endl; + f_gen_ << indent() << sub_error_kind << "," << '\n'; + f_gen_ << indent() << error_message << '\n'; indent_down(); - f_gen_ << indent() << ")" << endl; + f_gen_ << indent() << ")" << '\n'; } bool t_rs_generator::is_double(t_type* ttype) { diff --git a/compiler/cpp/src/thrift/generate/t_st_generator.cc b/compiler/cpp/src/thrift/generate/t_st_generator.cc index b1411867124..c1ad35577e8 100644 --- a/compiler/cpp/src/thrift/generate/t_st_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_st_generator.cc @@ -43,8 +43,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /** * Smalltalk code generator. * @@ -177,7 +175,7 @@ void t_st_generator::init_generator() { f_.open(f_name.c_str()); // Print header - f_ << st_autogen_comment() << endl; + f_ << st_autogen_comment() << '\n'; st_class_def(f_, program_name_); generate_class_side_definition(); @@ -219,10 +217,10 @@ string t_st_generator::st_autogen_comment() { void t_st_generator::generate_force_consts() { f_ << prefix(class_name()) << " enums keysAndValuesDo: [:k :v | " << prefix(class_name()) - << " enums at: k put: v value].!" << endl; + << " enums at: k put: v value].!" << '\n'; f_ << prefix(class_name()) << " constants keysAndValuesDo: [:k :v | " << prefix(class_name()) - << " constants at: k put: v value].!" << endl; + << " constants at: k put: v value].!" << '\n'; } void t_st_generator::close_generator() { @@ -252,11 +250,11 @@ void t_st_generator::generate_typedef(t_typedef* ttypedef) { } void t_st_generator::st_class_def(std::ostream& out, string name) { - out << "Object subclass: #" << prefix(name) << endl; + out << "Object subclass: #" << prefix(name) << '\n'; indent_up(); - out << indent() << "instanceVariableNames: ''" << endl << indent() << "classVariableNames: ''" - << endl << indent() << "poolDictionaries: ''" << endl << indent() << "category: '" - << generated_category() << "'!" << endl << endl; + out << indent() << "instanceVariableNames: ''" << '\n' << indent() << "classVariableNames: ''" + << '\n' << indent() << "poolDictionaries: ''" << '\n' << indent() << "category: '" + << generated_category() << "'!" << '\n' << '\n'; } void t_st_generator::st_method(std::ostream& out, string cls, string name) { @@ -281,14 +279,14 @@ void t_st_generator::st_method(std::ostream& out, string cls, string name, strin strftime(timestr, 50, "%m/%d/%Y %H:%M", tinfo); out << "!" << prefix(cls) << " methodsFor: '" + category + "' stamp: 'thrift " << timestr - << "'!\n" << name << endl; + << "'!\n" << name << '\n'; indent_up(); out << indent(); } void t_st_generator::st_close_method(std::ostream& out) { - out << "! !" << endl << endl; + out << "! !" << '\n' << '\n'; indent_down(); } @@ -316,16 +314,16 @@ void t_st_generator::st_accessors(std::ostream& out, } void t_st_generator::generate_class_side_definition() { - f_ << prefix(class_name()) << " class" << endl << "\tinstanceVariableNames: 'constants enums'!" - << endl << endl; + f_ << prefix(class_name()) << " class" << '\n' << "\tinstanceVariableNames: 'constants enums'!" + << '\n' << '\n'; st_accessors(f_, class_name() + " class", "enums"); st_accessors(f_, class_name() + " class", "constants"); - f_ << prefix(class_name()) << " enums: Dictionary new!" << endl; - f_ << prefix(class_name()) << " constants: Dictionary new!" << endl; + f_ << prefix(class_name()) << " enums: Dictionary new!" << '\n'; + f_ << prefix(class_name()) << " constants: Dictionary new!" << '\n'; - f_ << endl; + f_ << '\n'; } /** @@ -338,16 +336,16 @@ void t_st_generator::generate_enum(t_enum* tenum) { string cls_name = program_name_ + capitalize(tenum->get_name()); f_ << prefix(class_name()) << " enums at: '" << tenum->get_name() << "' put: [" - << "(Dictionary new " << endl; + << "(Dictionary new " << '\n'; vector constants = tenum->get_constants(); vector::iterator c_iter; for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { int value = (*c_iter)->get_value(); - f_ << "\tat: '" << (*c_iter)->get_name() << "' put: " << value << ";" << endl; + f_ << "\tat: '" << (*c_iter)->get_name() << "' put: " << value << ";" << '\n'; } - f_ << "\tyourself)]!" << endl << endl; + f_ << "\tyourself)]!" << '\n' << '\n'; } /** @@ -359,7 +357,7 @@ void t_st_generator::generate_const(t_const* tconst) { t_const_value* value = tconst->get_value(); f_ << prefix(class_name()) << " constants at: '" << name << "' put: [" - << render_const_value(type, value) << "]!" << endl << endl; + << render_const_value(type, value) << "]!" << '\n' << '\n'; } /** @@ -398,7 +396,7 @@ string t_st_generator::render_const_value(t_type* type, t_const_value* value) { } else if (type->is_enum()) { indent(out) << value->get_integer(); } else if (type->is_struct() || type->is_xception()) { - out << "(" << capitalize(type->get_name()) << " new " << endl; + out << "(" << capitalize(type->get_name()) << " new " << '\n'; indent_up(); const vector& fields = ((t_struct*)type)->get_members(); @@ -418,7 +416,7 @@ string t_st_generator::render_const_value(t_type* type, t_const_value* value) { } out << indent() << v_iter->first->get_string() << ": " - << render_const_value(field_type, v_iter->second) << ";" << endl; + << render_const_value(field_type, v_iter->second) << ";" << '\n'; } out << indent() << "yourself)"; @@ -426,7 +424,7 @@ string t_st_generator::render_const_value(t_type* type, t_const_value* value) { } else if (type->is_map()) { t_type* ktype = ((t_map*)type)->get_key_type(); t_type* vtype = ((t_map*)type)->get_val_type(); - out << "(Dictionary new" << endl; + out << "(Dictionary new" << '\n'; indent_up(); indent_up(); const map& val = value->get_map(); @@ -436,7 +434,7 @@ string t_st_generator::render_const_value(t_type* type, t_const_value* value) { out << "at: " << render_const_value(ktype, v_iter->first); out << " put: "; out << render_const_value(vtype, v_iter->second); - out << ";" << endl; + out << ";" << '\n'; } out << indent() << indent() << "yourself)"; indent_down(); @@ -449,9 +447,9 @@ string t_st_generator::render_const_value(t_type* type, t_const_value* value) { etype = ((t_set*)type)->get_elem_type(); } if (type->is_set()) { - out << "(Set new" << endl; + out << "(Set new" << '\n'; } else { - out << "(OrderedCollection new" << endl; + out << "(OrderedCollection new" << '\n'; } indent_up(); indent_up(); @@ -460,7 +458,7 @@ string t_st_generator::render_const_value(t_type* type, t_const_value* value) { for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { out << indent() << indent(); out << "add: " << render_const_value(etype, *v_iter); - out << ";" << endl; + out << ";" << '\n'; } out << indent() << indent() << "yourself)"; indent_down(); @@ -502,7 +500,7 @@ void t_st_generator::generate_st_struct(std::ostream& out, else out << "Object"; - out << " subclass: #" << prefix(type_name(tstruct)) << endl << "\tinstanceVariableNames: '"; + out << " subclass: #" << prefix(type_name(tstruct)) << '\n' << "\tinstanceVariableNames: '"; if (members.size() > 0) { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -556,7 +554,7 @@ void t_st_generator::generate_accessors(std::ostream& out, t_struct* tstruct) { camelcase((*m_iter)->get_name()), a_type((*m_iter)->get_type())); } - out << endl; + out << '\n'; } } @@ -583,17 +581,17 @@ string t_st_generator::map_writer(t_map* tmap, string fname) { out << "[oprot writeMapBegin: (TMap new keyType: " << type_to_enum(tmap->get_key_type()) << "; valueType: " << type_to_enum(tmap->get_val_type()) << "; size: " << fname << " size)." - << endl; + << '\n'; indent_up(); - out << indent() << fname << " keysAndValuesDo: [:" << key << " :" << val << " |" << endl; + out << indent() << fname << " keysAndValuesDo: [:" << key << " :" << val << " |" << '\n'; indent_up(); - out << indent() << write_val(tmap->get_key_type(), key) << "." << endl << indent() + out << indent() << write_val(tmap->get_key_type(), key) << "." << '\n' << indent() << write_val(tmap->get_val_type(), val); indent_down(); - out << "]." << endl << indent() << "oprot writeMapEnd] value"; + out << "]." << '\n' << indent() << "oprot writeMapEnd] value"; indent_down(); return out.str(); @@ -604,18 +602,18 @@ string t_st_generator::map_reader(t_map* tmap) { string desc = temp_name(); string val = temp_name(); - out << "[|" << desc << " " << val << "| " << endl; + out << "[|" << desc << " " << val << "| " << '\n'; indent_up(); - out << indent() << desc << " := iprot readMapBegin." << endl << indent() << val - << " := Dictionary new." << endl << indent() << desc << " size timesRepeat: [" << endl; + out << indent() << desc << " := iprot readMapBegin." << '\n' << indent() << val + << " := Dictionary new." << '\n' << indent() << desc << " size timesRepeat: [" << '\n'; indent_up(); out << indent() << val << " at: " << read_val(tmap->get_key_type()) << " put: " << read_val(tmap->get_val_type()); indent_down(); - out << "]." << endl << indent() << "iprot readMapEnd." << endl << indent() << val << "] value"; + out << "]." << '\n' << indent() << "iprot readMapEnd." << '\n' << indent() << val << "] value"; indent_down(); return out.str(); @@ -626,16 +624,16 @@ string t_st_generator::list_writer(t_list* tlist, string fname) { string val = temp_name(); out << "[oprot writeListBegin: (TList new elemType: " << type_to_enum(tlist->get_elem_type()) - << "; size: " << fname << " size)." << endl; + << "; size: " << fname << " size)." << '\n'; indent_up(); - out << indent() << fname << " do: [:" << val << "|" << endl; + out << indent() << fname << " do: [:" << val << "|" << '\n'; indent_up(); - out << indent() << write_val(tlist->get_elem_type(), val) << endl; + out << indent() << write_val(tlist->get_elem_type(), val) << '\n'; indent_down(); - out << "]." << endl << indent() << "oprot writeListEnd] value"; + out << "]." << '\n' << indent() << "oprot writeListEnd] value"; indent_down(); return out.str(); @@ -646,17 +644,17 @@ string t_st_generator::list_reader(t_list* tlist) { string desc = temp_name(); string val = temp_name(); - out << "[|" << desc << " " << val << "| " << desc << " := iprot readListBegin." << endl; + out << "[|" << desc << " " << val << "| " << desc << " := iprot readListBegin." << '\n'; indent_up(); - out << indent() << val << " := OrderedCollection new." << endl << indent() << desc - << " size timesRepeat: [" << endl; + out << indent() << val << " := OrderedCollection new." << '\n' << indent() << desc + << " size timesRepeat: [" << '\n'; indent_up(); out << indent() << val << " add: " << read_val(tlist->get_elem_type()); indent_down(); - out << "]." << endl << indent() << "iprot readListEnd." << endl << indent() << val << "] value"; + out << "]." << '\n' << indent() << "iprot readListEnd." << '\n' << indent() << val << "] value"; indent_down(); return out.str(); @@ -667,16 +665,16 @@ string t_st_generator::set_writer(t_set* tset, string fname) { string val = temp_name(); out << "[oprot writeSetBegin: (TSet new elemType: " << type_to_enum(tset->get_elem_type()) - << "; size: " << fname << " size)." << endl; + << "; size: " << fname << " size)." << '\n'; indent_up(); - out << indent() << fname << " do: [:" << val << "|" << endl; + out << indent() << fname << " do: [:" << val << "|" << '\n'; indent_up(); - out << indent() << write_val(tset->get_elem_type(), val) << endl; + out << indent() << write_val(tset->get_elem_type(), val) << '\n'; indent_down(); - out << "]." << endl << indent() << "oprot writeSetEnd] value"; + out << "]." << '\n' << indent() << "oprot writeSetEnd] value"; indent_down(); return out.str(); @@ -687,17 +685,17 @@ string t_st_generator::set_reader(t_set* tset) { string desc = temp_name(); string val = temp_name(); - out << "[|" << desc << " " << val << "| " << desc << " := iprot readSetBegin." << endl; + out << "[|" << desc << " " << val << "| " << desc << " := iprot readSetBegin." << '\n'; indent_up(); - out << indent() << val << " := Set new." << endl << indent() << desc << " size timesRepeat: [" - << endl; + out << indent() << val << " := Set new." << '\n' << indent() << desc << " size timesRepeat: [" + << '\n'; indent_up(); out << indent() << val << " add: " << read_val(tset->get_elem_type()); indent_down(); - out << "]." << endl << indent() << "iprot readSetEnd." << endl << indent() << val << "] value"; + out << "]." << '\n' << indent() << "iprot readSetEnd." << '\n' << indent() << val << "] value"; indent_down(); return out.str(); @@ -709,7 +707,7 @@ string t_st_generator::struct_writer(t_struct* tstruct, string sname) { vector::const_iterator fld_iter; out << "[oprot writeStructBegin: " - << "(TStruct new name: '" + tstruct->get_name() + "')." << endl; + << "(TStruct new name: '" + tstruct->get_name() + "')." << '\n'; indent_up(); for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { @@ -718,15 +716,15 @@ string t_st_generator::struct_writer(t_struct* tstruct, string sname) { string accessor = sname + " " + camelcase(fname); if (optional) { - out << indent() << accessor << " ifNotNil: [" << endl; + out << indent() << accessor << " ifNotNil: [" << '\n'; indent_up(); } out << indent() << "oprot writeFieldBegin: (TField new name: '" << fname << "'; type: " << type_to_enum((*fld_iter)->get_type()) - << "; id: " << (*fld_iter)->get_key() << ")." << endl; + << "; id: " << (*fld_iter)->get_key() << ")." << '\n'; - out << indent() << write_val((*fld_iter)->get_type(), accessor) << "." << endl << indent() + out << indent() << write_val((*fld_iter)->get_type(), accessor) << "." << '\n' << indent() << "oprot writeFieldEnd"; if (optional) { @@ -734,7 +732,7 @@ string t_st_generator::struct_writer(t_struct* tstruct, string sname) { indent_down(); } - out << "." << endl; + out << "." << '\n'; } out << indent() << "oprot writeFieldStop; writeStructEnd] value"; @@ -755,33 +753,33 @@ string t_st_generator::struct_reader(t_struct* tstruct, string clsName = "") { clsName = tstruct->get_name(); } - out << "[|" << desc << " " << val << "|" << endl; + out << "[|" << desc << " " << val << "|" << '\n'; indent_up(); // This is nasty, but without it we'll break things by prefixing TResult. string name = ((capitalize(clsName) == "TResult") ? capitalize(clsName) : prefix(clsName)); - out << indent() << val << " := " << name << " new." << endl; + out << indent() << val << " := " << name << " new." << '\n'; - out << indent() << "iprot readStructBegin." << endl << indent() << "[" << desc - << " := iprot readFieldBegin." << endl << indent() << desc - << " type = TType stop] whileFalse: [|" << found << "|" << endl; + out << indent() << "iprot readStructBegin." << '\n' << indent() << "[" << desc + << " := iprot readFieldBegin." << '\n' << indent() << desc + << " type = TType stop] whileFalse: [|" << found << "|" << '\n'; indent_up(); for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { - out << indent() << desc << " id = " << (*fld_iter)->get_key() << " ifTrue: [" << endl; + out << indent() << desc << " id = " << (*fld_iter)->get_key() << " ifTrue: [" << '\n'; indent_up(); - out << indent() << found << " := true." << endl << indent() << val << " " + out << indent() << found << " := true." << '\n' << indent() << val << " " << camelcase((*fld_iter)->get_name()) << ": " << read_val((*fld_iter)->get_type()); indent_down(); - out << "]." << endl; + out << "]." << '\n'; } - out << indent() << found << " ifNil: [iprot skip: " << desc << " type]]." << endl; + out << indent() << found << " ifNil: [iprot skip: " << desc << " type]]." << '\n'; indent_down(); - out << indent() << "oprot readStructEnd." << endl << indent() << val << "] value"; + out << indent() << "oprot readStructEnd." << '\n' << indent() << val << "] value"; indent_down(); return out.str(); @@ -847,32 +845,32 @@ void t_st_generator::generate_send_method(t_function* function) { vector::const_iterator fld_iter; st_method(f_, client_class_name(), "send" + capitalize(signature)); - f_ << "oprot writeMessageBegin:" << endl; + f_ << "oprot writeMessageBegin:" << '\n'; indent_up(); - f_ << indent() << "(TCallMessage new" << endl; + f_ << indent() << "(TCallMessage new" << '\n'; indent_up(); - f_ << indent() << "name: '" << funname << "'; " << endl << indent() << "seqid: self nextSeqid)." - << endl; + f_ << indent() << "name: '" << funname << "'; " << '\n' << indent() << "seqid: self nextSeqid)." + << '\n'; indent_down(); indent_down(); f_ << indent() << "oprot writeStructBegin: " - << "(TStruct new name: '" + capitalize(camelcase(funname)) + "_args')." << endl; + << "(TStruct new name: '" + capitalize(camelcase(funname)) + "_args')." << '\n'; for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { string fname = camelcase((*fld_iter)->get_name()); f_ << indent() << "oprot writeFieldBegin: (TField new name: '" << fname << "'; type: " << type_to_enum((*fld_iter)->get_type()) << "; id: " << (*fld_iter)->get_key() - << ")." << endl; + << ")." << '\n'; - f_ << indent() << write_val((*fld_iter)->get_type(), fname) << "." << endl << indent() - << "oprot writeFieldEnd." << endl; + f_ << indent() << write_val((*fld_iter)->get_type(), fname) << "." << '\n' << indent() + << "oprot writeFieldEnd." << '\n'; } - f_ << indent() << "oprot writeFieldStop; writeStructEnd; writeMessageEnd." << endl; + f_ << indent() << "oprot writeFieldStop; writeStructEnd; writeMessageEnd." << '\n'; f_ << indent() << "oprot transport flush"; st_close_method(f_); @@ -897,11 +895,11 @@ void t_st_generator::generate_recv_method(t_function* function) { } st_method(f_, client_class_name(), "recv" + capitalize(funname)); - f_ << "| f msg res | " << endl << indent() << "msg := oprot readMessageBegin." << endl << indent() - << "self validateRemoteMessage: msg." << endl << indent() - << "res := " << struct_reader(&result) << "." << endl << indent() << "oprot readMessageEnd." - << endl << indent() << "oprot transport flush." << endl << indent() - << "res exception ifNotNil: [res exception signal]." << endl << indent() << "^ res"; + f_ << "| f msg res | " << '\n' << indent() << "msg := oprot readMessageBegin." << '\n' << indent() + << "self validateRemoteMessage: msg." << '\n' << indent() + << "res := " << struct_reader(&result) << "." << '\n' << indent() << "oprot readMessageEnd." + << '\n' << indent() << "oprot transport flush." << '\n' << indent() + << "res exception ifNotNil: [res exception signal]." << '\n' << indent() << "^ res"; st_close_method(f_); } @@ -940,7 +938,7 @@ void t_st_generator::generate_service_client(t_service* tservice) { extends_client = extends + "Client"; } - f_ << extends_client << " subclass: #" << prefix(client_class_name()) << endl + f_ << extends_client << " subclass: #" << prefix(client_class_name()) << '\n' << "\tinstanceVariableNames: ''\n" << "\tclassVariableNames: ''\n" << "\tpoolDictionaries: ''\n" @@ -951,11 +949,11 @@ void t_st_generator::generate_service_client(t_service* tservice) { string signature = function_signature(*f_iter); st_method(f_, client_class_name(), signature); - f_ << function_types_comment(*f_iter) << endl << indent() << "self send" - << capitalize(signature) << "." << endl; + f_ << function_types_comment(*f_iter) << '\n' << indent() << "self send" + << capitalize(signature) << "." << '\n'; if (!(*f_iter)->is_oneway()) { - f_ << indent() << "^ self recv" << capitalize(funname) << " success " << endl; + f_ << indent() << "^ self recv" << capitalize(funname) << " success " << '\n'; } st_close_method(f_); diff --git a/compiler/cpp/src/thrift/generate/t_swift_generator.cc b/compiler/cpp/src/thrift/generate/t_swift_generator.cc index fab14135ae7..98b19ecada0 100644 --- a/compiler/cpp/src/thrift/generate/t_swift_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_swift_generator.cc @@ -37,8 +37,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /** * Swift 3 code generator. * @@ -51,7 +49,7 @@ class t_swift_generator : public t_oop_generator { const string& option_string) : t_oop_generator(program) { update_keywords_for_validation(); - + (void)option_string; map::const_iterator iter; @@ -226,14 +224,14 @@ class t_swift_generator : public t_oop_generator { private: void block_open(ostream& out) { - out << " {" << endl; + out << " {" << '\n'; indent_up(); } void block_close(ostream& out, bool end_line=true) { indent_down(); indent(out) << "}"; - if (end_line) out << endl; + if (end_line) out << '\n'; } bool field_is_optional(t_field* tfield) { @@ -320,18 +318,18 @@ void t_swift_generator::init_generator() { string f_decl_fullname = module_path + "/" + f_decl_name; f_decl_.open(f_decl_fullname.c_str()); - f_decl_ << autogen_comment() << endl; + f_decl_ << autogen_comment() << '\n'; - f_decl_ << swift_imports() << swift_thrift_imports() << endl; + f_decl_ << swift_imports() << swift_thrift_imports() << '\n'; // ...and a .swift implementation extensions file string f_impl_name = name + "+Exts.swift"; string f_impl_fullname = module_path + "/" + f_impl_name; f_impl_.open(f_impl_fullname.c_str()); - f_impl_ << autogen_comment() << endl; + f_impl_ << autogen_comment() << '\n'; - f_impl_ << swift_imports() << swift_thrift_imports() << endl; + f_impl_ << swift_imports() << swift_thrift_imports() << '\n'; } @@ -349,16 +347,16 @@ string t_swift_generator::swift_imports() { vector::const_iterator i_iter; for (i_iter=includes_list.begin(); i_iter!=includes_list.end(); ++i_iter) { - includes << "import " << *i_iter << endl; + includes << "import " << *i_iter << '\n'; } if (namespaced_) { const vector& program_includes = program_->get_includes(); for (auto program_include : program_includes) { - includes << ("import " + get_real_swift_module(program_include)) << endl; + includes << ("import " + get_real_swift_module(program_include)) << '\n'; } } - includes << endl; + includes << '\n'; return includes.str(); } @@ -381,10 +379,10 @@ string t_swift_generator::swift_thrift_imports() { vector::const_iterator i_iter; for (i_iter=includes_list.begin(); i_iter!=includes_list.end(); ++i_iter) { - includes << "import " << *i_iter << endl; + includes << "import " << *i_iter << '\n'; } - includes << endl; + includes << '\n'; return includes.str(); } @@ -395,7 +393,7 @@ string t_swift_generator::swift_thrift_imports() { void t_swift_generator::close_generator() { // stick our constants declarations at the end of the header file // since they refer to things we are defining. - f_decl_ << constants_declarations_ << endl; + f_decl_ << constants_declarations_ << '\n'; } /** @@ -405,8 +403,8 @@ void t_swift_generator::close_generator() { */ void t_swift_generator::generate_typedef(t_typedef* ttypedef) { f_decl_ << indent() << "public typealias " << ttypedef->get_symbolic() - << " = " << type_name(ttypedef->get_type()) << endl; - f_decl_ << endl; + << " = " << type_name(ttypedef->get_type()) << '\n'; + f_decl_ << '\n'; } @@ -430,80 +428,80 @@ void t_swift_generator::generate_enum(t_enum* tenum) { vector::iterator c_iter; for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { - f_decl_ << indent() << "case " << enum_case_name((*c_iter), true) << endl; + f_decl_ << indent() << "case " << enum_case_name((*c_iter), true) << '\n'; } // unknown associated value case for safety and similar behavior to other languages if (safe_enums_) { - f_decl_ << indent() << "case unknown(Int32)" << endl; + f_decl_ << indent() << "case unknown(Int32)" << '\n'; } - f_decl_ << endl; + f_decl_ << '\n'; // TSerializable read(from:) f_decl_ << indent() << "public static func read(from proto: TProtocol) throws -> " << tenum->get_name(); block_open(f_decl_); - f_decl_ << indent() << "let raw: Int32 = try proto.read()" << endl; - f_decl_ << indent() << "let new = " << tenum->get_name() << "(rawValue: raw)" << endl; + f_decl_ << indent() << "let raw: Int32 = try proto.read()" << '\n'; + f_decl_ << indent() << "let new = " << tenum->get_name() << "(rawValue: raw)" << '\n'; - f_decl_ << indent() << "if let unwrapped = new {" << endl; + f_decl_ << indent() << "if let unwrapped = new {" << '\n'; indent_up(); - f_decl_ << indent() << "return unwrapped" << endl; + f_decl_ << indent() << "return unwrapped" << '\n'; indent_down(); - f_decl_ << indent() << "} else {" << endl; + f_decl_ << indent() << "} else {" << '\n'; indent_up(); - f_decl_ << indent() << "throw TProtocolError(error: .invalidData," << endl; + f_decl_ << indent() << "throw TProtocolError(error: .invalidData," << '\n'; f_decl_ << indent() << " message: \"Invalid enum value (\\(raw)) for \\(" - << tenum->get_name() << ".self)\")" << endl; + << tenum->get_name() << ".self)\")" << '\n'; indent_down(); - f_decl_ << indent() << "}" << endl; + f_decl_ << indent() << "}" << '\n'; block_close(f_decl_); // empty init for TSerializable - f_decl_ << endl; + f_decl_ << '\n'; f_decl_ << indent() << "public init()"; block_open(f_decl_); - f_decl_ << indent() << "self = ." << enum_case_name(constants.front(), false) << endl; + f_decl_ << indent() << "self = ." << enum_case_name(constants.front(), false) << '\n'; block_close(f_decl_); - f_decl_ << endl; + f_decl_ << '\n'; // rawValue getter f_decl_ << indent() << "public var rawValue: Int32"; block_open(f_decl_); - f_decl_ << indent() << "switch self {" << endl; + f_decl_ << indent() << "switch self {" << '\n'; for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { f_decl_ << indent() << "case ." << enum_case_name((*c_iter), true) - << ": return " << (*c_iter)->get_value() << endl; + << ": return " << (*c_iter)->get_value() << '\n'; } if (safe_enums_) { - f_decl_ << indent() << "case .unknown(let value): return value" << endl; + f_decl_ << indent() << "case .unknown(let value): return value" << '\n'; } - f_decl_ << indent() << "}" << endl; + f_decl_ << indent() << "}" << '\n'; block_close(f_decl_); - f_decl_ << endl; + f_decl_ << '\n'; // convenience rawValue initalizer f_decl_ << indent() << "public init?(rawValue: Int32)"; block_open(f_decl_); - f_decl_ << indent() << "switch rawValue {" << endl;; + f_decl_ << indent() << "switch rawValue {" << '\n';; for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { f_decl_ << indent() << "case " << (*c_iter)->get_value() - << ": self = ." << enum_case_name((*c_iter), true) << endl; + << ": self = ." << enum_case_name((*c_iter), true) << '\n'; } if (!safe_enums_) { - f_decl_ << indent() << "default: return nil" << endl; + f_decl_ << indent() << "default: return nil" << '\n'; } else { - f_decl_ << indent() << "default: self = .unknown(rawValue)" << endl; + f_decl_ << indent() << "default: self = .unknown(rawValue)" << '\n'; } - f_decl_ << indent() << "}" << endl; + f_decl_ << indent() << "}" << '\n'; block_close(f_decl_); block_close(f_decl_); - f_decl_ << endl; + f_decl_ << '\n'; } /** @@ -521,36 +519,36 @@ void t_swift_generator::generate_old_enum(t_enum* tenum) { for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { f_decl_ << indent() << "case " << (*c_iter)->get_name() - << " = " << (*c_iter)->get_value() << endl; + << " = " << (*c_iter)->get_value() << '\n'; } - f_decl_ << endl; - f_decl_ << indent() << "public init() { self.init(rawValue: " << constants.front()->get_value() << ")! }" << endl; + f_decl_ << '\n'; + f_decl_ << indent() << "public init() { self.init(rawValue: " << constants.front()->get_value() << ")! }" << '\n'; block_close(f_decl_); - f_decl_ << endl; + f_decl_ << '\n'; f_impl_ << indent() << "extension " << tenum->get_name() << " : TEnum"; block_open(f_impl_); - f_impl_ << endl; + f_impl_ << '\n'; f_impl_ << indent() << "public static func readValueFromProtocol(proto: TProtocol) throws -> " << tenum->get_name(); block_open(f_impl_); - f_impl_ << indent() << "var raw = Int32()" << endl - << indent() << "try proto.readI32(&raw)" << endl - << indent() << "return " << tenum->get_name() << "(rawValue: raw)!" << endl; + f_impl_ << indent() << "var raw = Int32()" << '\n' + << indent() << "try proto.readI32(&raw)" << '\n' + << indent() << "return " << tenum->get_name() << "(rawValue: raw)!" << '\n'; block_close(f_impl_); - f_impl_ << endl; + f_impl_ << '\n'; f_impl_ << indent() << "public static func writeValue(value: " << tenum->get_name() << ", toProtocol proto: TProtocol) throws"; block_open(f_impl_); - f_impl_ << indent() << "try proto.writeI32(value.rawValue)" << endl; + f_impl_ << indent() << "try proto.writeI32(value.rawValue)" << '\n'; block_close(f_impl_); - f_impl_ << endl; + f_impl_ << '\n'; block_close(f_impl_); - f_impl_ << endl; + f_impl_ << '\n'; } string t_swift_generator::enum_case_name(t_enum_value* tenum_case, bool declaration) { @@ -593,7 +591,7 @@ void t_swift_generator::generate_consts(vector consts) { t_type* type = (*c_iter)->get_type(); const_interface << "public let " << capitalize((*c_iter)->get_name()) << " : " << type_name(type) << " = "; render_const_value(const_interface, type, (*c_iter)->get_value()); - const_interface << endl << endl; + const_interface << '\n' << '\n'; } // this gets spit into the header file in ::close_generator @@ -647,7 +645,7 @@ void t_swift_generator::generate_docstring(ostream& out, string& doc) { vector::const_iterator d_iter; for (d_iter = strings.begin(); d_iter != strings.end(); ++d_iter) { if ((*d_iter) != "") { - out << indent() << "/// " << (*d_iter) << endl; + out << indent() << "/// " << (*d_iter) << '\n'; } } } @@ -685,12 +683,12 @@ void t_swift_generator::generate_swift_struct(ostream& out, out << indent() << "public enum " << tstruct->get_name(); block_open(out); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - out << endl; + out << '\n'; string doc = (*m_iter)->get_doc(); generate_docstring(out, doc); out << indent() << "case " << maybe_escape_identifier((*m_iter)->get_name()) << "(val: " - << type_name((*m_iter)->get_type(), false) << ")" << endl; + << type_name((*m_iter)->get_type(), false) << ")" << '\n'; } } else { // Normal structs @@ -707,20 +705,20 @@ void t_swift_generator::generate_swift_struct(ostream& out, vector sorted = members; sort(sorted.begin(), sorted.end(), [](t_field *a, t_field *b) { return (a->get_key() < b->get_key()); } ); for (m_iter = sorted.begin(); m_iter != sorted.end(); ++m_iter) { - out << endl; + out << '\n'; // TODO: Defaults string doc = (*m_iter)->get_doc(); generate_docstring(out, doc); - out << indent() << declare_property(*m_iter, is_private) << endl; + out << indent() << declare_property(*m_iter, is_private) << '\n'; } - out << endl; - out << endl; + out << '\n'; + out << '\n'; if (!struct_has_required_fields(tstruct)) { - indent(out) << visibility << " init() { }" << endl; + indent(out) << visibility << " init() { }" << '\n'; } if (struct_has_required_fields(tstruct)) { generate_swift_struct_init(out, tstruct, false, is_private); @@ -732,7 +730,7 @@ void t_swift_generator::generate_swift_struct(ostream& out, block_close(out); - out << endl; + out << '\n'; } /** @@ -761,11 +759,11 @@ void t_swift_generator::generate_old_swift_struct(ostream& out, vector::const_iterator m_iter; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - out << endl; - out << indent() << declare_property(*m_iter, is_private) << endl; + out << '\n'; + out << indent() << declare_property(*m_iter, is_private) << '\n'; } - out << endl; + out << '\n'; // init @@ -773,7 +771,7 @@ void t_swift_generator::generate_old_swift_struct(ostream& out, block_open(out); block_close(out); - out << endl; + out << '\n'; if (struct_has_required_fields(tstruct)) { generate_swift_struct_init(out, tstruct, false, is_private); @@ -784,7 +782,7 @@ void t_swift_generator::generate_old_swift_struct(ostream& out, block_close(out); - out << endl; + out << '\n'; } /** @@ -831,20 +829,20 @@ void t_swift_generator::generate_swift_struct_init(ostream& out, should_set = should_set || !field_is_optional((*m_iter)); if (should_set) { out << indent() << "self." << maybe_escape_identifier((*m_iter)->get_name()) << " = " - << maybe_escape_identifier((*m_iter)->get_name()) << endl; + << maybe_escape_identifier((*m_iter)->get_name()) << '\n'; } } else { /** legacy Swift2/Cocoa */ if (all || (*m_iter)->get_req() == t_field::T_REQUIRED || (*m_iter)->get_req() == t_field::T_OPT_IN_REQ_OUT) { out << indent() << "self." << maybe_escape_identifier((*m_iter)->get_name()) << " = " - << maybe_escape_identifier((*m_iter)->get_name()) << endl; + << maybe_escape_identifier((*m_iter)->get_name()) << '\n'; } } } block_close(out); - out << endl; + out << '\n'; } /** @@ -861,7 +859,7 @@ void t_swift_generator::generate_swift_struct_hashable_extension(ostream& out, string visibility = is_private ? (gen_cocoa_ ? "private" : "fileprivate") : "public"; indent(out) << "extension " << tstruct->get_name() << " : Hashable"; block_open(out); - out << endl; + out << '\n'; indent(out) << visibility << " func hash(into hasher: inout Hasher)"; block_open(out); @@ -872,21 +870,21 @@ void t_swift_generator::generate_swift_struct_hashable_extension(ostream& out, if (!tstruct->is_union()) { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* tfield = *m_iter; - indent(out) << "hasher.combine(" << maybe_escape_identifier(tfield->get_name()) << ")" << endl; + indent(out) << "hasher.combine(" << maybe_escape_identifier(tfield->get_name()) << ")" << '\n'; } } else { - indent(out) << "switch self {" << endl; + indent(out) << "switch self {" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); m_iter++) { t_field *tfield = *m_iter; - indent(out) << "case ." << tfield->get_name() << "(let val): hasher.combine(val)" << endl; + indent(out) << "case ." << tfield->get_name() << "(let val): hasher.combine(val)" << '\n'; } - indent(out) << "}" << endl << endl; + indent(out) << "}" << '\n' << '\n'; } } block_close(out); - out << endl; + out << '\n'; block_close(out); - out << endl; + out << '\n'; } /** @@ -912,7 +910,7 @@ void t_swift_generator::generate_swift_struct_equatable_extension(ostream& out, if (members.size()) { if (!tstruct->is_union()) { - out << endl; + out << '\n'; indent_up(); for (m_iter = members.begin(); m_iter != members.end();) { @@ -922,30 +920,30 @@ void t_swift_generator::generate_swift_struct_equatable_extension(ostream& out, if (++m_iter != members.end()) { out << " &&"; } - out << endl; + out << '\n'; } indent_down(); } else { block_open(out); - indent(out) << "switch (lhs, rhs) {" << endl; + indent(out) << "switch (lhs, rhs) {" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { t_field* tfield = *m_iter; indent(out) << "case (." << tfield->get_name() << "(let lval), ." << tfield->get_name() << "(let rval)): return lval == rval" - << endl; + << '\n'; } - indent(out) << "default: return false" << endl; - indent(out) << "}" << endl; + indent(out) << "default: return false" << '\n'; + indent(out) << "}" << '\n'; indent_down(); - indent(out) << "}()" << endl; + indent(out) << "}()" << '\n'; } } else { - out << " true" << endl; + out << " true" << '\n'; } block_close(out); - out << endl; + out << '\n'; } /** @@ -972,7 +970,7 @@ void t_swift_generator::generate_swift_struct_implementation(ostream& out, generate_swift_struct_hashable_extension(out, tstruct, is_private); generate_swift_struct_thrift_extension(out, tstruct, is_result, is_private); - out << endl << endl; + out << '\n' << '\n'; } /** @@ -993,7 +991,7 @@ void t_swift_generator::generate_swift_struct_thrift_extension(ostream& out, block_open(out); - out << endl; + out << '\n'; if (!gen_cocoa_) { /** Swift 3, no writer we just write field ID's */ string access = (is_private) ? (gen_cocoa_ ? "private" : "fileprivate") : "public"; @@ -1012,11 +1010,11 @@ void t_swift_generator::generate_swift_struct_thrift_extension(ostream& out, // pad a colon out << ":"; } - out << "]" << endl; + out << "]" << '\n'; block_close(out); - out << endl; + out << '\n'; out << indent() << access << " static var structName: String { return \"" - << tstruct->get_name() << "\" }" << endl << endl; + << tstruct->get_name() << "\" }" << '\n' << '\n'; if (tstruct->is_union()) { generate_swift_union_reader(out, tstruct); @@ -1037,24 +1035,24 @@ void t_swift_generator::generate_swift_struct_thrift_extension(ostream& out, } block_close(out); - out << endl; + out << '\n'; } void t_swift_generator::generate_swift_union_reader(ostream& out, t_struct* tstruct) { indent(out) << "public static func read(from proto: TProtocol) throws -> " << tstruct->get_name(); block_open(out); - indent(out) << "_ = try proto.readStructBegin()" << endl; + indent(out) << "_ = try proto.readStructBegin()" << '\n'; indent(out) << "var ret: " << tstruct->get_name() << "?"; - out << endl; + out << '\n'; indent(out) << "fields: while true"; block_open(out); - out << endl; - indent(out) << "let (_, fieldType, fieldID) = try proto.readFieldBegin()" << endl << endl; + out << '\n'; + indent(out) << "let (_, fieldType, fieldID) = try proto.readFieldBegin()" << '\n' << '\n'; indent(out) << "switch (fieldID, fieldType)"; block_open(out); - indent(out) << "case (_, .stop): break fields" << endl; + indent(out) << "case (_, .stop): break fields" << '\n'; const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; @@ -1094,28 +1092,28 @@ void t_swift_generator::generate_swift_union_reader(ostream& out, t_struct* tstr indent(out) << padding << "ret = " << tstruct->get_name() << "." << (*f_iter)->get_name() << "(val: " << "try " << type_name((*f_iter)->get_type(), false, false) - << ".read(from: proto))" << endl; + << ".read(from: proto))" << '\n'; } - indent(out) << "case let (_, unknownType): try proto.skip(type: unknownType)" << endl; + indent(out) << "case let (_, unknownType): try proto.skip(type: unknownType)" << '\n'; block_close(out); - indent(out) << "try proto.readFieldEnd()" << endl; + indent(out) << "try proto.readFieldEnd()" << '\n'; block_close(out); - out << endl; + out << '\n'; - indent(out) << "try proto.readStructEnd()" << endl; + indent(out) << "try proto.readStructEnd()" << '\n'; indent(out) << "if let ret = ret"; block_open(out); - indent(out) << "return ret" << endl; + indent(out) << "return ret" << '\n'; block_close(out); - out << endl; + out << '\n'; indent(out) << "throw TProtocolError(error: .unknown, message: \"Missing required value for type: " << tstruct->get_name() << "\")"; block_close(out); - out << endl; + out << '\n'; } @@ -1139,7 +1137,7 @@ void t_swift_generator::generate_swift_struct_reader(ostream& out, << tstruct->get_name(); block_open(out); - indent(out) << "_ = try proto.readStructBegin()" << endl; + indent(out) << "_ = try proto.readStructBegin()" << '\n'; const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; @@ -1147,20 +1145,20 @@ void t_swift_generator::generate_swift_struct_reader(ostream& out, for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool optional = field_is_optional(*f_iter); indent(out) << "var " << maybe_escape_identifier((*f_iter)->get_name()) << ": " - << type_name((*f_iter)->get_type(), optional, !optional) << endl; + << type_name((*f_iter)->get_type(), optional, !optional) << '\n'; } - out << endl; + out << '\n'; // Loop over reading in fields indent(out) << "fields: while true"; block_open(out); - out << endl; + out << '\n'; - indent(out) << "let (_, fieldType, fieldID) = try proto.readFieldBegin()" << endl << endl; + indent(out) << "let (_, fieldType, fieldID) = try proto.readFieldBegin()" << '\n' << '\n'; indent(out) << "switch (fieldID, fieldType)"; block_open(out); - indent(out) << "case (_, .stop): break fields" << endl; + indent(out) << "case (_, .stop): break fields" << '\n'; // Generate deserialization code for known cases @@ -1198,33 +1196,33 @@ void t_swift_generator::generate_swift_struct_reader(ostream& out, } out << padding << maybe_escape_identifier((*f_iter)->get_name()) << " = try " - << type_name((*f_iter)->get_type(), false, false) << ".read(from: proto)" << endl; + << type_name((*f_iter)->get_type(), false, false) << ".read(from: proto)" << '\n'; } - indent(out) << "case let (_, unknownType): try proto.skip(type: unknownType)" << endl; + indent(out) << "case let (_, unknownType): try proto.skip(type: unknownType)" << '\n'; block_close(out); - out << endl; + out << '\n'; // Read field end marker - indent(out) << "try proto.readFieldEnd()" << endl; + indent(out) << "try proto.readFieldEnd()" << '\n'; block_close(out); - out << endl; - indent(out) << "try proto.readStructEnd()" << endl; + out << '\n'; + indent(out) << "try proto.readStructEnd()" << '\n'; if (struct_has_required_fields(tstruct)) { // performs various checks (e.g. check that all required fields are set) - indent(out) << "// Required fields" << endl; + indent(out) << "// Required fields" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if (field_is_optional(*f_iter)) { continue; } indent(out) << "try proto.validateValue(" << maybe_escape_identifier((*f_iter)->get_name()) << ", " - << "named: \"" << (*f_iter)->get_name() << "\")" << endl; + << "named: \"" << (*f_iter)->get_name() << "\")" << '\n'; } } - out << endl; + out << '\n'; indent(out) << "return " << tstruct->get_name() << "("; for (f_iter = fields.begin(); f_iter != fields.end();) { @@ -1242,8 +1240,8 @@ void t_swift_generator::generate_swift_struct_reader(ostream& out, << tstruct->get_name(); block_open(out); - out << endl; - indent(out) << "try __proto.readStructBegin()" << endl << endl; + out << '\n'; + indent(out) << "try __proto.readStructBegin()" << '\n' << '\n'; const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; @@ -1251,66 +1249,66 @@ void t_swift_generator::generate_swift_struct_reader(ostream& out, for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { bool optional = field_is_optional(*f_iter); indent(out) << "var " << maybe_escape_identifier((*f_iter)->get_name()) << " : " - << type_name((*f_iter)->get_type(), optional, !optional) << endl; + << type_name((*f_iter)->get_type(), optional, !optional) << '\n'; } - out << endl; + out << '\n'; // Loop over reading in fields indent(out) << "fields: while true"; block_open(out); - out << endl; + out << '\n'; - indent(out) << "let (_, fieldType, fieldID) = try __proto.readFieldBegin()" << endl << endl; + indent(out) << "let (_, fieldType, fieldID) = try __proto.readFieldBegin()" << '\n' << '\n'; indent(out) << "switch (fieldID, fieldType)"; block_open(out); - indent(out) << "case (_, .STOP):" << endl; + indent(out) << "case (_, .STOP):" << '\n'; indent_up(); - indent(out) << "break fields" << endl << endl; + indent(out) << "break fields" << '\n' << '\n'; indent_down(); // Generate deserialization code for known cases for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - indent(out) << "case (" << (*f_iter)->get_key() << ", " << type_to_enum((*f_iter)->get_type()) << "):" << endl; + indent(out) << "case (" << (*f_iter)->get_key() << ", " << type_to_enum((*f_iter)->get_type()) << "):" << '\n'; indent_up(); indent(out) << maybe_escape_identifier((*f_iter)->get_name()) << " = try __proto.readValue() as " - << type_name((*f_iter)->get_type()) << endl << endl; + << type_name((*f_iter)->get_type()) << '\n' << '\n'; indent_down(); } - indent(out) << "case let (_, unknownType):" << endl; + indent(out) << "case let (_, unknownType):" << '\n'; indent_up(); - indent(out) << "try __proto.skipType(unknownType)" << endl; + indent(out) << "try __proto.skipType(unknownType)" << '\n'; indent_down(); block_close(out); - out << endl; + out << '\n'; // Read field end marker - indent(out) << "try __proto.readFieldEnd()" << endl; + indent(out) << "try __proto.readFieldEnd()" << '\n'; block_close(out); - out << endl; - indent(out) << "try __proto.readStructEnd()" << endl; - out << endl; + out << '\n'; + indent(out) << "try __proto.readStructEnd()" << '\n'; + out << '\n'; if (struct_has_required_fields(tstruct)) { // performs various checks (e.g. check that all required fields are set) - indent(out) << "// Required fields" << endl; + indent(out) << "// Required fields" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { if (field_is_optional(*f_iter)) { continue; } indent(out) << "try __proto.validateValue(" << (*f_iter)->get_name() << ", " - << "named: \"" << (*f_iter)->get_name() << "\")" << endl; + << "named: \"" << (*f_iter)->get_name() << "\")" << '\n'; } } - out << endl; + out << '\n'; indent(out) << "return " << tstruct->get_name() << "("; for (f_iter = fields.begin(); f_iter != fields.end();) { @@ -1320,11 +1318,11 @@ void t_swift_generator::generate_swift_struct_reader(ostream& out, } } } - out << ")" << endl; + out << ")" << '\n'; block_close(out); - out << endl; + out << '\n'; } /** @@ -1344,14 +1342,14 @@ void t_swift_generator::generate_old_swift_struct_writer(ostream& out, indent(out) << visibility << " static func writeValue(__value: " << tstruct->get_name() << ", toProtocol __proto: TProtocol) throws"; block_open(out); - out << endl; + out << '\n'; string name = tstruct->get_name(); const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; - indent(out) << "try __proto.writeStructBeginWithName(\"" << name << "\")" << endl; - out << endl; + indent(out) << "try __proto.writeStructBeginWithName(\"" << name << "\")" << '\n'; + out << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { t_field *tfield = *f_iter; @@ -1367,19 +1365,19 @@ void t_swift_generator::generate_old_swift_struct_writer(ostream& out, << (optional ? "" : "__value.") << maybe_escape_identifier(tfield->get_name()) << ", " << "name: \"" << tfield->get_name() << "\", " << "type: " << type_to_enum(tfield->get_type()) << ", " - << "id: " << tfield->get_key() << ")" << endl; + << "id: " << tfield->get_key() << ")" << '\n'; if (optional) { block_close(out); } - out << endl; + out << '\n'; } - indent(out) << "try __proto.writeFieldStop()" << endl << endl; - indent(out) << "try __proto.writeStructEnd()" << endl; + indent(out) << "try __proto.writeFieldStop()" << '\n' << '\n'; + indent(out) << "try __proto.writeStructEnd()" << '\n'; block_close(out); - out << endl; + out << '\n'; } /** @@ -1396,12 +1394,12 @@ void t_swift_generator::generate_old_swift_struct_result_writer(ostream& out, t_ indent(out) << "private static func writeValue(__value: " << tstruct->get_name() << ", toProtocol __proto: TProtocol) throws"; block_open(out); - out << endl; + out << '\n'; string name = tstruct->get_name(); const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; - indent(out) << "try __proto.writeStructBeginWithName(\"" << name << "\")" << endl; - out << endl; + indent(out) << "try __proto.writeStructBeginWithName(\"" << name << "\")" << '\n'; + out << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { t_field *tfield = *f_iter; @@ -1413,15 +1411,15 @@ void t_swift_generator::generate_old_swift_struct_result_writer(ostream& out, t_ indent(out) << "try __proto.writeFieldValue(result, " << "name: \"" << tfield->get_name() << "\", " << "type: " << type_to_enum(tfield->get_type()) << ", " - << "id: " << tfield->get_key() << ")" << endl; + << "id: " << tfield->get_key() << ")" << '\n'; block_close(out); } // Write the struct map - indent(out) << "try __proto.writeFieldStop()" << endl << endl; - indent(out) << "try __proto.writeStructEnd()" << endl; + indent(out) << "try __proto.writeFieldStop()" << '\n' << '\n'; + indent(out) << "try __proto.writeStructEnd()" << '\n'; block_close(out); - out << endl; + out << '\n'; } /** @@ -1440,50 +1438,50 @@ void t_swift_generator::generate_swift_struct_printable_extension(ostream& out, << (debug_descriptions_ ? "CustomDebugStringConvertible" : "CustomStringConvertible"); block_open(out); - out << endl; + out << '\n'; indent(out) << "public var description : String"; block_open(out); indent(out) << "var desc = \"" << tstruct->get_name(); if (!gen_cocoa_) { if (!tstruct->is_union()) { - out << "(\"" << endl; + out << "(\"" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end();) { indent(out) << "desc += \"" << (*f_iter)->get_name() << "=\\(String(describing: self." << maybe_escape_identifier((*f_iter)->get_name()) << "))"; if (++f_iter != fields.end()) { out << ", "; } - out << "\"" << endl; + out << "\"" << '\n'; } } else { - out << ".\"" << endl; - indent(out) << "switch self {" << endl; + out << ".\"" << '\n'; + indent(out) << "switch self {" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end();f_iter++) { indent(out) << "case ." << (*f_iter)->get_name() << "(let val): " << "desc += \"" << (*f_iter)->get_name() << "(val: \\(val))\"" - << endl; + << '\n'; } - indent(out) << "}" << endl; + indent(out) << "}" << '\n'; } } else { - out << "(\"" << endl; + out << "(\"" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end();) { indent(out) << "desc += \"" << (*f_iter)->get_name() << "=\\(self." << maybe_escape_identifier((*f_iter)->get_name()) << ")"; if (++f_iter != fields.end()) { out << ", "; } - out << "\"" << endl; + out << "\"" << '\n'; } - indent(out) << "desc += \")\"" << endl; + indent(out) << "desc += \")\"" << '\n'; } - indent(out) << "return desc" << endl; + indent(out) << "return desc" << '\n'; block_close(out); - out << endl; + out << '\n'; block_close(out); - out << endl; + out << '\n'; } /** @@ -1606,14 +1604,14 @@ void t_swift_generator::generate_swift_service_protocol(ostream& out, t_service* out << " : " << parent->get_name(); } block_open(out); - out << endl; + out << '\n'; vector functions = tservice->get_functions(); vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { function_docstring(out, *f_iter); - indent(out) << function_signature(*f_iter) << endl << endl; + indent(out) << function_signature(*f_iter) << '\n' << '\n'; } } else { @@ -1624,7 +1622,7 @@ void t_swift_generator::generate_swift_service_protocol(ostream& out, t_service* vector::iterator f_iter; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { - out << endl; + out << '\n'; indent(out) << function_signature(*f_iter) << " // exceptions: "; t_struct* xs = (*f_iter)->get_xceptions(); const vector& xceptions = xs->get_members(); @@ -1632,11 +1630,11 @@ void t_swift_generator::generate_swift_service_protocol(ostream& out, t_service* for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { out << type_name((*x_iter)->get_type()) + ", "; } - out << endl; + out << '\n'; } } block_close(out); - out << endl; + out << '\n'; } /** @@ -1652,7 +1650,7 @@ void t_swift_generator::generate_swift_service_protocol_async(ostream& out, t_se indent(out) << "public protocol " << tservice->get_name() << "Async"; block_open(out); - if (!gen_cocoa_) { out << endl; } + if (!gen_cocoa_) { out << '\n'; } vector functions = tservice->get_functions(); vector::iterator f_iter; @@ -1660,20 +1658,20 @@ void t_swift_generator::generate_swift_service_protocol_async(ostream& out, t_se if (!gen_cocoa_) { for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { async_function_docstring(out, *f_iter); - indent(out) << async_function_signature(*f_iter) << endl << endl; + indent(out) << async_function_signature(*f_iter) << '\n' << '\n'; } } else { for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { - out << endl; - indent(out) << async_function_signature(*f_iter) << endl; + out << '\n'; + indent(out) << async_function_signature(*f_iter) << '\n'; if (promise_kit_) { - indent(out) << promise_function_signature(*f_iter) << endl; + indent(out) << promise_function_signature(*f_iter) << '\n'; } // - out << endl; + out << '\n'; } } block_close(out); - out << endl; + out << '\n'; } /** @@ -1690,33 +1688,33 @@ void t_swift_generator::generate_swift_service_client(ostream& out, t_service* t out << " : " << ((parent == nullptr) ? "TClient" : parent->get_name() + "Client"); out << " /* , " << tservice->get_name() << " */"; block_open(out); - out << endl; + out << '\n'; } else { // a indent(out) << "public class " << tservice->get_name() << "Client /* : " << tservice->get_name() << " */"; block_open(out); - out << endl; + out << '\n'; - indent(out) << "let __inProtocol : TProtocol" << endl << endl; - indent(out) << "let __outProtocol : TProtocol" << endl << endl; + indent(out) << "let __inProtocol : TProtocol" << '\n' << '\n'; + indent(out) << "let __outProtocol : TProtocol" << '\n' << '\n'; indent(out) << "public init(inoutProtocol: TProtocol)"; block_open(out); - indent(out) << "__inProtocol = inoutProtocol" << endl; - indent(out) << "__outProtocol = inoutProtocol" << endl; + indent(out) << "__inProtocol = inoutProtocol" << '\n'; + indent(out) << "__outProtocol = inoutProtocol" << '\n'; block_close(out); - out << endl; + out << '\n'; indent(out) << "public init(inProtocol: TProtocol, outProtocol: TProtocol)"; block_open(out); - indent(out) << "__inProtocol = inProtocol" << endl; - indent(out) << "__outProtocol = outProtocol" << endl; + indent(out) << "__inProtocol = inProtocol" << '\n'; + indent(out) << "__outProtocol = outProtocol" << '\n'; block_close(out); - out << endl; + out << '\n'; } block_close(out); - out << endl; + out << '\n'; } /** @@ -1736,24 +1734,24 @@ void t_swift_generator::generate_swift_service_client_async(ostream& out, t_serv out << " /* , " << tservice->get_name() << " */"; block_open(out); - out << endl; + out << '\n'; } else { indent(out) << "public class " << tservice->get_name() << "AsyncClient /* : " << tservice->get_name() << " */"; block_open(out); - out << endl; + out << '\n'; - indent(out) << "let __protocolFactory : TProtocolFactory" << endl << endl; - indent(out) << "let __transportFactory : TAsyncTransportFactory" << endl << endl; + indent(out) << "let __protocolFactory : TProtocolFactory" << '\n' << '\n'; + indent(out) << "let __transportFactory : TAsyncTransportFactory" << '\n' << '\n'; indent(out) << "public init(protocolFactory: TProtocolFactory, transportFactory: TAsyncTransportFactory)"; block_open(out); - indent(out) << "__protocolFactory = protocolFactory" << endl; - indent(out) << "__transportFactory = transportFactory" << endl; + indent(out) << "__protocolFactory = protocolFactory" << '\n'; + indent(out) << "__transportFactory = transportFactory" << '\n'; block_close(out); - out << endl; + out << '\n'; } block_close(out); - out << endl; + out << '\n'; } /** @@ -1767,34 +1765,34 @@ void t_swift_generator::generate_swift_service_server(ostream& out, t_service* t indent(out) << "open class " << tservice->get_name() << "Processor /* " << tservice->get_name() << " */"; block_open(out); - out << endl; + out << '\n'; out << indent() << "typealias ProcessorHandlerDictionary = " - << "[String: (Int32, TProtocol, TProtocol, " << tservice->get_name() << ") throws -> Void]" << endl - << endl - << indent() << "public var service: " << tservice->get_name() << endl - << endl + << "[String: (Int32, TProtocol, TProtocol, " << tservice->get_name() << ") throws -> Void]" << '\n' + << '\n' + << indent() << "public var service: " << tservice->get_name() << '\n' + << '\n' << indent() << "public required init(service: " << tservice->get_name() << ")"; } else { indent(out) << "public class " << tservice->get_name() << "Processor : NSObject /* " << tservice->get_name() << " */"; block_open(out); - out << endl; + out << '\n'; out << indent() << "typealias ProcessorHandlerDictionary = " - << "[String: (Int, TProtocol, TProtocol, " << tservice->get_name() << ") throws -> Void]" << endl - << endl - << indent() << "let service : " << tservice->get_name() << endl - << endl + << "[String: (Int, TProtocol, TProtocol, " << tservice->get_name() << ") throws -> Void]" << '\n' + << '\n' + << indent() << "let service : " << tservice->get_name() << '\n' + << '\n' << indent() << "public init(service: " << tservice->get_name() << ")"; } block_open(out); - indent(out) << "self.service = service" << endl; + indent(out) << "self.service = service" << '\n'; block_close(out); - out << endl; + out << '\n'; block_close(out); - out << endl; + out << '\n'; } /** @@ -1831,7 +1829,7 @@ void t_swift_generator::generate_swift_service_client_send_function_implementati // Serialize the request indent(out) << "try outProtocol.writeMessageBegin(name: \"" << funname << "\", " << "type: " << (tfunction->is_oneway() ? ".oneway" : ".call") << ", " - << "sequenceID: 0)" << endl; + << "sequenceID: 0)" << '\n'; indent(out) << "let args = " << argsname << "("; @@ -1847,18 +1845,18 @@ void t_swift_generator::generate_swift_service_client_send_function_implementati out << ", "; } } - out << ")" << endl; - indent(out) << "try args.write(to: outProtocol)" << endl; - indent(out) << "try outProtocol.writeMessageEnd()" << endl; + out << ")" << '\n'; + indent(out) << "try args.write(to: outProtocol)" << '\n'; + indent(out) << "try outProtocol.writeMessageEnd()" << '\n'; } else { - out << endl; + out << '\n'; // Serialize the request indent(out) << "try __outProtocol.writeMessageBeginWithName(\"" << funname << "\", " << "type: " << (tfunction->is_oneway() ? ".ONEWAY" : ".CALL") << ", " - << "sequenceID: 0)" << endl; + << "sequenceID: 0)" << '\n'; - out << endl; + out << '\n'; indent(out) << "let __args = " << argsname << "("; @@ -1874,13 +1872,13 @@ void t_swift_generator::generate_swift_service_client_send_function_implementati out << ", "; } } - out << ")" << endl; - indent(out) << "try " << argsname << ".writeValue(__args, toProtocol: __outProtocol)" << endl << endl; - indent(out) << "try __outProtocol.writeMessageEnd()" << endl; + out << ")" << '\n'; + indent(out) << "try " << argsname << ".writeValue(__args, toProtocol: __outProtocol)" << '\n' << '\n'; + indent(out) << "try __outProtocol.writeMessageEnd()" << '\n'; } block_close(out); - out << endl; + out << '\n'; } /** @@ -1913,7 +1911,7 @@ void t_swift_generator::generate_swift_service_client_recv_function_implementati // check for an exception - indent(out) << "try inProtocol.readResultMessageBegin() " << endl; + indent(out) << "try inProtocol.readResultMessageBegin() " << '\n'; string resultname = function_result_helper_struct_type(tservice, tfunction); indent(out); @@ -1924,15 +1922,15 @@ void t_swift_generator::generate_swift_service_client_recv_function_implementati } string return_type_name = type_name(tfunction->get_returntype()); - out << "try " << resultname << ".read(from: inProtocol)" << endl; + out << "try " << resultname << ".read(from: inProtocol)" << '\n'; - indent(out) << "try inProtocol.readMessageEnd()" << endl << endl; + indent(out) << "try inProtocol.readMessageEnd()" << '\n' << '\n'; // Careful, only return _result if not a void function if (!tfunction->get_returntype()->is_void()) { indent(out) << "if let success = result.success"; block_open(out); - indent(out) << "return success" << endl; + indent(out) << "return success" << '\n'; block_close(out); } @@ -1943,14 +1941,14 @@ void t_swift_generator::generate_swift_service_client_recv_function_implementati for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { indent(out) << "if let " << (*x_iter)->get_name() << " = result." << (*x_iter)->get_name(); block_open(out); - indent(out) << "throw " << (*x_iter)->get_name() << endl; + indent(out) << "throw " << (*x_iter)->get_name() << '\n'; block_close(out); } // If you get here it's an exception, unless a void function if (!tfunction->get_returntype()->is_void()) { indent(out) << "throw TApplicationError(error: .missingResult(methodName: \"" - << tfunction->get_name() << "\"))" << endl; + << tfunction->get_name() << "\"))" << '\n'; } } else { if (needs_protocol) { @@ -1966,22 +1964,22 @@ void t_swift_generator::generate_swift_service_client_recv_function_implementati block_open(out); // check for an exception - out << endl; - indent(out) << "try __inProtocol.readResultMessageBegin() " << endl << endl; + out << '\n'; + indent(out) << "try __inProtocol.readResultMessageBegin() " << '\n' << '\n'; string resultname = function_result_helper_struct_type(tservice, tfunction); indent(out); if (!tfunction->get_returntype()->is_void() || !tfunction->get_xceptions()->get_members().empty()) { out << "let __result = "; } - out << "try " << resultname << ".readValueFromProtocol(__inProtocol)" << endl << endl; + out << "try " << resultname << ".readValueFromProtocol(__inProtocol)" << '\n' << '\n'; - indent(out) << "try __inProtocol.readMessageEnd()" << endl << endl; + indent(out) << "try __inProtocol.readMessageEnd()" << '\n' << '\n'; // Careful, only return _result if not a void function if (!tfunction->get_returntype()->is_void()) { indent(out) << "if let __success = __result.success"; block_open(out); - indent(out) << "return __success" << endl; + indent(out) << "return __success" << '\n'; block_close(out); } @@ -1992,24 +1990,24 @@ void t_swift_generator::generate_swift_service_client_recv_function_implementati for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { indent(out) << "if let " << (*x_iter)->get_name() << " = __result." << (*x_iter)->get_name(); block_open(out); - indent(out) << "throw " << (*x_iter)->get_name() << endl; + indent(out) << "throw " << (*x_iter)->get_name() << '\n'; block_close(out); } // If you get here it's an exception, unless a void function if (!tfunction->get_returntype()->is_void()) { - indent(out) << "throw NSError(" << endl; + indent(out) << "throw NSError(" << '\n'; indent_up(); - indent(out) << "domain: TApplicationErrorDomain, " << endl; - indent(out) << "code: Int(TApplicationError.MissingResult.rawValue)," << endl; - indent(out) << "userInfo: [TApplicationErrorMethodKey: \"" << tfunction->get_name() << "\"])" << endl; + indent(out) << "domain: TApplicationErrorDomain, " << '\n'; + indent(out) << "code: Int(TApplicationError.MissingResult.rawValue)," << '\n'; + indent(out) << "userInfo: [TApplicationErrorMethodKey: \"" << tfunction->get_name() << "\"])" << '\n'; indent_down(); } } // Close function block_close(out); - out << endl; + out << '\n'; } /** @@ -2035,7 +2033,7 @@ void t_swift_generator::generate_swift_service_client_send_function_invocation(o } } - out << ")" << endl; + out << ")" << '\n'; } /** @@ -2061,7 +2059,7 @@ void t_swift_generator::generate_swift_service_client_send_async_function_invoca out << ", " << (*f_iter)->get_name() << ": " << (*f_iter)->get_name(); } - out << ")" << endl; + out << ")" << '\n'; } /** @@ -2075,7 +2073,7 @@ void t_swift_generator::generate_swift_service_client_implementation(ostream& ou string name = tservice->get_name() + "Client"; indent(out) << "extension " << name << " : " << tservice->get_name(); block_open(out); - out << endl; + out << '\n'; // generate client method implementations vector functions = tservice->get_functions(); @@ -2092,28 +2090,28 @@ void t_swift_generator::generate_swift_service_client_implementation(ostream& ou indent(out) << "public " << function_signature(*f_iter); block_open(out); - if (gen_cocoa_) { out << endl; } + if (gen_cocoa_) { out << '\n'; } generate_swift_service_client_send_function_invocation(out, *f_iter); if (!gen_cocoa_) { - indent(out) << "try outProtocol.transport.flush()" << endl; + indent(out) << "try outProtocol.transport.flush()" << '\n'; } else { - out << endl; - indent(out) << "try __outProtocol.transport().flush()" << endl << endl; + out << '\n'; + indent(out) << "try __outProtocol.transport().flush()" << '\n' << '\n'; } if (!(*f_iter)->is_oneway()) { if ((*f_iter)->get_returntype()->is_void()) { - indent(out) << "try recv_" << (*f_iter)->get_name() << "()" << endl; + indent(out) << "try recv_" << (*f_iter)->get_name() << "()" << '\n'; } else { - indent(out) << "return try recv_" << (*f_iter)->get_name() << "()" << endl; + indent(out) << "return try recv_" << (*f_iter)->get_name() << "()" << '\n'; } } block_close(out); - out << endl; + out << '\n'; } block_close(out); - out << endl; + out << '\n'; } /** @@ -2131,7 +2129,7 @@ void t_swift_generator::generate_swift_service_client_async_implementation(ostre indent(out) << "extension " << name << " : " << protocol_name; block_open(out); - out << endl; + out << '\n'; // generate client method implementations vector functions = tservice->get_functions(); @@ -2146,10 +2144,10 @@ void t_swift_generator::generate_swift_service_client_async_implementation(ostre indent(out) << "public " << async_function_signature(*f_iter); block_open(out); - out << endl; - out << indent() << "let transport = factory.newTransport()" << endl - << indent() << "let proto = Protocol(on: transport)" << endl - << endl; + out << '\n'; + out << indent() << "let transport = factory.newTransport()" << '\n' + << indent() << "let proto = Protocol(on: transport)" << '\n' + << '\n'; out << indent() << "do"; block_open(out); @@ -2157,12 +2155,12 @@ void t_swift_generator::generate_swift_service_client_async_implementation(ostre generate_swift_service_client_send_async_function_invocation(out, *f_iter); indent_down(); - out << indent() << "} catch let error {" << endl; + out << indent() << "} catch let error {" << '\n'; indent_up(); - out << indent() << "completion(.error(error))" << endl; + out << indent() << "completion(.error(error))" << '\n'; block_close(out); - out << endl; + out << '\n'; bool ret_is_void = (*f_iter)->get_returntype()->is_void(); bool is_oneway = (*f_iter)->is_oneway(); @@ -2170,10 +2168,10 @@ void t_swift_generator::generate_swift_service_client_async_implementation(ostre string error_completion_call = "completion(.error(error))"; indent(out) << "transport.flush"; block_open(out); - out << indent() << "(trans, error) in" << endl << endl; + out << indent() << "(trans, error) in" << '\n' << '\n'; out << indent() << "if let error = error"; block_open(out); - out << indent() << error_completion_call << endl; + out << indent() << error_completion_call << '\n'; block_close(out); if (!is_oneway) { @@ -2183,24 +2181,24 @@ void t_swift_generator::generate_swift_service_client_async_implementation(ostre if (!ret_is_void) { out << "let result = "; } - out << "try self.recv_" << (*f_iter)->get_name() << "(on: proto)" << endl; + out << "try self.recv_" << (*f_iter)->get_name() << "(on: proto)" << '\n'; - out << indent() << (ret_is_void ? "completion(.success(Void()))" : "completion(.success(result))") << endl; + out << indent() << (ret_is_void ? "completion(.success(Void()))" : "completion(.success(result))") << '\n'; indent_down(); - out << indent() << "} catch let error {" << endl; + out << indent() << "} catch let error {" << '\n'; indent_up(); - out << indent() << error_completion_call << endl; + out << indent() << error_completion_call << '\n'; block_close(out); } else { - out << indent() << "completion(.success(Void()))" << endl; + out << indent() << "completion(.success(Void()))" << '\n'; } block_close(out); block_close(out); } block_close(out); - out << endl; + out << '\n'; } void t_swift_generator::generate_old_swift_service_client_async_implementation(ostream& out, @@ -2211,7 +2209,7 @@ void t_swift_generator::generate_old_swift_service_client_async_implementation(o indent(out) << "extension " << name << " : " << protocol_name; block_open(out); - out << endl; + out << '\n'; // generate client method implementations vector functions = tservice->get_functions(); @@ -2226,19 +2224,19 @@ void t_swift_generator::generate_old_swift_service_client_async_implementation(o indent(out) << "public " << async_function_signature(*f_iter); block_open(out); - out << endl; + out << '\n'; - out << indent() << "let __transport = __transportFactory.newTransport()" << endl - << indent() << "let __protocol = __protocolFactory.newProtocolOnTransport(__transport)" << endl - << endl; + out << indent() << "let __transport = __transportFactory.newTransport()" << '\n' + << indent() << "let __protocol = __protocolFactory.newProtocolOnTransport(__transport)" << '\n' + << '\n'; generate_swift_service_client_send_async_function_invocation(out, *f_iter); - out << endl; + out << '\n'; indent(out) << "__transport.flushWithCompletion("; if ((*f_iter)->is_oneway()) { - out << "success, failure: failure)" << endl; + out << "success, failure: failure)" << '\n'; } else { block_open(out); @@ -2249,25 +2247,25 @@ void t_swift_generator::generate_old_swift_service_client_async_implementation(o if (!(*f_iter)->get_returntype()->is_void()) { out << "let result = "; } - out << "try self.recv_" << (*f_iter)->get_name() << "(__protocol)" << endl; + out << "try self.recv_" << (*f_iter)->get_name() << "(__protocol)" << '\n'; out << indent() << "success("; if (!(*f_iter)->get_returntype()->is_void()) { out << "result"; } - out << ")" << endl; + out << ")" << '\n'; block_close(out); indent(out) << "catch let error"; block_open(out); - indent(out) << "failure(error as NSError)" << endl; + indent(out) << "failure(error as NSError)" << '\n'; block_close(out); block_close(out); - indent(out) << ", failure: failure)" << endl; + indent(out) << ", failure: failure)" << '\n'; } block_close(out); - out << endl; + out << '\n'; // Promise function if (promise_kit_) { @@ -2275,17 +2273,17 @@ void t_swift_generator::generate_old_swift_service_client_async_implementation(o indent(out) << "public " << promise_function_signature(*f_iter); block_open(out); - out << indent() << "let (__promise, __fulfill, __reject) = Promise<" << type_name((*f_iter)->get_returntype()) << ">.pendingPromise()" << endl << endl - << indent() << "let __transport = __transportFactory.newTransport()" << endl - << indent() << "let __protocol = __protocolFactory.newProtocolOnTransport(__transport)" << endl - << endl; + out << indent() << "let (__promise, __fulfill, __reject) = Promise<" << type_name((*f_iter)->get_returntype()) << ">.pendingPromise()" << '\n' << '\n' + << indent() << "let __transport = __transportFactory.newTransport()" << '\n' + << indent() << "let __protocol = __protocolFactory.newProtocolOnTransport(__transport)" << '\n' + << '\n'; generate_swift_service_client_send_async_function_invocation(out, *f_iter); - out << endl; + out << '\n'; indent(out) << "__transport.flushWithCompletion("; if ((*f_iter)->is_oneway()) { - out << "{ __fulfill() }, failure: { __reject($0) })" << endl; + out << "{ __fulfill() }, failure: { __reject($0) })" << '\n'; } else { block_open(out); @@ -2296,37 +2294,37 @@ void t_swift_generator::generate_old_swift_service_client_async_implementation(o if (!(*f_iter)->get_returntype()->is_void()) { out << "let result = "; } - out << "try self.recv_" << (*f_iter)->get_name() << "(__protocol)" << endl; + out << "try self.recv_" << (*f_iter)->get_name() << "(__protocol)" << '\n'; out << indent() << "__fulfill("; if (!(*f_iter)->get_returntype()->is_void()) { out << "result"; } - out << ")" << endl; + out << ")" << '\n'; block_close(out); indent(out) << "catch let error"; block_open(out); - indent(out) << "__reject(error)" << endl; + indent(out) << "__reject(error)" << '\n'; block_close(out); block_close(out); - indent(out) << ", failure: { error in " << endl; + indent(out) << ", failure: { error in " << '\n'; indent_up(); - indent(out) << "__reject(error)" << endl; + indent(out) << "__reject(error)" << '\n'; indent_down(); - indent(out) << "})" << endl; + indent(out) << "})" << '\n'; } - indent(out) << "return __promise" << endl; + indent(out) << "return __promise" << '\n'; block_close(out); - out << endl; + out << '\n'; } } block_close(out); - out << endl; + out << '\n'; } /** @@ -2345,12 +2343,12 @@ void t_swift_generator::generate_swift_service_server_implementation(ostream& ou indent(out) << "extension " << name << " : TProcessor"; block_open(out); - out << endl; + out << '\n'; indent(out) << "static let processorHandlers" << (gen_cocoa_ ? " " : "") << ": ProcessorHandlerDictionary ="; block_open(out); - out << endl; - out << indent() << "var processorHandlers = ProcessorHandlerDictionary()" << endl << endl; + out << '\n'; + out << indent() << "var processorHandlers = ProcessorHandlerDictionary()" << '\n' << '\n'; // generate method map for routing incoming calls vector functions = tservice->get_functions(); @@ -2361,25 +2359,25 @@ void t_swift_generator::generate_swift_service_server_implementation(ostream& ou string args_type = function_args_helper_struct_type(tservice, *f_iter); - out << indent() << "processorHandlers[\"" << tfunction->get_name() << "\"] = { sequenceID, inProtocol, outProtocol, handler in" << endl - << endl; + out << indent() << "processorHandlers[\"" << tfunction->get_name() << "\"] = { sequenceID, inProtocol, outProtocol, handler in" << '\n' + << '\n'; indent_up(); if (!gen_cocoa_) { - out << indent() << "let args = try " << args_type << ".read(from: inProtocol)" << endl - << endl - << indent() << "try inProtocol.readMessageEnd()" << endl - << endl; + out << indent() << "let args = try " << args_type << ".read(from: inProtocol)" << '\n' + << '\n' + << indent() << "try inProtocol.readMessageEnd()" << '\n' + << '\n'; } else { - out << indent() << "let args = try " << args_type << ".readValueFromProtocol(inProtocol)" << endl - << endl - << indent() << "try inProtocol.readMessageEnd()" << endl - << endl; + out << indent() << "let args = try " << args_type << ".readValueFromProtocol(inProtocol)" << '\n' + << '\n' + << indent() << "try inProtocol.readMessageEnd()" << '\n' + << '\n'; } if (!tfunction->is_oneway() ) { string result_type = function_result_helper_struct_type(tservice, tfunction); - indent(out) << "var result = " << result_type << "()" << endl; + indent(out) << "var result = " << result_type << "()" << '\n'; indent(out) << "do"; block_open(out); @@ -2406,7 +2404,7 @@ void t_swift_generator::generate_swift_service_server_implementation(ostream& ou } } - out << ")" << endl; + out << ")" << '\n'; block_close(out); t_struct* xs = tfunction->get_xceptions(); @@ -2423,37 +2421,37 @@ void t_swift_generator::generate_swift_service_server_implementation(ostream& ou } out << (*x_iter)->get_type()->get_name(); - out << " { result." << (*x_iter)->get_name() << " = error }" << endl; + out << " { result." << (*x_iter)->get_name() << " = error }" << '\n'; } - indent(out) << "catch let error { throw error }" << endl; - out << endl; + indent(out) << "catch let error { throw error }" << '\n'; + out << '\n'; if (!tfunction->is_oneway()) { - out << indent() << "try outProtocol.writeMessageBegin(name: \"" << tfunction->get_name() << "\", type: .reply, sequenceID: sequenceID)" << endl - << indent() << "try result.write(to: outProtocol)" << endl - << indent() << "try outProtocol.writeMessageEnd()" << endl - << indent() << "try outProtocol.transport.flush()" << endl; + out << indent() << "try outProtocol.writeMessageBegin(name: \"" << tfunction->get_name() << "\", type: .reply, sequenceID: sequenceID)" << '\n' + << indent() << "try result.write(to: outProtocol)" << '\n' + << indent() << "try outProtocol.writeMessageEnd()" << '\n' + << indent() << "try outProtocol.transport.flush()" << '\n'; } } else { for (x_iter = xfields.begin(); x_iter != xfields.end(); ++x_iter) { indent(out) << "catch let error as " << (*x_iter)->get_type()->get_name(); block_open(out); - indent(out) << "result." << (*x_iter)->get_name() << " = error" << endl; + indent(out) << "result." << (*x_iter)->get_name() << " = error" << '\n'; block_close(out); } indent(out) << "catch let error"; block_open(out); - out << indent() << "throw error" << endl; + out << indent() << "throw error" << '\n'; block_close(out); - out << endl; + out << '\n'; if (!tfunction->is_oneway()) { - out << indent() << "try outProtocol.writeMessageBeginWithName(\"" << tfunction->get_name() << "\", type: .REPLY, sequenceID: sequenceID)" << endl - << indent() << "try " << result_type << ".writeValue(result, toProtocol: outProtocol)" << endl - << indent() << "try outProtocol.writeMessageEnd()" << endl; + out << indent() << "try outProtocol.writeMessageBeginWithName(\"" << tfunction->get_name() << "\", type: .REPLY, sequenceID: sequenceID)" << '\n' + << indent() << "try " << result_type << ".writeValue(result, toProtocol: outProtocol)" << '\n' + << indent() << "try outProtocol.writeMessageEnd()" << '\n'; } } } @@ -2461,11 +2459,11 @@ void t_swift_generator::generate_swift_service_server_implementation(ostream& ou } - indent(out) << "return processorHandlers" << endl; + indent(out) << "return processorHandlers" << '\n'; block_close(out,false); - out << "()" << endl; - out << endl; + out << "()" << '\n'; + out << '\n'; if (!gen_cocoa_) { indent(out) << "public func process(on inProtocol: TProtocol, outProtocol: TProtocol) throws"; @@ -2474,47 +2472,47 @@ void t_swift_generator::generate_swift_service_server_implementation(ostream& ou } block_open(out); - out << endl; - out << indent() << "let (messageName, _, sequenceID) = try inProtocol.readMessageBegin()" << endl - << endl + out << '\n'; + out << indent() << "let (messageName, _, sequenceID) = try inProtocol.readMessageBegin()" << '\n' + << '\n' << indent() << "if let processorHandler = " << name << ".processorHandlers[messageName]"; block_open(out); out << indent() << "do"; block_open(out); - out << indent() << "try processorHandler(sequenceID, inProtocol, outProtocol, service)" << endl; + out << indent() << "try processorHandler(sequenceID, inProtocol, outProtocol, service)" << '\n'; block_close(out); if (!gen_cocoa_) { out << indent() << "catch let error as TApplicationError"; block_open(out); - out << indent() << "try outProtocol.writeException(messageName: messageName, sequenceID: sequenceID, ex: error)" << endl - << indent() << "try outProtocol.transport.flush()" << endl; + out << indent() << "try outProtocol.writeException(messageName: messageName, sequenceID: sequenceID, ex: error)" << '\n' + << indent() << "try outProtocol.transport.flush()" << '\n'; block_close(out); block_close(out); out << indent() << "else"; block_open(out); - out << indent() << "try inProtocol.skip(type: .struct)" << endl - << indent() << "try inProtocol.readMessageEnd()" << endl - << indent() << "let ex = TApplicationError(error: .unknownMethod(methodName: messageName))" << endl - << indent() << "try outProtocol.writeException(messageName: messageName, sequenceID: sequenceID, ex: ex)" << endl - << indent() << "try outProtocol.transport.flush()" << endl; + out << indent() << "try inProtocol.skip(type: .struct)" << '\n' + << indent() << "try inProtocol.readMessageEnd()" << '\n' + << indent() << "let ex = TApplicationError(error: .unknownMethod(methodName: messageName))" << '\n' + << indent() << "try outProtocol.writeException(messageName: messageName, sequenceID: sequenceID, ex: ex)" << '\n' + << indent() << "try outProtocol.transport.flush()" << '\n'; } else { out << indent() << "catch let error as NSError"; block_open(out); - out << indent() << "try outProtocol.writeExceptionForMessageName(messageName, sequenceID: sequenceID, ex: error)" << endl; + out << indent() << "try outProtocol.writeExceptionForMessageName(messageName, sequenceID: sequenceID, ex: error)" << '\n'; block_close(out); block_close(out); out << indent() << "else"; block_open(out); - out << indent() << "try inProtocol.skipType(.STRUCT)" << endl - << indent() << "try inProtocol.readMessageEnd()" << endl - << indent() << "try outProtocol.writeExceptionForMessageName(messageName," << endl; + out << indent() << "try inProtocol.skipType(.STRUCT)" << '\n' + << indent() << "try inProtocol.readMessageEnd()" << '\n' + << indent() << "try outProtocol.writeExceptionForMessageName(messageName," << '\n'; indent_up(); - out << indent() << "sequenceID: sequenceID," << endl - << indent() << "ex: NSError(" << endl; + out << indent() << "sequenceID: sequenceID," << '\n' + << indent() << "ex: NSError(" << '\n'; indent_up(); - out << indent() << "domain: TApplicationErrorDomain, " << endl - << indent() << "code: Int(TApplicationError.UnknownMethod.rawValue), " << endl - << indent() << "userInfo: [TApplicationErrorMethodKey: messageName]))" << endl; + out << indent() << "domain: TApplicationErrorDomain, " << '\n' + << indent() << "code: Int(TApplicationError.UnknownMethod.rawValue), " << '\n' + << indent() << "userInfo: [TApplicationErrorMethodKey: messageName]))" << '\n'; indent_down(); indent_down(); } @@ -2522,7 +2520,7 @@ void t_swift_generator::generate_swift_service_server_implementation(ostream& ou block_close(out); block_close(out); block_close(out); - out << endl; + out << '\n'; } /** @@ -2812,27 +2810,27 @@ void t_swift_generator::function_docstring(ostream& out, t_function* tfunction) // Description string doc = tfunction->get_doc(); generate_docstring(out, doc); - indent(out) << "///" << endl; + indent(out) << "///" << '\n'; // Parameters const vector& fields = tfunction->get_arglist()->get_members(); vector::const_iterator f_iter; if (!fields.empty()) { - indent(out) << "/// - Parameters:" << endl; + indent(out) << "/// - Parameters:" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { indent(out) << "/// - " << (*f_iter)->get_name() << ": "; string doc = (*f_iter)->get_doc(); if (!doc.empty() && doc[doc.length()-1] == '\n') { doc.erase(doc.length()-1); } - out << doc << endl; + out << doc << '\n'; } } // Returns t_type* ttype = tfunction->get_returntype(); if (!ttype->is_void()) { - indent(out) << "/// - Returns: " << type_name(ttype) << endl; + indent(out) << "/// - Returns: " << type_name(ttype) << '\n'; } // Throws @@ -2845,7 +2843,7 @@ void t_swift_generator::function_docstring(ostream& out, t_function* tfunction) if (*x_iter != xceptions.back()) { out << ", "; } } - out << endl; + out << '\n'; } /** @@ -2865,20 +2863,20 @@ void t_swift_generator::async_function_docstring(ostream& out, t_function* tfunc // Description string doc = tfunction->get_doc(); generate_docstring(out, doc); - indent(out) << "///" << endl; + indent(out) << "///" << '\n'; // Parameters const vector& fields = tfunction->get_arglist()->get_members(); vector::const_iterator f_iter; if (!fields.empty()) { - indent(out) << "/// - Parameters:" << endl; + indent(out) << "/// - Parameters:" << '\n'; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { indent(out) << "/// - " << (*f_iter)->get_name() << ": "; string doc = (*f_iter)->get_doc(); if (!doc.empty() && doc[doc.length()-1] == '\n') { doc.erase(doc.length()-1); } - out << doc << endl; + out << doc << '\n'; } } @@ -2894,7 +2892,7 @@ void t_swift_generator::async_function_docstring(ostream& out, t_function* tfunc out << ", "; } } - out << endl; + out << '\n'; } /** diff --git a/compiler/cpp/src/thrift/generate/t_xml_generator.cc b/compiler/cpp/src/thrift/generate/t_xml_generator.cc index 68675cfa157..86c2718cb25 100644 --- a/compiler/cpp/src/thrift/generate/t_xml_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_xml_generator.cc @@ -39,9 +39,6 @@ using std::vector; using std::stack; using std::set; -static const string endl = "\n"; -static const string quot = "\""; - static const string default_ns_prefix = "http://thrift.apache.org/xml/ns/"; /** @@ -196,7 +193,7 @@ void t_xml_generator::write_xml_comment(string msg) { close_top_element(); // TODO: indent any EOLs that may occur with msg // TODO: proper msg escaping needed? - f_xml_ << indent() << "" << endl; + f_xml_ << indent() << "" << '\n'; top_element_is_empty = false; } @@ -204,7 +201,7 @@ void t_xml_generator::close_top_element() { if( top_element_is_open) { top_element_is_open = false; if (elements_.size() > 0 && top_element_is_empty) { - f_xml_ << ">" << endl; + f_xml_ << ">" << '\n'; } } } @@ -224,9 +221,9 @@ void t_xml_generator::write_element_start(string name) { void t_xml_generator::write_element_end() { indent_down(); if (top_element_is_empty && top_element_is_open) { - f_xml_ << " />" << endl; + f_xml_ << " />" << '\n'; } else { - f_xml_ << indent() << "" << endl; + f_xml_ << indent() << "" << '\n'; } top_element_is_empty = false; elements_.pop(); @@ -248,7 +245,7 @@ void t_xml_generator::write_element_string(string name, string val) { top_element_is_empty = false; f_xml_ << indent() << "<" << name << ">" << escape_xml_string(val) << "" - << endl; + << '\n'; } string t_xml_generator::escape_xml_string(const string& input) { @@ -511,7 +508,7 @@ void t_xml_generator::write_const_value(t_const_value* value) { default: indent_up(); - f_xml_ << indent() << "" << endl; + f_xml_ << indent() << "" << '\n'; indent_down(); break; } diff --git a/compiler/cpp/src/thrift/generate/t_xsd_generator.cc b/compiler/cpp/src/thrift/generate/t_xsd_generator.cc index 1f58f3a619f..8dd84f0e13c 100644 --- a/compiler/cpp/src/thrift/generate/t_xsd_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_xsd_generator.cc @@ -36,8 +36,6 @@ using std::string; using std::stringstream; using std::vector; -static const string endl = "\n"; // avoid ostream << std::endl flushes - /** * XSD generator, creates an XSD for the base types etc. * @@ -121,22 +119,22 @@ void t_xsd_generator::init_generator() { string f_php_name = get_out_dir() + program_->get_name() + "_xsd.php"; f_php_.open(f_php_name.c_str()); - f_php_ << "" << endl; + f_php_ << "?>" << '\n'; f_php_.close(); } void t_xsd_generator::generate_typedef(t_typedef* ttypedef) { - indent(s_xsd_types_) << "get_name() << "\">" << endl; + indent(s_xsd_types_) << "get_name() << "\">" << '\n'; indent_up(); indent(s_xsd_types_) << "get_type()) << "\" />" - << endl; + << '\n'; indent_down(); - indent(s_xsd_types_) << "" << endl << endl; + indent(s_xsd_types_) << "" << '\n' << '\n'; } void t_xsd_generator::generate_struct(t_struct* tstruct) { @@ -144,12 +142,12 @@ void t_xsd_generator::generate_struct(t_struct* tstruct) { const vector& members = tstruct->get_members(); bool xsd_all = tstruct->get_xsd_all(); - indent(s_xsd_types_) << "get_name() << "\">" << endl; + indent(s_xsd_types_) << "get_name() << "\">" << '\n'; indent_up(); if (xsd_all) { - indent(s_xsd_types_) << "" << endl; + indent(s_xsd_types_) << "" << '\n'; } else { - indent(s_xsd_types_) << "" << endl; + indent(s_xsd_types_) << "" << '\n'; } indent_up(); @@ -164,12 +162,12 @@ void t_xsd_generator::generate_struct(t_struct* tstruct) { indent_down(); if (xsd_all) { - indent(s_xsd_types_) << "" << endl; + indent(s_xsd_types_) << "" << '\n'; } else { - indent(s_xsd_types_) << "" << endl; + indent(s_xsd_types_) << "" << '\n'; } indent_down(); - indent(s_xsd_types_) << "" << endl << endl; + indent(s_xsd_types_) << "" << '\n' << '\n'; } void t_xsd_generator::generate_element(ostream& out, @@ -185,15 +183,15 @@ void t_xsd_generator::generate_element(ostream& out, string snillable = nillable ? " nillable=\"true\"" : ""; if (ttype->is_void() || ttype->is_list()) { - indent(out) << "" << endl; + indent(out) << "" << '\n'; indent_up(); if (attrs == nullptr && ttype->is_void()) { - indent(out) << "" << endl; + indent(out) << "" << '\n'; } else { - indent(out) << "" << endl; + indent(out) << "" << '\n'; indent_up(); if (ttype->is_list()) { - indent(out) << "" << endl; + indent(out) << "" << '\n'; indent_up(); string subname; t_type* subtype = ((t_list*)ttype)->get_elem_type(); @@ -203,55 +201,55 @@ void t_xsd_generator::generate_element(ostream& out, subname = type_name(subtype); } f_php_ << "$GLOBALS['" << program_->get_name() << "_xsd_elt_" << name << "'] = '" << subname - << "';" << endl; + << "';" << '\n'; generate_element(out, subname, subtype, nullptr, false, false, true); indent_down(); - indent(out) << "" << endl; - indent(out) << "" << endl; + indent(out) << "" << '\n'; + indent(out) << "" << '\n'; } if (attrs != nullptr) { const vector& members = attrs->get_members(); vector::const_iterator a_iter; for (a_iter = members.begin(); a_iter != members.end(); ++a_iter) { indent(out) << "get_name() << "\" type=\"" - << type_name((*a_iter)->get_type()) << "\" />" << endl; + << type_name((*a_iter)->get_type()) << "\" />" << '\n'; } } indent_down(); - indent(out) << "" << endl; + indent(out) << "" << '\n'; } indent_down(); - indent(out) << "" << endl; + indent(out) << "" << '\n'; } else { if (attrs == nullptr) { indent(out) << "" - << endl; + << '\n'; } else { // Wow, all this work for a SIMPLE TYPE with attributes?!?!?! indent(out) << "" - << endl; + << '\n'; indent_up(); - indent(out) << "" << endl; + indent(out) << "" << '\n'; indent_up(); - indent(out) << "" << endl; + indent(out) << "" << '\n'; indent_up(); - indent(out) << "" << endl; + indent(out) << "" << '\n'; indent_up(); const vector& members = attrs->get_members(); vector::const_iterator a_iter; for (a_iter = members.begin(); a_iter != members.end(); ++a_iter) { indent(out) << "get_name() << "\" type=\"" - << type_name((*a_iter)->get_type()) << "\" />" << endl; + << type_name((*a_iter)->get_type()) << "\" />" << '\n'; } indent_down(); - indent(out) << "" << endl; + indent(out) << "" << '\n'; indent_down(); - indent(out) << "" << endl; + indent(out) << "" << '\n'; indent_down(); - indent(out) << "" << endl; + indent(out) << "" << '\n'; indent_down(); - indent(out) << "" << endl; + indent(out) << "" << '\n'; } } } @@ -274,10 +272,10 @@ void t_xsd_generator::generate_service(t_service* tservice) { } // Print the XSD header - f_xsd_ << "" << endl - << "" << endl + f_xsd_ << "" << '\n' + << "" << '\n' << xml_autogen_comment() - << endl; + << '\n'; // Print out the type definitions indent(f_xsd_) << s_xsd_types_.str(); @@ -292,7 +290,7 @@ void t_xsd_generator::generate_service(t_service* tservice) { string elemname = (*f_iter)->get_name() + "_response"; t_type* returntype = (*f_iter)->get_returntype(); generate_element(f_xsd_, elemname, returntype); - f_xsd_ << endl; + f_xsd_ << '\n'; t_struct* xs = (*f_iter)->get_xceptions(); const std::vector& xceptions = xs->get_members(); @@ -308,7 +306,7 @@ void t_xsd_generator::generate_service(t_service* tservice) { } // Close the XSD document - f_xsd_ << endl << "" << endl; + f_xsd_ << '\n' << "" << '\n'; f_xsd_.close(); } diff --git a/compiler/cpp/tests/netcore/t_netcore_generator_helpers_tests.cc b/compiler/cpp/tests/netcore/t_netcore_generator_helpers_tests.cc index 6acedc0f345..348ac9faca9 100644 --- a/compiler/cpp/tests/netcore/t_netcore_generator_helpers_tests.cc +++ b/compiler/cpp/tests/netcore/t_netcore_generator_helpers_tests.cc @@ -5,9 +5,9 @@ // 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 @@ -36,7 +36,8 @@ TEST_CASE("t_netstd_generator::netstd_type_usings() without option wcf should re "using System.Threading;\n" "using System.Threading.Tasks;\n" "using Thrift;\n" - "using Thrift.Collections;\n" + endl; + "using Thrift.Collections;\n" + "\n"; t_program* program = new t_program(path, name); t_netstd_generator* gen = new t_netstd_generator(program, parsed_options, option_string); @@ -65,7 +66,8 @@ TEST_CASE("t_netstd_generator::netstd_type_usings() with option wcf should retur "using Thrift;\n" "using Thrift.Collections;\n" "using System.ServiceModel;\n" - "using System.Runtime.Serialization;\n" + endl; + "using System.Runtime.Serialization;\n" + "\n"; t_program* program = new t_program(path, name); t_netstd_generator* gen = new t_netstd_generator(program, parsed_options, option_string); diff --git a/contrib/fb303/TClientInfo.cpp b/contrib/fb303/TClientInfo.cpp index a4b00cf2d58..c30b42b6122 100644 --- a/contrib/fb303/TClientInfo.cpp +++ b/contrib/fb303/TClientInfo.cpp @@ -149,7 +149,7 @@ void TClientInfoServerHandler::getStatsStrings(vector& result) { char addrBuf[INET6_ADDRSTRLEN]; const char* addrStr = info->getAddr(addrBuf, sizeof addrBuf); if (addrStr == nullptr) { - // cerr << "no addr!" << endl; + // cerr << "no addr!" << '\n'; continue; } @@ -160,7 +160,7 @@ void TClientInfoServerHandler::getStatsStrings(vector& result) { char buf[256]; snprintf(buf, sizeof buf, "%d %s %s %.3f %llu", i, addrStr, callStr, secs, (uint64_t)info->getNCalls()); - + result.push_back(buf); } } diff --git a/contrib/fb303/cpp/ServiceTracker.cpp b/contrib/fb303/cpp/ServiceTracker.cpp index a2e670c768b..43e88474009 100644 --- a/contrib/fb303/cpp/ServiceTracker.cpp +++ b/contrib/fb303/cpp/ServiceTracker.cpp @@ -344,7 +344,7 @@ ServiceTracker::defaultLogMethod(int level, const string &message) break; } cout << '[' << level_string << "] [" << now_pretty << "] " - << message << endl; + << message << '\n'; } } diff --git a/contrib/thrift_dump.cpp b/contrib/thrift_dump.cpp index 59c8ac863f5..01864d08383 100644 --- a/contrib/thrift_dump.cpp +++ b/contrib/thrift_dump.cpp @@ -80,12 +80,12 @@ int main(int argc, char *argv[]) { } } } catch (TProtocolException exn) { - cout << "Protocol Exception: " << exn.what() << endl; + cout << "Protocol Exception: " << exn.what() << '\n'; } catch (...) { oprot->getTransport()->flush(); } - cout << endl; + cout << '\n'; return 0; } diff --git a/contrib/zeromq/test-client.cpp b/contrib/zeromq/test-client.cpp index 159c25030d5..f2bd2133ed8 100644 --- a/contrib/zeromq/test-client.cpp +++ b/contrib/zeromq/test-client.cpp @@ -33,7 +33,7 @@ int main(int argc, char** argv) { usleep(50000); } else { int value = client.get(); - std::cout << value << std::endl; + std::cout << value << '\n'; } return 0; diff --git a/lib/c_glib/test/testthrifttestclient.cpp b/lib/c_glib/test/testthrifttestclient.cpp index 77daf3d37fa..5e0c89471d4 100644 --- a/lib/c_glib/test/testthrifttestclient.cpp +++ b/lib/c_glib/test/testthrifttestclient.cpp @@ -51,7 +51,6 @@ using namespace apache::thrift::transport; using namespace thrift::test; using std::cout; -using std::endl; using std::fixed; using std::make_pair; using std::map; @@ -76,51 +75,51 @@ class TestHandler : public ThriftTestIf { TestHandler() = default; void testVoid() override { - cout << "[C -> C++] testVoid()" << endl; + cout << "[C -> C++] testVoid()" << '\n'; } void testString(string& out, const string &thing) override { - cout << "[C -> C++] testString(\"" << thing << "\")" << endl; + cout << "[C -> C++] testString(\"" << thing << "\")" << '\n'; out = thing; } bool testBool(const bool thing) override { - cout << "[C -> C++] testBool(" << (thing ? "true" : "false") << ")" << endl; + cout << "[C -> C++] testBool(" << (thing ? "true" : "false") << ")" << '\n'; return thing; } int8_t testByte(const int8_t thing) override { - cout << "[C -> C++] testByte(" << (int)thing << ")" << endl; + cout << "[C -> C++] testByte(" << (int)thing << ")" << '\n'; return thing; } int32_t testI32(const int32_t thing) override { - cout << "[C -> C++] testI32(" << thing << ")" << endl; + cout << "[C -> C++] testI32(" << thing << ")" << '\n'; return thing; } int64_t testI64(const int64_t thing) override { - cout << "[C -> C++] testI64(" << thing << ")" << endl; + cout << "[C -> C++] testI64(" << thing << ")" << '\n'; return thing; } double testDouble(const double thing) override { cout.precision(6); - cout << "[C -> C++] testDouble(" << fixed << thing << ")" << endl; + cout << "[C -> C++] testDouble(" << fixed << thing << ")" << '\n'; return thing; } void testBinary(string& out, const string &thing) override { - cout << "[C -> C++] testBinary(\"" << thing << "\")" << endl; + cout << "[C -> C++] testBinary(\"" << thing << "\")" << '\n'; out = thing; } void testStruct(Xtruct& out, const Xtruct &thing) override { - cout << "[C -> C++] testStruct({\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "})" << endl; + cout << "[C -> C++] testStruct({\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "})" << '\n'; out = thing; } void testNest(Xtruct2& out, const Xtruct2& nest) override { const Xtruct &thing = nest.struct_thing; - cout << "[C -> C++] testNest({" << (int)nest.byte_thing << ", {\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "}, " << nest.i32_thing << "})" << endl; + cout << "[C -> C++] testNest({" << (int)nest.byte_thing << ", {\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "}, " << nest.i32_thing << "})" << '\n'; out = nest; } @@ -136,7 +135,7 @@ class TestHandler : public ThriftTestIf { } cout << m_iter->first << " => " << m_iter->second; } - cout << "})" << endl; + cout << "})" << '\n'; out = thing; } @@ -152,7 +151,7 @@ class TestHandler : public ThriftTestIf { } cout << "\"" << m_iter->first << "\" => \"" << m_iter->second << "\""; } - cout << "})" << endl; + cout << "})" << '\n'; out = thing; } @@ -169,7 +168,7 @@ class TestHandler : public ThriftTestIf { } cout << *s_iter; } - cout << "})" << endl; + cout << "})" << '\n'; out = thing; } @@ -185,21 +184,21 @@ class TestHandler : public ThriftTestIf { } cout << *l_iter; } - cout << "})" << endl; + cout << "})" << '\n'; out = thing; } Numberz::type testEnum(const Numberz::type thing) override { - cout << "[C -> C++] testEnum(" << thing << ")" << endl; + cout << "[C -> C++] testEnum(" << thing << ")" << '\n'; return thing; } UserId testTypedef(const UserId thing) override { - cout << "[C -> C++] testTypedef(" << thing << ")" << endl; + cout << "[C -> C++] testTypedef(" << thing << ")" << '\n'; return thing; } void testMapMap(map > &mapmap, const int32_t hello) override { - cout << "[C -> C++] testMapMap(" << hello << ")" << endl; + cout << "[C -> C++] testMapMap(" << hello << ")" << '\n'; map pos; map neg; @@ -216,7 +215,7 @@ class TestHandler : public ThriftTestIf { void testInsanity(map > &insane, const Insanity &argument) override { THRIFT_UNUSED_VARIABLE (argument); - cout << "[C -> C++] testInsanity()" << endl; + cout << "[C -> C++] testInsanity()" << '\n'; Xtruct hello; hello.string_thing = "Hello2"; @@ -278,7 +277,7 @@ class TestHandler : public ThriftTestIf { } cout << "}, "; } - cout << "}" << endl; + cout << "}" << '\n'; } @@ -288,7 +287,7 @@ class TestHandler : public ThriftTestIf { THRIFT_UNUSED_VARIABLE (arg4); THRIFT_UNUSED_VARIABLE (arg5); - cout << "[C -> C++] testMulti()" << endl; + cout << "[C -> C++] testMulti()" << '\n'; hello.string_thing = "Hello2"; hello.byte_thing = arg0; @@ -299,7 +298,7 @@ class TestHandler : public ThriftTestIf { void testException(const std::string &arg) noexcept(false) override { - cout << "[C -> C++] testException(" << arg << ")" << endl; + cout << "[C -> C++] testException(" << arg << ")" << '\n'; if (arg.compare("Xception") == 0) { Xception e; e.errorCode = 1001; @@ -317,7 +316,7 @@ class TestHandler : public ThriftTestIf { void testMultiException(Xtruct &result, const std::string &arg0, const std::string &arg1) noexcept(false) override { - cout << "[C -> C++] testMultiException(" << arg0 << ", " << arg1 << ")" << endl; + cout << "[C -> C++] testMultiException(" << arg0 << ", " << arg1 << ")" << '\n'; if (arg0.compare("Xception") == 0) { Xception e; @@ -336,9 +335,9 @@ class TestHandler : public ThriftTestIf { } void testOneway(int sleepFor) override { - cout << "testOneway(" << sleepFor << "): Sleeping..." << endl; + cout << "testOneway(" << sleepFor << "): Sleeping..." << '\n'; sleep(sleepFor); - cout << "testOneway(" << sleepFor << "): done sleeping!" << endl; + cout << "testOneway(" << sleepFor << "): done sleeping!" << '\n'; } }; diff --git a/lib/c_glib/test/testthrifttestzlibclient.cpp b/lib/c_glib/test/testthrifttestzlibclient.cpp index 5c4b931570d..307fd4f5f01 100644 --- a/lib/c_glib/test/testthrifttestzlibclient.cpp +++ b/lib/c_glib/test/testthrifttestzlibclient.cpp @@ -46,7 +46,6 @@ using namespace apache::thrift::transport; using namespace thrift::test; using std::cout; -using std::endl; using std::fixed; using std::make_pair; using std::map; @@ -71,51 +70,51 @@ class TestHandler : public ThriftTestIf { TestHandler() = default; void testVoid() override { - cout << "[C -> C++] testVoid()" << endl; + cout << "[C -> C++] testVoid()" << '\n'; } void testString(string& out, const string &thing) override { - cout << "[C -> C++] testString(\"" << thing << "\")" << endl; + cout << "[C -> C++] testString(\"" << thing << "\")" << '\n'; out = thing; } bool testBool(const bool thing) override { - cout << "[C -> C++] testBool(" << (thing ? "true" : "false") << ")" << endl; + cout << "[C -> C++] testBool(" << (thing ? "true" : "false") << ")" << '\n'; return thing; } int8_t testByte(const int8_t thing) override { - cout << "[C -> C++] testByte(" << (int)thing << ")" << endl; + cout << "[C -> C++] testByte(" << (int)thing << ")" << '\n'; return thing; } int32_t testI32(const int32_t thing) override { - cout << "[C -> C++] testI32(" << thing << ")" << endl; + cout << "[C -> C++] testI32(" << thing << ")" << '\n'; return thing; } int64_t testI64(const int64_t thing) override { - cout << "[C -> C++] testI64(" << thing << ")" << endl; + cout << "[C -> C++] testI64(" << thing << ")" << '\n'; return thing; } double testDouble(const double thing) override { cout.precision(6); - cout << "[C -> C++] testDouble(" << fixed << thing << ")" << endl; + cout << "[C -> C++] testDouble(" << fixed << thing << ")" << '\n'; return thing; } void testBinary(string& out, const string &thing) override { - cout << "[C -> C++] testBinary(\"" << thing << "\")" << endl; + cout << "[C -> C++] testBinary(\"" << thing << "\")" << '\n'; out = thing; } void testStruct(Xtruct& out, const Xtruct &thing) override { - cout << "[C -> C++] testStruct({\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "})" << endl; + cout << "[C -> C++] testStruct({\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "})" << '\n'; out = thing; } void testNest(Xtruct2& out, const Xtruct2& nest) override { const Xtruct &thing = nest.struct_thing; - cout << "[C -> C++] testNest({" << (int)nest.byte_thing << ", {\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "}, " << nest.i32_thing << "})" << endl; + cout << "[C -> C++] testNest({" << (int)nest.byte_thing << ", {\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "}, " << nest.i32_thing << "})" << '\n'; out = nest; } @@ -131,7 +130,7 @@ class TestHandler : public ThriftTestIf { } cout << m_iter->first << " => " << m_iter->second; } - cout << "})" << endl; + cout << "})" << '\n'; out = thing; } @@ -147,7 +146,7 @@ class TestHandler : public ThriftTestIf { } cout << "\"" << m_iter->first << "\" => \"" << m_iter->second << "\""; } - cout << "})" << endl; + cout << "})" << '\n'; out = thing; } @@ -164,7 +163,7 @@ class TestHandler : public ThriftTestIf { } cout << *s_iter; } - cout << "})" << endl; + cout << "})" << '\n'; out = thing; } @@ -180,21 +179,21 @@ class TestHandler : public ThriftTestIf { } cout << *l_iter; } - cout << "})" << endl; + cout << "})" << '\n'; out = thing; } Numberz::type testEnum(const Numberz::type thing) override { - cout << "[C -> C++] testEnum(" << thing << ")" << endl; + cout << "[C -> C++] testEnum(" << thing << ")" << '\n'; return thing; } UserId testTypedef(const UserId thing) override { - cout << "[C -> C++] testTypedef(" << thing << ")" << endl; + cout << "[C -> C++] testTypedef(" << thing << ")" << '\n'; return thing; } void testMapMap(map > &mapmap, const int32_t hello) override { - cout << "[C -> C++] testMapMap(" << hello << ")" << endl; + cout << "[C -> C++] testMapMap(" << hello << ")" << '\n'; map pos; map neg; @@ -211,7 +210,7 @@ class TestHandler : public ThriftTestIf { void testInsanity(map > &insane, const Insanity &argument) override { THRIFT_UNUSED_VARIABLE (argument); - cout << "[C -> C++] testInsanity()" << endl; + cout << "[C -> C++] testInsanity()" << '\n'; Xtruct hello; hello.string_thing = "Hello2"; @@ -273,7 +272,7 @@ class TestHandler : public ThriftTestIf { } cout << "}, "; } - cout << "}" << endl; + cout << "}" << '\n'; } @@ -283,7 +282,7 @@ class TestHandler : public ThriftTestIf { THRIFT_UNUSED_VARIABLE (arg4); THRIFT_UNUSED_VARIABLE (arg5); - cout << "[C -> C++] testMulti()" << endl; + cout << "[C -> C++] testMulti()" << '\n'; hello.string_thing = "Hello2"; hello.byte_thing = arg0; @@ -294,7 +293,7 @@ class TestHandler : public ThriftTestIf { void testException(const std::string &arg) throw(Xception, apache::thrift::TException) override { - cout << "[C -> C++] testException(" << arg << ")" << endl; + cout << "[C -> C++] testException(" << arg << ")" << '\n'; if (arg.compare("Xception") == 0) { Xception e; e.errorCode = 1001; @@ -312,7 +311,7 @@ class TestHandler : public ThriftTestIf { void testMultiException(Xtruct &result, const std::string &arg0, const std::string &arg1) throw(Xception, Xception2) override { - cout << "[C -> C++] testMultiException(" << arg0 << ", " << arg1 << ")" << endl; + cout << "[C -> C++] testMultiException(" << arg0 << ", " << arg1 << ")" << '\n'; if (arg0.compare("Xception") == 0) { Xception e; @@ -331,9 +330,9 @@ class TestHandler : public ThriftTestIf { } void testOneway(int sleepFor) override { - cout << "testOneway(" << sleepFor << "): Sleeping..." << endl; + cout << "testOneway(" << sleepFor << "): Sleeping..." << '\n'; sleep(sleepFor); - cout << "testOneway(" << sleepFor << "): done sleeping!" << endl; + cout << "testOneway(" << sleepFor << "): done sleeping!" << '\n'; } }; diff --git a/lib/cpp/src/thrift/async/TEvhttpClientChannel.cpp b/lib/cpp/src/thrift/async/TEvhttpClientChannel.cpp index 7656596859a..43d4034f618 100644 --- a/lib/cpp/src/thrift/async/TEvhttpClientChannel.cpp +++ b/lib/cpp/src/thrift/async/TEvhttpClientChannel.cpp @@ -147,8 +147,7 @@ void TEvhttpClientChannel::finish(struct evhttp_request* req) { self->finish(req); } catch (std::exception& e) { // don't propagate a C++ exception in C code (e.g. libevent) - std::cerr << "TEvhttpClientChannel::response exception thrown (ignored): " << e.what() - << std::endl; + std::cerr << "TEvhttpClientChannel::response exception thrown (ignored): " << e.what() << '\n'; } } } diff --git a/lib/cpp/src/thrift/async/TEvhttpServer.cpp b/lib/cpp/src/thrift/async/TEvhttpServer.cpp index 7d2cf21c0fc..bea9001500d 100644 --- a/lib/cpp/src/thrift/async/TEvhttpServer.cpp +++ b/lib/cpp/src/thrift/async/TEvhttpServer.cpp @@ -127,13 +127,13 @@ void TEvhttpServer::complete(RequestContext* ctx, bool success) { int rv = evhttp_add_header(ctx->req->output_headers, "Content-Type", "application/x-thrift"); if (rv != 0) { // TODO: Log an error. - std::cerr << "evhttp_add_header failed " << __FILE__ << ":" << __LINE__ << std::endl; + std::cerr << "evhttp_add_header failed " << __FILE__ << ":" << __LINE__ << '\n'; } struct evbuffer* buf = evbuffer_new(); if (buf == nullptr) { // TODO: Log an error. - std::cerr << "evbuffer_new failed " << __FILE__ << ":" << __LINE__ << std::endl; + std::cerr << "evbuffer_new failed " << __FILE__ << ":" << __LINE__ << '\n'; } else { uint8_t* obuf; uint32_t sz; @@ -141,8 +141,7 @@ void TEvhttpServer::complete(RequestContext* ctx, bool success) { int ret = evbuffer_add(buf, obuf, sz); if (ret != 0) { // TODO: Log an error. - std::cerr << "evhttp_add failed with " << ret << " " << __FILE__ << ":" << __LINE__ - << std::endl; + std::cerr << "evhttp_add failed with " << ret << " " << __FILE__ << ":" << __LINE__ << '\n'; } } diff --git a/lib/cpp/src/thrift/transport/TFileTransport.cpp b/lib/cpp/src/thrift/transport/TFileTransport.cpp index dd7d22925ff..3f4d812c567 100644 --- a/lib/cpp/src/thrift/transport/TFileTransport.cpp +++ b/lib/cpp/src/thrift/transport/TFileTransport.cpp @@ -55,8 +55,6 @@ namespace transport { using std::shared_ptr; using std::cerr; -using std::cout; -using std::endl; using std::string; using namespace apache::thrift::protocol; using namespace apache::thrift::concurrency; @@ -1032,7 +1030,7 @@ void TFileProcessor::process(uint32_t numEvents, bool tail) { break; } } catch (TException& te) { - cerr << te.what() << endl; + cerr << te.what() << '\n'; break; } } @@ -1060,7 +1058,7 @@ void TFileProcessor::processChunk() { } catch (TEOFException&) { break; } catch (TException& te) { - cerr << te.what() << endl; + cerr << te.what() << '\n'; break; } } diff --git a/lib/cpp/test/Benchmark.cpp b/lib/cpp/test/Benchmark.cpp index 97a531767d0..ba8c3452919 100644 --- a/lib/cpp/test/Benchmark.cpp +++ b/lib/cpp/test/Benchmark.cpp @@ -53,7 +53,6 @@ int main() { using namespace apache::thrift::transport; using namespace apache::thrift::protocol; using std::cout; - using std::endl; OneOfEach ooe; ooe.im_true = true; @@ -84,7 +83,7 @@ int main() { ooe.write(&prot); } elapsed = timer.frame(); - cout << "Write big endian: " << num / (1000 * elapsed) << " kHz" << endl; + cout << "Write big endian: " << num / (1000 * elapsed) << " kHz" << '\n'; } buf->getBuffer(&data, &datasize); @@ -100,7 +99,7 @@ int main() { ooe2.read(&prot); } elapsed = timer.frame(); - cout << " Read big endian: " << num / (1000 * elapsed) << " kHz" << endl; + cout << " Read big endian: " << num / (1000 * elapsed) << " kHz" << '\n'; } { @@ -113,7 +112,7 @@ int main() { ooe.write(&prot); } elapsed = timer.frame(); - cout << "Write little endian: " << num / (1000 * elapsed) << " kHz" << endl; + cout << "Write little endian: " << num / (1000 * elapsed) << " kHz" << '\n'; } { @@ -127,7 +126,7 @@ int main() { ooe2.read(&prot); } elapsed = timer.frame(); - cout << " Read little endian: " << num / (1000 * elapsed) << " kHz" << endl; + cout << " Read little endian: " << num / (1000 * elapsed) << " kHz" << '\n'; } { @@ -140,7 +139,7 @@ int main() { ooe.write(&prot); } elapsed = timer.frame(); - cout << "Write big endian: " << num / (1000 * elapsed) << " kHz" << endl; + cout << "Write big endian: " << num / (1000 * elapsed) << " kHz" << '\n'; } { @@ -154,7 +153,7 @@ int main() { ooe2.read(&prot); } elapsed = timer.frame(); - cout << " Read big endian: " << num / (1000 * elapsed) << " kHz" << endl; + cout << " Read big endian: " << num / (1000 * elapsed) << " kHz" << '\n'; } @@ -177,7 +176,7 @@ int main() { listDoublePerf.write(&prot); elapsed = timer.frame(); - cout << "Double write big endian: " << num / (1000 * elapsed) << " kHz" << endl; + cout << "Double write big endian: " << num / (1000 * elapsed) << " kHz" << '\n'; } buf->getBuffer(&data, &datasize); @@ -191,7 +190,7 @@ int main() { listDoublePerf2.read(&prot); elapsed = timer.frame(); - cout << " Double read big endian: " << num / (1000 * elapsed) << " kHz" << endl; + cout << " Double read big endian: " << num / (1000 * elapsed) << " kHz" << '\n'; } { @@ -202,7 +201,7 @@ int main() { listDoublePerf.write(&prot); elapsed = timer.frame(); - cout << "Double write little endian: " << num / (1000 * elapsed) << " kHz" << endl; + cout << "Double write little endian: " << num / (1000 * elapsed) << " kHz" << '\n'; } { @@ -214,7 +213,7 @@ int main() { listDoublePerf2.read(&prot); elapsed = timer.frame(); - cout << " Double read little endian: " << num / (1000 * elapsed) << " kHz" << endl; + cout << " Double read little endian: " << num / (1000 * elapsed) << " kHz" << '\n'; } { @@ -225,7 +224,7 @@ int main() { listDoublePerf.write(&prot); elapsed = timer.frame(); - cout << "Double write big endian: " << num / (1000 * elapsed) << " kHz" << endl; + cout << "Double write big endian: " << num / (1000 * elapsed) << " kHz" << '\n'; } { @@ -237,7 +236,7 @@ int main() { listDoublePerf2.read(&prot); elapsed = timer.frame(); - cout << " Double read big endian: " << num / (1000 * elapsed) << " kHz" << endl; + cout << " Double read big endian: " << num / (1000 * elapsed) << " kHz" << '\n'; } diff --git a/lib/cpp/test/OneWayHTTPTest.cpp b/lib/cpp/test/OneWayHTTPTest.cpp index 7823482f1f1..8789c2c8ffb 100644 --- a/lib/cpp/test/OneWayHTTPTest.cpp +++ b/lib/cpp/test/OneWayHTTPTest.cpp @@ -55,9 +55,6 @@ using apache::thrift::transport::TServerSocket; using apache::thrift::transport::TSocket; using apache::thrift::transport::TTransportException; using std::shared_ptr; -using std::cout; -using std::cerr; -using std::endl; using std::string; namespace utf = boost::unit_test; @@ -70,12 +67,12 @@ class OneWayServiceHandler : public onewaytest::OneWayServiceIf { void roundTripRPC() override { #ifdef ENABLE_STDERR_LOGGING - cerr << "roundTripRPC()" << endl; + cerr << "roundTripRPC()" << '\n'; #endif } void oneWayRPC() override { #ifdef ENABLE_STDERR_LOGGING - cerr << "oneWayRPC()" << std::endl ; + cerr << "oneWayRPC()" << '\n'; #endif } }; @@ -201,7 +198,7 @@ BOOST_AUTO_TEST_CASE( JSON_BufferedHTTP ) int port = ss->getPort() ; #ifdef ENABLE_STDERR_LOGGING - cerr << "port " << port << endl ; + cerr << "port " << port << '\n'; #endif { diff --git a/lib/cpp/test/TMemoryBufferTest.cpp b/lib/cpp/test/TMemoryBufferTest.cpp index 2f1aea69411..53e5d15e010 100644 --- a/lib/cpp/test/TMemoryBufferTest.cpp +++ b/lib/cpp/test/TMemoryBufferTest.cpp @@ -36,8 +36,6 @@ using apache::thrift::protocol::TBinaryProtocol; using apache::thrift::transport::TMemoryBuffer; using apache::thrift::transport::TTransportException; using std::shared_ptr; -using std::cout; -using std::endl; using std::string; BOOST_AUTO_TEST_CASE(test_read_write_grow) { diff --git a/lib/cpp/test/TServerSocketTest.cpp b/lib/cpp/test/TServerSocketTest.cpp index 929defa0a89..0860242bc25 100644 --- a/lib/cpp/test/TServerSocketTest.cpp +++ b/lib/cpp/test/TServerSocketTest.cpp @@ -43,7 +43,7 @@ BOOST_AUTO_TEST_CASE(test_bind_to_address) { accepted->close(); sock1.close(); - std::cout << "An error message from getaddrinfo on the console is expected:" << std::endl; + std::cout << "An error message from getaddrinfo on the console is expected:" << '\n'; TServerSocket sock2("257.258.259.260", 0); BOOST_CHECK_THROW(sock2.listen(), TTransportException); sock2.close(); diff --git a/lib/cpp/test/ThrifttReadCheckTests.cpp b/lib/cpp/test/ThrifttReadCheckTests.cpp index eb4ca01b235..481185e7c12 100644 --- a/lib/cpp/test/ThrifttReadCheckTests.cpp +++ b/lib/cpp/test/ThrifttReadCheckTests.cpp @@ -55,8 +55,6 @@ using apache::thrift::transport::TTransportException; using apache::thrift::transport::TBufferedTransport; using apache::thrift::transport::TFramedTransport; using std::shared_ptr; -using std::cout; -using std::endl; using std::string; using std::memset; using namespace apache::thrift; diff --git a/lib/cpp/test/concurrency/Tests.cpp b/lib/cpp/test/concurrency/Tests.cpp index 45054a92ad6..67de7893b5e 100644 --- a/lib/cpp/test/concurrency/Tests.cpp +++ b/lib/cpp/test/concurrency/Tests.cpp @@ -51,52 +51,52 @@ int main(int argc, char** argv) { ThreadFactoryTests threadFactoryTests; - std::cout << "ThreadFactory tests..." << std::endl; + std::cout << "ThreadFactory tests..." << '\n'; const int reapLoops = 2 * WEIGHT; const int reapCount = 100 * WEIGHT; const size_t floodLoops = 3; const size_t floodCount = 500 * WEIGHT; - std::cout << "\t\tThreadFactory reap N threads test: N = " << reapLoops << "x" << reapCount << std::endl; + std::cout << "\t\tThreadFactory reap N threads test: N = " << reapLoops << "x" << reapCount << '\n'; if (!threadFactoryTests.reapNThreads(reapLoops, reapCount)) { - std::cerr << "\t\ttThreadFactory reap N threads FAILED" << std::endl; + std::cerr << "\t\ttThreadFactory reap N threads FAILED" << '\n'; return 1; } - std::cout << "\t\tThreadFactory flood N threads test: N = " << floodLoops << "x" << floodCount << std::endl; + std::cout << "\t\tThreadFactory flood N threads test: N = " << floodLoops << "x" << floodCount << '\n'; if (!threadFactoryTests.floodNTest(floodLoops, floodCount)) { - std::cerr << "\t\ttThreadFactory flood N threads FAILED" << std::endl; + std::cerr << "\t\ttThreadFactory flood N threads FAILED" << '\n'; return 1; } - std::cout << "\t\tThreadFactory synchronous start test" << std::endl; + std::cout << "\t\tThreadFactory synchronous start test" << '\n'; if (!threadFactoryTests.synchStartTest()) { - std::cerr << "\t\ttThreadFactory synchronous start FAILED" << std::endl; + std::cerr << "\t\ttThreadFactory synchronous start FAILED" << '\n'; return 1; } - std::cout << "\t\tThreadFactory monitor timeout test" << std::endl; + std::cout << "\t\tThreadFactory monitor timeout test" << '\n'; if (!threadFactoryTests.monitorTimeoutTest()) { - std::cerr << "\t\ttThreadFactory monitor timeout FAILED" << std::endl; + std::cerr << "\t\ttThreadFactory monitor timeout FAILED" << '\n'; return 1; } } if (runAll || args[0].compare("util") == 0) { - std::cout << "Util tests..." << std::endl; + std::cout << "Util tests..." << '\n'; - std::cout << "\t\tUtil minimum time" << std::endl; + std::cout << "\t\tUtil minimum time" << '\n'; int64_t time00 = std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count(); int64_t time01 = std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count(); - std::cout << "\t\t\tMinimum time: " << time01 - time00 << "ms" << std::endl; + std::cout << "\t\t\tMinimum time: " << time01 - time00 << "ms" << '\n'; time00 = std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count(); time01 = time00; @@ -107,54 +107,54 @@ int main(int argc, char** argv) { time01 = std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count(); } - std::cout << "\t\t\tscall per ms: " << count / (time01 - time00) << std::endl; + std::cout << "\t\t\tscall per ms: " << count / (time01 - time00) << '\n'; } if (runAll || args[0].compare("timer-manager") == 0) { - std::cout << "TimerManager tests..." << std::endl; + std::cout << "TimerManager tests..." << '\n'; - std::cout << "\t\tTimerManager test00" << std::endl; + std::cout << "\t\tTimerManager test00" << '\n'; TimerManagerTests timerManagerTests; if (!timerManagerTests.test00()) { - std::cerr << "\t\tTimerManager tests FAILED" << std::endl; + std::cerr << "\t\tTimerManager tests FAILED" << '\n'; return 1; } - std::cout << "\t\tTimerManager test01" << std::endl; + std::cout << "\t\tTimerManager test01" << '\n'; if (!timerManagerTests.test01()) { - std::cerr << "\t\tTimerManager tests FAILED" << std::endl; + std::cerr << "\t\tTimerManager tests FAILED" << '\n'; return 1; } - std::cout << "\t\tTimerManager test02" << std::endl; + std::cout << "\t\tTimerManager test02" << '\n'; if (!timerManagerTests.test02()) { - std::cerr << "\t\tTimerManager tests FAILED" << std::endl; + std::cerr << "\t\tTimerManager tests FAILED" << '\n'; return 1; } - std::cout << "\t\tTimerManager test03" << std::endl; + std::cout << "\t\tTimerManager test03" << '\n'; if (!timerManagerTests.test03()) { - std::cerr << "\t\tTimerManager tests FAILED" << std::endl; + std::cerr << "\t\tTimerManager tests FAILED" << '\n'; return 1; } - std::cout << "\t\tTimerManager test04" << std::endl; + std::cout << "\t\tTimerManager test04" << '\n'; if (!timerManagerTests.test04()) { - std::cerr << "\t\tTimerManager tests FAILED" << std::endl; + std::cerr << "\t\tTimerManager tests FAILED" << '\n'; return 1; } } if (runAll || args[0].compare("thread-manager") == 0) { - std::cout << "ThreadManager tests..." << std::endl; + std::cout << "ThreadManager tests..." << '\n'; { size_t workerCount = 10 * WEIGHT; @@ -163,26 +163,26 @@ int main(int argc, char** argv) { ThreadManagerTests threadManagerTests; - std::cout << "\t\tThreadManager api test:" << std::endl; + std::cout << "\t\tThreadManager api test:" << '\n'; if (!threadManagerTests.apiTest()) { - std::cerr << "\t\tThreadManager apiTest FAILED" << std::endl; + std::cerr << "\t\tThreadManager apiTest FAILED" << '\n'; return 1; } std::cout << "\t\tThreadManager load test: worker count: " << workerCount - << " task count: " << taskCount << " delay: " << delay << std::endl; + << " task count: " << taskCount << " delay: " << delay << '\n'; if (!threadManagerTests.loadTest(taskCount, delay, workerCount)) { - std::cerr << "\t\tThreadManager loadTest FAILED" << std::endl; + std::cerr << "\t\tThreadManager loadTest FAILED" << '\n'; return 1; } std::cout << "\t\tThreadManager block test: worker count: " << workerCount - << " delay: " << delay << std::endl; + << " delay: " << delay << '\n'; if (!threadManagerTests.blockTest(delay, workerCount)) { - std::cerr << "\t\tThreadManager blockTest FAILED" << std::endl; + std::cerr << "\t\tThreadManager blockTest FAILED" << '\n'; return 1; } } @@ -190,7 +190,7 @@ int main(int argc, char** argv) { if (runAll || args[0].compare("thread-manager-benchmark") == 0) { - std::cout << "ThreadManager benchmark tests..." << std::endl; + std::cout << "ThreadManager benchmark tests..." << '\n'; { @@ -207,19 +207,19 @@ int main(int argc, char** argv) { size_t taskCount = workerCount * tasksPerWorker; std::cout << "\t\tThreadManager load test: worker count: " << workerCount - << " task count: " << taskCount << " delay: " << delay << std::endl; + << " task count: " << taskCount << " delay: " << delay << '\n'; ThreadManagerTests threadManagerTests; if (!threadManagerTests.loadTest(taskCount, delay, workerCount)) { - std::cerr << "\t\tThreadManager loadTest FAILED" << std::endl; + std::cerr << "\t\tThreadManager loadTest FAILED" << '\n'; return 1; } } } } - std::cout << "ALL TESTS PASSED" << std::endl; + std::cout << "ALL TESTS PASSED" << '\n'; return 0; } diff --git a/lib/cpp/test/concurrency/ThreadFactoryTests.h b/lib/cpp/test/concurrency/ThreadFactoryTests.h index 23e46e3de21..a2d55febae1 100644 --- a/lib/cpp/test/concurrency/ThreadFactoryTests.h +++ b/lib/cpp/test/concurrency/ThreadFactoryTests.h @@ -53,7 +53,7 @@ class ThreadFactoryTests { void run() override { Synchronized s(_monitor); - + if (--_count == 0) { _monitor.notify(); } @@ -82,7 +82,7 @@ class ThreadFactoryTests { threadFactory.newThread(shared_ptr(new ReapNTask(*monitor, activeCount)))); } catch (SystemResourceException& e) { std::cout << "\t\t\tfailed to create " << lix* count + tix << " thread " << e.what() - << std::endl; + << '\n'; throw; } } @@ -96,7 +96,7 @@ class ThreadFactoryTests { (*thread)->start(); } catch (SystemResourceException& e) { std::cout << "\t\t\tfailed to start " << lix* count + tix << " thread " << e.what() - << std::endl; + << '\n'; throw; } } @@ -107,11 +107,11 @@ class ThreadFactoryTests { monitor->wait(1000); } } - - std::cout << "\t\t\treaped " << lix* count << " threads" << std::endl; + + std::cout << "\t\t\treaped " << lix* count << " threads" << '\n'; } - std::cout << "\t\t\tSuccess!" << std::endl; + std::cout << "\t\t\tSuccess!" << '\n'; return true; } @@ -202,7 +202,7 @@ class ThreadFactoryTests { bool success = true; - std::cout << "\t\t\t" << (success ? "Success" : "Failure") << "!" << std::endl; + std::cout << "\t\t\t" << (success ? "Success" : "Failure") << "!" << '\n'; return true; } @@ -239,7 +239,7 @@ class ThreadFactoryTests { std::cout << "\t\t\t" << (success ? "Success" : "Failure") << ": minimum required time to elapse " << count * timeout << "ms; actual elapsed time " << endTime - startTime << "ms" - << std::endl; + << '\n'; return success; } @@ -250,14 +250,14 @@ class ThreadFactoryTests { ~FloodTask() override { if (_id % 10000 == 0) { Synchronized sync(_mon); - std::cout << "\t\tthread " << _id << " done" << std::endl; + std::cout << "\t\tthread " << _id << " done" << '\n'; } } void run() override { if (_id % 10000 == 0) { Synchronized sync(_mon); - std::cout << "\t\tthread " << _id << " started" << std::endl; + std::cout << "\t\tthread " << _id << " started" << '\n'; } } const size_t _id; @@ -270,7 +270,7 @@ class ThreadFactoryTests { bool success = false; Monitor mon; - + for (size_t lix = 0; lix < loop; lix++) { ThreadFactory threadFactory = ThreadFactory(); @@ -287,14 +287,14 @@ class ThreadFactoryTests { } catch (TException& e) { std::cout << "\t\t\tfailed to start " << lix* count + tix << " thread " << e.what() - << std::endl; + << '\n'; return success; } } Synchronized sync(mon); - std::cout << "\t\t\tflooded " << (lix + 1) * count << " threads" << std::endl; + std::cout << "\t\t\tflooded " << (lix + 1) * count << " threads" << '\n'; success = true; } diff --git a/lib/cpp/test/concurrency/ThreadManagerTests.h b/lib/cpp/test/concurrency/ThreadManagerTests.h index fee7c7c51a1..b33fc27a5d9 100644 --- a/lib/cpp/test/concurrency/ThreadManagerTests.h +++ b/lib/cpp/test/concurrency/ThreadManagerTests.h @@ -76,7 +76,7 @@ class ThreadManagerTests { { Synchronized s(_monitor); - // std::cout << "Thread " << _count << " completed " << std::endl; + // std::cout << "Thread " << _count << " completed " << '\n'; _count--; if (_count % 10000 == 0) { @@ -131,13 +131,13 @@ class ThreadManagerTests { threadManager->add(*ix); } - std::cout << "\t\t\t\tloaded " << count << " tasks to execute" << std::endl; + std::cout << "\t\t\t\tloaded " << count << " tasks to execute" << '\n'; { Synchronized s(monitor); while (activeCount > 0) { - std::cout << "\t\t\t\tactiveCount = " << activeCount << std::endl; + std::cout << "\t\t\t\tactiveCount = " << activeCount << '\n'; monitor.wait(); } } @@ -184,13 +184,13 @@ class ThreadManagerTests { std::cout << "\t\t\tfirst start: " << firstTime << " Last end: " << lastTime << " min: " << minTime << "ms max: " << maxTime << "ms average: " << averageTime - << "ms" << std::endl; + << "ms" << '\n'; bool success = (time01 - time00) >= ((int64_t)count * timeout) / (int64_t)workerCount; std::cout << "\t\t\t" << (success ? "Success" : "Failure") << "! expected time: " << ((int64_t)count * timeout) / (int64_t)workerCount << "ms elapsed time: " << time01 - time00 - << "ms" << std::endl; + << "ms" << '\n'; return success; } @@ -307,7 +307,7 @@ class ThreadManagerTests { } std::cout << "\t\t\t" - << "Pending tasks " << threadManager->pendingTaskCount() << std::endl; + << "Pending tasks " << threadManager->pendingTaskCount() << '\n'; { Synchronized s(blockMonitor); @@ -323,18 +323,18 @@ class ThreadManagerTests { } std::cout << "\t\t\t" - << "Pending tasks " << threadManager->pendingTaskCount() << std::endl; + << "Pending tasks " << threadManager->pendingTaskCount() << '\n'; try { threadManager->add(extraTask, 1); } catch (TimedOutException&) { std::cout << "\t\t\t" - << "add timed out unexpectedly" << std::endl; + << "add timed out unexpectedly" << '\n'; throw TException("Unexpected timeout adding task"); } catch (TooManyPendingTasksException&) { std::cout << "\t\t\t" - << "add encountered too many pending exepctions" << std::endl; + << "add encountered too many pending exepctions" << '\n'; throw TException("Unexpected timeout adding task"); } @@ -375,10 +375,10 @@ class ThreadManagerTests { } } catch (TException& e) { - std::cout << "ERROR: " << e.what() << std::endl; + std::cout << "ERROR: " << e.what() << '\n'; } - std::cout << "\t\t\t" << (success ? "Success" : "Failure") << std::endl; + std::cout << "\t\t\t" << (success ? "Success" : "Failure") << '\n'; return success; } @@ -390,7 +390,7 @@ class ThreadManagerTests { sleep_(100); int64_t b = std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count(); if (b - a < 50 || b - a > 150) { - std::cerr << "\t\t\texpected 100ms gap, found " << (b-a) << "ms gap instead." << std::endl; + std::cerr << "\t\t\texpected 100ms gap, found " << (b-a) << "ms gap instead." << '\n'; return false; } @@ -403,18 +403,18 @@ class ThreadManagerTests { shared_ptr threadManager = ThreadManager::newSimpleThreadManager(1); threadManager->threadFactory(threadFactory); - std::cout << "\t\t\t\tstarting.. " << std::endl; + std::cout << "\t\t\t\tstarting.. " << '\n'; threadManager->start(); threadManager->setExpireCallback(expiredNotifier); // std::bind(&ThreadManagerTests::expiredNotifier, this)); -#define EXPECT(FUNC, COUNT) { size_t c = FUNC; if (c != COUNT) { std::cerr << "expected " #FUNC" to be " #COUNT ", but was " << c << std::endl; return false; } } +#define EXPECT(FUNC, COUNT) { size_t c = FUNC; if (c != COUNT) { std::cerr << "expected " #FUNC" to be " #COUNT ", but was " << c << '\n'; return false; } } EXPECT(threadManager->workerCount(), 1); EXPECT(threadManager->idleWorkerCount(), 1); EXPECT(threadManager->pendingTaskCount(), 0); - std::cout << "\t\t\t\tadd 2nd worker.. " << std::endl; + std::cout << "\t\t\t\tadd 2nd worker.. " << '\n'; threadManager->addWorker(); @@ -422,7 +422,7 @@ class ThreadManagerTests { EXPECT(threadManager->idleWorkerCount(), 2); EXPECT(threadManager->pendingTaskCount(), 0); - std::cout << "\t\t\t\tremove 2nd worker.. " << std::endl; + std::cout << "\t\t\t\tremove 2nd worker.. " << '\n'; threadManager->removeWorker(); @@ -430,7 +430,7 @@ class ThreadManagerTests { EXPECT(threadManager->idleWorkerCount(), 1); EXPECT(threadManager->pendingTaskCount(), 0); - std::cout << "\t\t\t\tremove 1st worker.. " << std::endl; + std::cout << "\t\t\t\tremove 1st worker.. " << '\n'; threadManager->removeWorker(); @@ -438,7 +438,7 @@ class ThreadManagerTests { EXPECT(threadManager->idleWorkerCount(), 0); EXPECT(threadManager->pendingTaskCount(), 0); - std::cout << "\t\t\t\tadd blocking task.. " << std::endl; + std::cout << "\t\t\t\tadd blocking task.. " << '\n'; // We're going to throw a blocking task into the mix Monitor entryMonitor; // signaled when task is running @@ -454,7 +454,7 @@ class ThreadManagerTests { EXPECT(threadManager->idleWorkerCount(), 0); EXPECT(threadManager->pendingTaskCount(), 1); - std::cout << "\t\t\t\tadd other task.. " << std::endl; + std::cout << "\t\t\t\tadd other task.. " << '\n'; shared_ptr otherTask( new ThreadManagerTests::Task(doneMonitor, activeCount, 0)); @@ -465,7 +465,7 @@ class ThreadManagerTests { EXPECT(threadManager->idleWorkerCount(), 0); EXPECT(threadManager->pendingTaskCount(), 2); - std::cout << "\t\t\t\tremove blocking task specifically.. " << std::endl; + std::cout << "\t\t\t\tremove blocking task specifically.. " << '\n'; threadManager->remove(blockingTask); @@ -473,11 +473,11 @@ class ThreadManagerTests { EXPECT(threadManager->idleWorkerCount(), 0); EXPECT(threadManager->pendingTaskCount(), 1); - std::cout << "\t\t\t\tremove next pending task.." << std::endl; + std::cout << "\t\t\t\tremove next pending task.." << '\n'; shared_ptr nextTask = threadManager->removeNextPending(); if (nextTask != otherTask) { - std::cerr << "\t\t\t\t\texpected removeNextPending to return otherTask" << std::endl; + std::cerr << "\t\t\t\t\texpected removeNextPending to return otherTask" << '\n'; return false; } @@ -485,15 +485,15 @@ class ThreadManagerTests { EXPECT(threadManager->idleWorkerCount(), 0); EXPECT(threadManager->pendingTaskCount(), 0); - std::cout << "\t\t\t\tremove next pending task (none left).." << std::endl; + std::cout << "\t\t\t\tremove next pending task (none left).." << '\n'; nextTask = threadManager->removeNextPending(); if (nextTask) { - std::cerr << "\t\t\t\t\texpected removeNextPending to return an empty Runnable" << std::endl; + std::cerr << "\t\t\t\t\texpected removeNextPending to return an empty Runnable" << '\n'; return false; } - std::cout << "\t\t\t\tadd 2 expired tasks and 1 not.." << std::endl; + std::cout << "\t\t\t\tadd 2 expired tasks and 1 not.." << '\n'; shared_ptr expiredTask( new ThreadManagerTests::Task(doneMonitor, activeCount, 0)); @@ -509,28 +509,28 @@ class ThreadManagerTests { EXPECT(threadManager->pendingTaskCount(), 3); EXPECT(threadManager->expiredTaskCount(), 0); - std::cout << "\t\t\t\tremove expired tasks.." << std::endl; + std::cout << "\t\t\t\tremove expired tasks.." << '\n'; if (!m_expired.empty()) { - std::cerr << "\t\t\t\t\texpected m_expired to be empty" << std::endl; + std::cerr << "\t\t\t\t\texpected m_expired to be empty" << '\n'; return false; } threadManager->removeExpiredTasks(); if (m_expired.size() != 2) { - std::cerr << "\t\t\t\t\texpected m_expired to be set" << std::endl; + std::cerr << "\t\t\t\t\texpected m_expired to be set" << '\n'; return false; } if (m_expired.front() != expiredTask) { - std::cerr << "\t\t\t\t\texpected m_expired[0] to be the expired task" << std::endl; + std::cerr << "\t\t\t\t\texpected m_expired[0] to be the expired task" << '\n'; return false; } m_expired.pop_front(); if (m_expired.front() != expiredTask) { - std::cerr << "\t\t\t\t\texpected m_expired[1] to be the expired task" << std::endl; + std::cerr << "\t\t\t\t\texpected m_expired[1] to be the expired task" << '\n'; return false; } @@ -543,23 +543,23 @@ class ThreadManagerTests { EXPECT(threadManager->pendingTaskCount(), 0); EXPECT(threadManager->expiredTaskCount(), 2); - std::cout << "\t\t\t\tadd expired task (again).." << std::endl; + std::cout << "\t\t\t\tadd expired task (again).." << '\n'; threadManager->add(expiredTask, 0, 1); // expires in 1ms sleep_(50); // make sure enough time elapses for it to expire - the shortest expiration time is 1ms - std::cout << "\t\t\t\tadd worker to consume expired task.." << std::endl; + std::cout << "\t\t\t\tadd worker to consume expired task.." << '\n'; threadManager->addWorker(); sleep_(100); // make sure it has time to spin up and expire the task if (m_expired.empty()) { - std::cerr << "\t\t\t\t\texpected m_expired to be set" << std::endl; + std::cerr << "\t\t\t\t\texpected m_expired to be set" << '\n'; return false; } if (m_expired.front() != expiredTask) { - std::cerr << "\t\t\t\t\texpected m_expired to be the expired task" << std::endl; + std::cerr << "\t\t\t\t\texpected m_expired to be the expired task" << '\n'; return false; } @@ -570,16 +570,16 @@ class ThreadManagerTests { EXPECT(threadManager->pendingTaskCount(), 0); EXPECT(threadManager->expiredTaskCount(), 3); - std::cout << "\t\t\t\ttry to remove too many workers" << std::endl; + std::cout << "\t\t\t\ttry to remove too many workers" << '\n'; try { threadManager->removeWorker(2); - std::cerr << "\t\t\t\t\texpected InvalidArgumentException" << std::endl; + std::cerr << "\t\t\t\t\texpected InvalidArgumentException" << '\n'; return false; } catch (const InvalidArgumentException&) { /* expected */ } - std::cout << "\t\t\t\tremove worker.. " << std::endl; + std::cout << "\t\t\t\tremove worker.. " << '\n'; threadManager->removeWorker(); @@ -588,7 +588,7 @@ class ThreadManagerTests { EXPECT(threadManager->pendingTaskCount(), 0); EXPECT(threadManager->expiredTaskCount(), 3); - std::cout << "\t\t\t\tadd blocking task.. " << std::endl; + std::cout << "\t\t\t\tadd blocking task.. " << '\n'; threadManager->add(blockingTask); @@ -596,7 +596,7 @@ class ThreadManagerTests { EXPECT(threadManager->idleWorkerCount(), 0); EXPECT(threadManager->pendingTaskCount(), 1); - std::cout << "\t\t\t\tadd worker.. " << std::endl; + std::cout << "\t\t\t\tadd worker.. " << '\n'; threadManager->addWorker(); { @@ -610,7 +610,7 @@ class ThreadManagerTests { EXPECT(threadManager->idleWorkerCount(), 0); EXPECT(threadManager->pendingTaskCount(), 0); - std::cout << "\t\t\t\tunblock task and remove worker.. " << std::endl; + std::cout << "\t\t\t\tunblock task and remove worker.. " << '\n'; { Synchronized s(blockMonitor); @@ -623,7 +623,7 @@ class ThreadManagerTests { EXPECT(threadManager->idleWorkerCount(), 0); EXPECT(threadManager->pendingTaskCount(), 0); - std::cout << "\t\t\t\tcleanup.. " << std::endl; + std::cout << "\t\t\t\tcleanup.. " << '\n'; blockingTask.reset(); threadManager.reset(); diff --git a/lib/cpp/test/concurrency/TimerManagerTests.h b/lib/cpp/test/concurrency/TimerManagerTests.h index 2d1a2620ab5..9a532320019 100644 --- a/lib/cpp/test/concurrency/TimerManagerTests.h +++ b/lib/cpp/test/concurrency/TimerManagerTests.h @@ -46,7 +46,7 @@ class TimerManagerTests { _success(false), _done(false) {} - ~Task() override { std::cerr << this << std::endl; } + ~Task() override { std::cerr << this << '\n'; } void run() override { @@ -84,7 +84,7 @@ class TimerManagerTests { timerManager.threadFactory(shared_ptr(new ThreadFactory())); timerManager.start(); if (timerManager.state() != TimerManager::STARTED) { - std::cerr << "timerManager is not in the STARTED state, but should be" << std::endl; + std::cerr << "timerManager is not in the STARTED state, but should be" << '\n'; return false; } @@ -104,15 +104,15 @@ class TimerManagerTests { } if (!task->_done) { - std::cerr << "task is not done, but it should have executed" << std::endl; + std::cerr << "task is not done, but it should have executed" << '\n'; return false; } - std::cout << "\t\t\t" << (task->_success ? "Success" : "Failure") << "!" << std::endl; + std::cout << "\t\t\t" << (task->_success ? "Success" : "Failure") << "!" << '\n'; } if (orphanTask->_done) { - std::cerr << "orphan task is done, but it should not have executed" << std::endl; + std::cerr << "orphan task is done, but it should not have executed" << '\n'; return false; } diff --git a/test/cpp/src/StressTest.cpp b/test/cpp/src/StressTest.cpp index 79a708e8f57..a42462059b8 100644 --- a/test/cpp/src/StressTest.cpp +++ b/test/cpp/src/StressTest.cpp @@ -155,7 +155,7 @@ class ClientThread : public Runnable { loopEchoString(); break; default: - cerr << "Unexpected loop type" << _loopType << endl; + cerr << "Unexpected loop type" << _loopType << '\n'; break; } @@ -280,23 +280,23 @@ int main(int argc, char** argv) { usage << argv[0] << " [--port=] [--server] [--server-type=] " "[--protocol-type=] [--workers=] " "[--clients=] [--loop=] " - "[--client-type=]" << endl + "[--client-type=]" << '\n' << "\tclients Number of client threads to create - 0 implies no clients, i.e. " - "server only. Default is " << clientCount << endl - << "\thelp Prints this help text." << endl - << "\tcall Service method to call. Default is " << callName << endl - << "\tloop The number of remote thrift calls each client makes. Default is " << loopCount << endl + "server only. Default is " << clientCount << '\n' + << "\thelp Prints this help text." << '\n' + << "\tcall Service method to call. Default is " << callName << '\n' + << "\tloop The number of remote thrift calls each client makes. Default is " << loopCount << '\n' << "\tport The port the server and clients should bind to " - "for thrift network connections. Default is " << port << endl - << "\tserver Run the Thrift server in this process. Default is " << runServer << endl - << "\tserver-type Type of server, \"simple\" or \"thread-pool\". Default is " << serverType << endl - << "\tprotocol-type Type of protocol, \"binary\", \"ascii\", or \"xml\". Default is " << protocolType << endl - << "\tlog-request Log all request to ./requestlog.tlog. Default is " << logRequests << endl - << "\treplay-request Replay requests from log file (./requestlog.tlog) Default is " << replayRequests << endl + "for thrift network connections. Default is " << port << '\n' + << "\tserver Run the Thrift server in this process. Default is " << runServer << '\n' + << "\tserver-type Type of server, \"simple\" or \"thread-pool\". Default is " << serverType << '\n' + << "\tprotocol-type Type of protocol, \"binary\", \"ascii\", or \"xml\". Default is " << protocolType << '\n' + << "\tlog-request Log all request to ./requestlog.tlog. Default is " << logRequests << '\n' + << "\treplay-request Replay requests from log file (./requestlog.tlog) Default is " << replayRequests << '\n' << "\tworkers Number of thread pools workers. Only valid " - "for thread-pool server type. Default is " << workerCount << endl - << "\tclient-type Type of client, \"regular\" or \"concurrent\". Default is " << clientType << endl - << endl; + "for thread-pool server type. Default is " << workerCount << '\n' + << "\tclient-type Type of client, \"regular\" or \"concurrent\". Default is " << clientType << '\n' + << '\n'; map args; @@ -386,7 +386,7 @@ int main(int argc, char** argv) { } } catch (std::exception& e) { - cerr << e.what() << endl; + cerr << e.what() << '\n'; cerr << usage.str(); } @@ -468,7 +468,7 @@ int main(int argc, char** argv) { server->setServerEventHandler(observer); std::shared_ptr serverThread = threadFactory->newThread(server); - cerr << "Starting the server on port " << port << endl; + cerr << "Starting the server on port " << port << '\n'; serverThread->start(); observer->waitForService(); @@ -538,7 +538,7 @@ int main(int argc, char** argv) { Synchronized s(monitor); threadCount = clientCount; - cerr << "Launch " << clientCount << " " << clientType << " client threads" << endl; + cerr << "Launch " << clientCount << " " << clientType << " client threads" << '\n'; time00 = std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count(); @@ -591,14 +591,14 @@ int main(int argc, char** argv) { averageTime /= clientCount; cout << "workers :" << workerCount << ", client : " << clientCount << ", loops : " << loopCount - << ", rate : " << (clientCount * loopCount * 1000) / ((double)(time01 - time00)) << endl; + << ", rate : " << (clientCount * loopCount * 1000) / ((double)(time01 - time00)) << '\n'; count_map count = serviceHandler->getCount(); count_map::iterator iter; for (iter = count.begin(); iter != count.end(); ++iter) { printf("%s => %d\n", iter->first, iter->second); } - cerr << "done." << endl; + cerr << "done." << '\n'; } return 0; diff --git a/test/cpp/src/StressTestNonBlocking.cpp b/test/cpp/src/StressTestNonBlocking.cpp index e94ecb2db11..d9d9ae606b5 100644 --- a/test/cpp/src/StressTestNonBlocking.cpp +++ b/test/cpp/src/StressTestNonBlocking.cpp @@ -152,7 +152,7 @@ class ClientThread : public Runnable { loopEchoString(); break; default: - cerr << "Unexpected loop type" << _loopType << endl; + cerr << "Unexpected loop type" << _loopType << '\n'; break; } @@ -253,24 +253,20 @@ int main(int argc, char** argv) { usage << argv[0] << " [--port=] [--server] [--server-type=] " "[--protocol-type=] [--workers=] " - "[--clients=] [--loop=]" << endl + "[--clients=] [--loop=]" << '\n' << "\tclients Number of client threads to create - 0 implies no clients, i.e. " - "server only. Default is " << clientCount << endl - << "\thelp Prints this help text." << endl - << "\tcall Service method to call. Default is " << callName << endl - << "\tloop The number of remote thrift calls each client makes. Default is " - << loopCount << endl << "\tport The port the server and clients should bind to " - "for thrift network connections. Default is " << port << endl - << "\tserver Run the Thrift server in this process. Default is " << runServer - << endl << "\tserver-type Type of server, \"simple\" or \"thread-pool\". Default is " - << serverType << endl - << "\tprotocol-type Type of protocol, \"binary\", \"ascii\", or \"xml\". Default is " - << protocolType << endl - << "\tlog-request Log all request to ./requestlog.tlog. Default is " << logRequests - << endl << "\treplay-request Replay requests from log file (./requestlog.tlog) Default is " - << replayRequests << endl << "\tworkers Number of thread pools workers. Only valid " - "for thread-pool server type. Default is " << workerCount - << endl; + "server only. Default is " << clientCount << '\n' + << "\thelp Prints this help text." << '\n' + << "\tcall Service method to call. Default is " << callName << '\n' + << "\tloop The number of remote thrift calls each client makes. Default is " << loopCount << '\n' + << "\tport The port the server and clients should bind to for thrift network " + "connections. Default is " << port << '\n' + << "\tserver Run the Thrift server in this process. Default is " << runServer << '\n' + << "\tserver-type Type of server, \"simple\" or \"thread-pool\". Default is " << serverType << '\n' + << "\tprotocol-type Type of protocol, \"binary\", \"ascii\", or \"xml\". Default is " << protocolType << '\n' + << "\tlog-request Log all request to ./requestlog.tlog. Default is " << logRequests << '\n' + << "\treplay-request Replay requests from log file (./requestlog.tlog) Default is " << replayRequests << '\n' + << "\tworkers Number of thread pools workers. Only valid for thread-pool server type. Default is " << workerCount << '\n'; map args; @@ -338,7 +334,7 @@ int main(int argc, char** argv) { } } catch (std::exception& e) { - cerr << e.what() << endl; + cerr << e.what() << '\n'; cerr << usage.str(); } @@ -416,7 +412,7 @@ int main(int argc, char** argv) { new TNonblockingServer(serviceProcessor, protocolFactory, nbSocket2, threadManager))); } - cerr << "Starting the server on port " << port << " and " << (port + 1) << endl; + cerr << "Starting the server on port " << port << " and " << (port + 1) << '\n'; serverThread->start(); serverThread2->start(); @@ -475,7 +471,7 @@ int main(int argc, char** argv) { Synchronized s(monitor); threadCount = clientCount; - cerr << "Launch " << clientCount << " client threads" << endl; + cerr << "Launch " << clientCount << " client threads" << '\n'; time00 = std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count(); @@ -528,14 +524,14 @@ int main(int argc, char** argv) { averageTime /= clientCount; cout << "workers :" << workerCount << ", client : " << clientCount << ", loops : " << loopCount - << ", rate : " << (clientCount * loopCount * 1000) / ((double)(time01 - time00)) << endl; + << ", rate : " << (clientCount * loopCount * 1000) / ((double)(time01 - time00)) << '\n'; count_map count = serviceHandler->getCount(); count_map::iterator iter; for (iter = count.begin(); iter != count.end(); ++iter) { printf("%s => %d\n", iter->first, iter->second); } - cerr << "done." << endl; + cerr << "done." << '\n'; } return 0; diff --git a/test/cpp/src/TestClient.cpp b/test/cpp/src/TestClient.cpp index fd04ed87063..c15281a6a09 100644 --- a/test/cpp/src/TestClient.cpp +++ b/test/cpp/src/TestClient.cpp @@ -98,7 +98,7 @@ class TPedanticProtocol : public Proto ss << "ERROR: send request with seqid " << m_last_seqid << " and got reply with seqid " << seqid; throw std::logic_error(ss.str()); } /* else { - std::cout << "verified seqid " << m_last_seqid << " round trip OK" << std::endl; + std::cout << "verified seqid " << m_last_seqid << " round trip OK" << '\n'; } */ return result; } @@ -127,9 +127,9 @@ static void testString_clientReturn(event_base* base, std::ostringstream os; os << "test" << testNr; const bool ok = (s == os.str()); - cout << "testString: " << s << " " << ((ok) ? "ok" : "failed") << endl; + cout << "testString: " << s << " " << ((ok) ? "ok" : "failed") << '\n'; } catch (TException& exn) { - cout << "Error: " << exn.what() << endl; + cout << "Error: " << exn.what() << '\n'; } if (testNr == 9) @@ -139,7 +139,7 @@ static void testString_clientReturn(event_base* base, static void testVoid_clientReturn(event_base* base, ThriftTestCobClient* client) { try { client->recv_testVoid(); - cout << "testVoid" << endl; + cout << "testVoid" << '\n'; for (int testNr = 0; testNr < 10; ++testNr) { std::ostringstream os; @@ -151,16 +151,16 @@ static void testVoid_clientReturn(event_base* base, ThriftTestCobClient* client) os.str()); } } catch (TException& exn) { - cout << "Error: " << exn.what() << endl; + cout << "Error: " << exn.what() << '\n'; } } // Workaround for absense of C++11 "auto" keyword. template bool print_eq(T expected, T actual) { - cout << "(" << actual << ")" << endl; + cout << "(" << actual << ")" << '\n'; if (expected != actual) { - cout << "*** FAILED ***" << endl << "Expected: " << expected << " but got: " << actual << endl; + cout << "*** FAILED ***" << '\n' << "Expected: " << expected << " but got: " << actual << '\n'; return false; } return true; @@ -174,7 +174,7 @@ bool print_eq(T expected, T actual) { } catch (TTransportException&) { \ throw; \ } catch (exception & ex) { \ - cout << "*** FAILED ***" << endl << ex.what() << endl; \ + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; \ return_code |= ERR_BASETYPES; \ } @@ -186,7 +186,7 @@ bool print_eq(T expected, T actual) { } catch (TTransportException&) { \ throw; \ } catch (exception & ex) { \ - cout << "*** FAILED ***" << endl << ex.what() << endl; \ + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; \ return_code |= ERR_BASETYPES; \ } @@ -258,7 +258,7 @@ int main(int argc, char** argv) { boost::program_options::notify(vm); if (vm.count("help")) { - cout << desc << endl; + cout << desc << '\n'; return ERR_UNKNOWN; } @@ -290,8 +290,8 @@ int main(int argc, char** argv) { } } catch (exception& e) { - cerr << e.what() << endl; - cout << desc << endl; + cerr << e.what() << '\n'; + cout << desc << '\n'; return ERR_UNKNOWN; } @@ -319,9 +319,9 @@ int main(int argc, char** argv) { std::shared_ptr protocol2; // SecondService for multiplexed if (ssl) { - cout << "Client Certificate File: " << certPath << endl; - cout << "Client Key File: " << keyPath << endl; - cout << "CA File: " << caPath << endl; + cout << "Client Certificate File: " << certPath << '\n'; + cout << "Client Key File: " << keyPath << '\n'; + cout << "CA File: " << caPath << '\n'; factory = std::shared_ptr(new TSSLSocketFactory()); factory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); @@ -386,14 +386,14 @@ int main(int argc, char** argv) { if (port != 0) { cout << host << ":" << port; } - cout << endl; + cout << '\n'; if (transport_type.compare("evhttp") == 0) { event_base* base = event_base_new(); - cout << "Libevent Version: " << event_get_version() << endl; - cout << "Libevent Method: " << event_base_get_method(base) << endl; + cout << "Libevent Version: " << event_get_version() << '\n'; + cout << "Libevent Method: " << event_base_get_method(base) << '\n'; #if LIBEVENT_VERSION_NUMBER >= 0x02000000 - cout << "Libevent Features: 0x" << hex << event_base_get_features(base) << endl; + cout << "Libevent Features: 0x" << hex << event_base_get_features(base) << '\n'; #endif std::shared_ptr protocolFactory(new TBinaryProtocolFactory()); @@ -421,7 +421,7 @@ int main(int argc, char** argv) { try { transport->open(); } catch (TTransportException& ex) { - cout << "Connect failed: " << ex.what() << endl; + cout << "Connect failed: " << ex.what() << '\n'; return ERR_UNKNOWN; } @@ -438,12 +438,12 @@ int main(int argc, char** argv) { try { cout << "testVoid()" << flush; testClient.testVoid(); - cout << " = void" << endl; + cout << " = void" << '\n'; } catch (TTransportException&) { // Stop here if transport got broken throw; } catch (exception& ex) { - cout << "*** FAILED ***" << endl << ex.what() << endl; + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; return_code |= ERR_BASETYPES; } @@ -453,9 +453,9 @@ int main(int argc, char** argv) { cout << "testString(\"Test\")" << flush; string s; testClient.testString(s, "Test"); - cout << " = " << s << endl; + cout << " = " << s << '\n'; if (s != "Test") { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_BASETYPES; } @@ -471,9 +471,9 @@ int main(int argc, char** argv) { cout << "secondService.secondTestString(\"foo\") => " << flush; std::string result; ssc.secondtestString(result, "foo"); - cout << "{" << result << "}" << endl; + cout << "{" << result << "}" << '\n'; } catch (std::exception& e) { - cout << " *** FAILED *** " << e.what() << endl; + cout << " *** FAILED *** " << e.what() << '\n'; return_code |= ERR_EXCEPTIONS; } } @@ -514,16 +514,16 @@ int main(int argc, char** argv) { #endif cout << "testString(" << str << ") = " << flush; testClient.testString(s, str); - cout << s << endl; + cout << s << '\n'; if (s != str) { cout.imbue(locale("en_US.UTF8")); - cout << "*** FAILED ***" << endl << "Expected string: " << str << " but got: " << s << endl << "CLEAR"; + cout << "*** FAILED ***" << '\n' << "Expected string: " << str << " but got: " << s << '\n' << "CLEAR"; return_code |= ERR_BASETYPES; } } catch (TTransportException&) { throw; } catch (exception& ex) { - cout << "*** FAILED ***" << endl << ex.what() << endl; + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; return_code |= ERR_BASETYPES; return return_code; } @@ -537,11 +537,11 @@ int main(int argc, char** argv) { " char-to-test-json-parsing: ]] \"]] \\\" }}}{ [[[ "); cout << "testString(" << str << ") = " << flush; testClient.testString(s, str); - cout << s << endl; + cout << s << '\n'; if (s != str) { cout.imbue(locale("en_US.UTF8")); - cout << "*** FAILED ***" << endl - << "Expected string: " << str << " but got: " << s << endl + cout << "*** FAILED ***" << '\n' + << "Expected string: " << str << " but got: " << s << '\n' << "CLEAR"; ; return_code |= ERR_BASETYPES; @@ -549,7 +549,7 @@ int main(int argc, char** argv) { } catch (TTransportException&) { throw; } catch (exception& ex) { - cout << "*** FAILED ***" << endl << ex.what() << endl; + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; return_code |= ERR_BASETYPES; return return_code; } @@ -614,15 +614,15 @@ int main(int argc, char** argv) { double expected = pow(static_cast(10), 307); cout << "testDouble(" << expected << ") = " << flush; double actual = testClient.testDouble(expected); - cout << "(" << actual << ")" << endl; + cout << "(" << actual << ")" << '\n'; if (expected - actual > pow(static_cast(10), 292)) { - cout << "*** FAILED ***" << endl - << "Expected: " << expected << " but got: " << actual << endl; + cout << "*** FAILED ***" << '\n' + << "Expected: " << expected << " but got: " << actual << '\n'; } } catch (TTransportException&) { throw; } catch (exception& ex) { - cout << "*** FAILED ***" << endl << ex.what() << endl; + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; return_code |= ERR_BASETYPES; } @@ -630,15 +630,15 @@ int main(int argc, char** argv) { double expected = pow(static_cast(10), -292); cout << "testDouble(" << expected << ") = " << flush; double actual = testClient.testDouble(expected); - cout << "(" << actual << ")" << endl; + cout << "(" << actual << ")" << '\n'; if (expected - actual > pow(static_cast(10), -307)) { - cout << "*** FAILED ***" << endl - << "Expected: " << expected << " but got: " << actual << endl; + cout << "*** FAILED ***" << '\n' + << "Expected: " << expected << " but got: " << actual << '\n'; } } catch (TTransportException&) { throw; } catch (exception& ex) { - cout << "*** FAILED ***" << endl << ex.what() << endl; + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; return_code |= ERR_BASETYPES; } @@ -677,7 +677,7 @@ int main(int argc, char** argv) { in.i32_thing, in.i64_thing); if (in != out) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_STRUCTS; } @@ -700,7 +700,7 @@ int main(int argc, char** argv) { in.i64_thing, in2.i32_thing); if (in2 != out2) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_STRUCTS; } @@ -735,9 +735,9 @@ int main(int argc, char** argv) { } cout << m_iter->first << " => " << m_iter->second; } - cout << "}" << endl; + cout << "}" << '\n'; if (mapin != mapout) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_CONTAINERS; } @@ -760,15 +760,15 @@ int main(int argc, char** argv) { first = false; cout << it->first << " => " << it->second; } - cout << "}" << endl; + cout << "}" << '\n'; if (smapin != smapout) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_CONTAINERS; } } catch (TTransportException&) { throw; } catch (exception& ex) { - cout << "*** FAILED ***" << endl << ex.what() << endl; + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; return_code |= ERR_CONTAINERS; } @@ -803,9 +803,9 @@ int main(int argc, char** argv) { } cout << *s_iter; } - cout << "}" << endl; + cout << "}" << '\n'; if (setin != setout) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_CONTAINERS; } @@ -817,14 +817,14 @@ int main(int argc, char** argv) { vector listout; testClient.testList(listout, vector()); if (!listout.empty()) { - cout << "*** FAILED ***" << endl; - cout << "invalid length: " << listout.size() << endl; + cout << "*** FAILED ***" << '\n'; + cout << "invalid length: " << listout.size() << '\n'; return_code |= ERR_CONTAINERS; } } catch (TTransportException&) { throw; } catch (exception& ex) { - cout << "*** FAILED ***" << endl << ex.what() << endl; + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; return_code |= ERR_CONTAINERS; } try { @@ -856,15 +856,15 @@ int main(int argc, char** argv) { } cout << *l_iter; } - cout << "}" << endl; + cout << "}" << '\n'; if (listin != listout) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_CONTAINERS; } } catch (TTransportException&) { throw; } catch (exception& ex) { - cout << "*** FAILED ***" << endl << ex.what() << endl; + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; return_code |= ERR_CONTAINERS; } @@ -873,41 +873,41 @@ int main(int argc, char** argv) { */ cout << "testEnum(ONE)" << flush; Numberz::type ret = testClient.testEnum(Numberz::ONE); - cout << " = " << ret << endl; + cout << " = " << ret << '\n'; if (ret != Numberz::ONE) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_STRUCTS; } cout << "testEnum(TWO)" << flush; ret = testClient.testEnum(Numberz::TWO); - cout << " = " << ret << endl; + cout << " = " << ret << '\n'; if (ret != Numberz::TWO) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_STRUCTS; } cout << "testEnum(THREE)" << flush; ret = testClient.testEnum(Numberz::THREE); - cout << " = " << ret << endl; + cout << " = " << ret << '\n'; if (ret != Numberz::THREE) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_STRUCTS; } cout << "testEnum(FIVE)" << flush; ret = testClient.testEnum(Numberz::FIVE); - cout << " = " << ret << endl; + cout << " = " << ret << '\n'; if (ret != Numberz::FIVE) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_STRUCTS; } cout << "testEnum(EIGHT)" << flush; ret = testClient.testEnum(Numberz::EIGHT); - cout << " = " << ret << endl; + cout << " = " << ret << '\n'; if (ret != Numberz::EIGHT) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_STRUCTS; } @@ -916,9 +916,9 @@ int main(int argc, char** argv) { */ cout << "testTypedef(309858235082523)" << flush; UserId uid = testClient.testTypedef(309858235082523LL); - cout << " = " << uid << endl; + cout << " = " << uid << '\n'; if (uid != 309858235082523LL) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_STRUCTS; } @@ -938,7 +938,7 @@ int main(int argc, char** argv) { } cout << "}, "; } - cout << "}" << endl; + cout << "}" << '\n'; if (mm.size() != 2 || mm[-4][-4] != -4 || mm[-4][-3] != -3 || @@ -948,7 +948,7 @@ int main(int argc, char** argv) { mm[4][3] != 3 || mm[4][2] != 2 || mm[4][1] != 1) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_CONTAINERS; } @@ -1005,7 +1005,7 @@ int main(int argc, char** argv) { } cout << "}, "; } - cout << "}" << endl; + cout << "}" << '\n'; bool failed = false; map >::const_iterator it1 = whoa.find(UserId(1)); if (whoa.size() != 2) { @@ -1033,7 +1033,7 @@ int main(int argc, char** argv) { } } if (failed) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_STRUCTS; } } @@ -1041,7 +1041,7 @@ int main(int argc, char** argv) { /** * MULTI TEST */ - cout << "testMulti()" << endl; + cout << "testMulti()" << '\n'; try { map mul_map; Xtruct mul_result; @@ -1054,13 +1054,13 @@ int main(int argc, char** argv) { xxs.i32_thing = 4242; xxs.i64_thing = 424242; if (mul_result != xxs) { - cout << "*** FAILED ***" << endl; + cout << "*** FAILED ***" << '\n'; return_code |= ERR_STRUCTS; } } catch (TTransportException&) { throw; } catch (exception& ex) { - cout << "*** FAILED ***" << endl << ex.what() << endl; + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; return_code |= ERR_STRUCTS; } @@ -1069,7 +1069,7 @@ int main(int argc, char** argv) { try { cout << "testClient.testException(\"Xception\") =>" << flush; testClient.testException("Xception"); - cout << " void\n*** FAILED ***" << endl; + cout << " void\n*** FAILED ***" << '\n'; return_code |= ERR_EXCEPTIONS; } catch (Xception& e) { @@ -1079,19 +1079,19 @@ int main(int argc, char** argv) { try { cout << "testClient.testException(\"TException\") =>" << flush; testClient.testException("TException"); - cout << " void\n*** FAILED ***" << endl; + cout << " void\n*** FAILED ***" << '\n'; return_code |= ERR_EXCEPTIONS; } catch (const TException&) { - cout << " Caught TException" << endl; + cout << " Caught TException" << '\n'; } try { cout << "testClient.testException(\"success\") =>" << flush; testClient.testException("success"); - cout << " void" << endl; + cout << " void" << '\n'; } catch (exception & ex) { \ - cout << "*** FAILED ***" << endl << ex.what() << endl; + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; return_code |= ERR_EXCEPTIONS; } @@ -1101,7 +1101,7 @@ int main(int argc, char** argv) { cout << "testClient.testMultiException(\"Xception\", \"test 1\") =>" << flush; Xtruct result; testClient.testMultiException(result, "Xception", "test 1"); - cout << " result\n*** FAILED ***" << endl; + cout << " result\n*** FAILED ***" << '\n'; return_code |= ERR_EXCEPTIONS; } catch (Xception& e) { printf(" {%u, \"%s\"}\n", e.errorCode, e.message.c_str()); @@ -1111,7 +1111,7 @@ int main(int argc, char** argv) { cout << "testClient.testMultiException(\"Xception2\", \"test 2\") =>" << flush; Xtruct result; testClient.testMultiException(result, "Xception2", "test 2"); - cout << " result\n*** FAILED ***" << endl; + cout << " result\n*** FAILED ***" << '\n'; return_code |= ERR_EXCEPTIONS; } catch (Xception2& e) { @@ -1124,7 +1124,7 @@ int main(int argc, char** argv) { testClient.testMultiException(result, "success", "test 3"); printf(" {{\"%s\"}}\n", result.string_thing.c_str()); } catch (exception & ex) { \ - cout << "*** FAILED ***" << endl << ex.what() << endl; + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; return_code |= ERR_EXCEPTIONS; } @@ -1155,16 +1155,16 @@ int main(int argc, char** argv) { */ cout << "re-test testI32(-1)" << flush; int i32 = testClient.testI32(-1); - cout << " = " << i32 << endl; + cout << " = " << i32 << '\n'; if (i32 != -1) return_code |= ERR_BASETYPES; - cout << endl << "All tests done." << endl << flush; + cout << '\n' << "All tests done." << '\n' << flush; uint64_t stop = now(); uint64_t tot = stop - start; - cout << "Total time: " << stop - start << " us" << endl; + cout << "Total time: " << stop - start << " us" << '\n'; time_tot += tot; if (time_min == 0 || tot < time_min) { @@ -1181,9 +1181,9 @@ int main(int argc, char** argv) { uint64_t time_avg = time_tot / numTests; - cout << "Min time: " << time_min << " us" << endl; - cout << "Max time: " << time_max << " us" << endl; - cout << "Avg time: " << time_avg << " us" << endl; + cout << "Min time: " << time_min << " us" << '\n'; + cout << "Max time: " << time_max << " us" << '\n'; + cout << "Avg time: " << time_avg << " us" << '\n'; return return_code; } @@ -1225,26 +1225,26 @@ int binary_test(ThriftTestClient& testClient, string::size_type siz) string bin_request; string bin_result; - cout << "testBinary(siz = " << siz << ")" << endl; + cout << "testBinary(siz = " << siz << ")" << '\n'; binary_fill(bin_request, siz); try { testClient.testBinary(bin_result, bin_request); if (bin_request.size() != bin_result.size()) { - cout << "*** FAILED: request size " << bin_request.size() << "; result size " << bin_result.size() << endl; + cout << "*** FAILED: request size " << bin_request.size() << "; result size " << bin_result.size() << '\n'; return ERR_BASETYPES; } for (string::size_type i = 0; i < siz; ++i) { if (bin_request.at(i) != bin_result.at(i)) { - cout << "*** FAILED: at position " << i << " request[i] is h" << hex << bin_request.at(i) << " result[i] is h" << hex << bin_result.at(i) << endl; + cout << "*** FAILED: at position " << i << " request[i] is h" << hex << bin_request.at(i) << " result[i] is h" << hex << bin_result.at(i) << '\n'; return ERR_BASETYPES; } } } catch (TTransportException&) { throw; } catch (exception& ex) { - cout << "*** FAILED ***" << endl << ex.what() << endl; + cout << "*** FAILED ***" << '\n' << ex.what() << '\n'; return ERR_BASETYPES; } diff --git a/test/cpp/src/TestServer.cpp b/test/cpp/src/TestServer.cpp index 6c61f402f8d..afd293814de 100644 --- a/test/cpp/src/TestServer.cpp +++ b/test/cpp/src/TestServer.cpp @@ -394,7 +394,7 @@ class TestProcessorEventHandler : public TProcessorEventHandler { } void communicate(const char* event, void* ctx, const char* fn_name) { - std::cout << event << ": " << *static_cast(ctx) << " = " << fn_name << std::endl; + std::cout << event << ": " << *static_cast(ctx) << " = " << fn_name << '\n'; } }; @@ -655,7 +655,7 @@ int main(int argc, char** argv) { } } catch (std::exception& e) { - cerr << e.what() << endl; + cerr << e.what() << '\n'; cout << desc << "\n"; return 1; } @@ -767,7 +767,7 @@ int main(int argc, char** argv) { if (port != 0) { cout << port; } - cout << endl; + cout << '\n'; // Multiplexed Processor if needed if (boost::starts_with(protocol_type, "multi")) { @@ -823,7 +823,7 @@ int main(int argc, char** argv) { : new transport::TNonblockingServerSocket(port)); server.reset(new TNonblockingServer(testProcessor, protocolFactory, nbSocket)); } else { - cerr << "server-type nonblocking requires transport of http or framed" << endl; + cerr << "server-type nonblocking requires transport of http or framed" << '\n'; exit(1); } } @@ -857,6 +857,6 @@ int main(int argc, char** argv) { server.reset(); } - cout << "done." << endl; + cout << "done." << '\n'; return 0; } diff --git a/tutorial/cpp/CppClient.cpp b/tutorial/cpp/CppClient.cpp index 520841143b4..02e7b17ce8c 100644 --- a/tutorial/cpp/CppClient.cpp +++ b/tutorial/cpp/CppClient.cpp @@ -43,9 +43,9 @@ int main() { transport->open(); client.ping(); - cout << "ping()" << endl; + cout << "ping()" << '\n'; - cout << "1 + 1 = " << client.add(1, 1) << endl; + cout << "1 + 1 = " << client.add(1, 1) << '\n'; Work work; work.op = Operation::DIVIDE; @@ -54,27 +54,27 @@ int main() { try { client.calculate(1, work); - cout << "Whoa? We can divide by zero!" << endl; + cout << "Whoa? We can divide by zero!" << '\n'; } catch (InvalidOperation& io) { - cout << "InvalidOperation: " << io.why << endl; - // or using generated operator<<: cout << io << endl; - // or by using std::exception native method what(): cout << io.what() << endl; + cout << "InvalidOperation: " << io.why << '\n'; + // or using generated operator<<: cout << io << '\n'; + // or by using std::exception native method what(): cout << io.what() << '\n'; } work.op = Operation::SUBTRACT; work.num1 = 15; work.num2 = 10; int32_t diff = client.calculate(1, work); - cout << "15 - 10 = " << diff << endl; + cout << "15 - 10 = " << diff << '\n'; // Note that C++ uses return by reference for complex types to avoid // costly copy construction SharedStruct ss; client.getStruct(ss, 1); - cout << "Received log: " << ss << endl; + cout << "Received log: " << ss << '\n'; transport->close(); } catch (TException& tx) { - cout << "ERROR: " << tx.what() << endl; + cout << "ERROR: " << tx.what() << '\n'; } } diff --git a/tutorial/cpp/CppServer.cpp b/tutorial/cpp/CppServer.cpp index 635afefda0d..4c66cb894d5 100644 --- a/tutorial/cpp/CppServer.cpp +++ b/tutorial/cpp/CppServer.cpp @@ -48,15 +48,15 @@ class CalculatorHandler : public CalculatorIf { public: CalculatorHandler() = default; - void ping() override { cout << "ping()" << endl; } + void ping() override { cout << "ping()" << '\n'; } int32_t add(const int32_t n1, const int32_t n2) override { - cout << "add(" << n1 << ", " << n2 << ")" << endl; + cout << "add(" << n1 << ", " << n2 << ")" << '\n'; return n1 + n2; } int32_t calculate(const int32_t logid, const Work& work) override { - cout << "calculate(" << logid << ", " << work << ")" << endl; + cout << "calculate(" << logid << ", " << work << ")" << '\n'; int32_t val; switch (work.op) { @@ -95,11 +95,11 @@ class CalculatorHandler : public CalculatorIf { } void getStruct(SharedStruct& ret, const int32_t logid) override { - cout << "getStruct(" << logid << ")" << endl; + cout << "getStruct(" << logid << ")" << '\n'; ret = log[logid]; } - void zip() override { cout << "zip()" << endl; } + void zip() override { cout << "zip()" << '\n'; } protected: map log; @@ -172,8 +172,8 @@ int main() { threadManager); */ - cout << "Starting the server..." << endl; + cout << "Starting the server..." << '\n'; server.serve(); - cout << "Done." << endl; + cout << "Done." << '\n'; return 0; } From 3dfe0af4203ed261359acddc18062ff90a492d63 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 24 Apr 2024 23:54:45 +0200 Subject: [PATCH 053/430] THRIFT-5780 Prevent certain warnings related to net8 Client: netstd Patch: Jens Geyer This closes #2965 --- compiler/cpp/src/thrift/generate/t_netstd_generator.cc | 2 ++ lib/netstd/Thrift/Transport/Client/THttpTransport.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc index 6e464549784..c16a0694c0b 100644 --- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc @@ -2019,6 +2019,8 @@ void t_netstd_generator::generate_deprecation_attribute(ostream& out, t_function // empty annotation values end up with "1" somewhere, ignore these as well if ((iter->second.back().length() > 0) && (iter->second.back() != "1")) { out << "(" << make_csharp_string_literal(iter->second.back()) << ")"; + } else { + out << "(" << make_csharp_string_literal("This code is deprecated.") << ")"; // generic message to prevent CA1041 } out << "]" << '\n'; } diff --git a/lib/netstd/Thrift/Transport/Client/THttpTransport.cs b/lib/netstd/Thrift/Transport/Client/THttpTransport.cs index 1ab1caf729c..e724665fecd 100644 --- a/lib/netstd/Thrift/Transport/Client/THttpTransport.cs +++ b/lib/netstd/Thrift/Transport/Client/THttpTransport.cs @@ -25,6 +25,8 @@ using System.Threading; using System.Threading.Tasks; +#pragma warning disable IDE0079 // unneeded suppression -> all except net8 +#pragma warning disable IDE0301 // simplify collection init -> net8 only namespace Thrift.Transport.Client { From 4f1839575f3af168f960110414114255bd344203 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 26 Apr 2024 00:23:35 +0200 Subject: [PATCH 054/430] THRIFT-5781 implement full deprecation support Client: netstd Patch: Jens Geyer --- .../src/thrift/generate/t_netstd_generator.cc | 114 ++++++++++++++++-- .../src/thrift/generate/t_netstd_generator.h | 4 +- 2 files changed, 109 insertions(+), 9 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc index c16a0694c0b..e6176a7e187 100644 --- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc @@ -219,6 +219,10 @@ void t_netstd_generator::pragmas_and_directives(ostream& out) out << "#pragma warning disable IDE1006 // parts of the code use IDL spelling" << '\n'; out << "#pragma warning disable CA1822 // empty " << DEEP_COPY_METHOD_NAME << "() methods still non-static" << '\n'; + if( any_deprecations()) { + out << "#pragma warning disable CS0618 // silence our own deprecation warnings" << '\n'; + } + if( target_net_version < 6) { out << "#pragma warning disable IDE0083 // pattern matching \"that is not SomeType\" requires net5.0 but we still support earlier versions" << '\n'; } @@ -226,6 +230,86 @@ void t_netstd_generator::pragmas_and_directives(ostream& out) } +bool t_netstd_generator::any_deprecations() +{ + // enums + vector enums = program_->get_enums(); + vector::iterator en_iter; + for (en_iter = enums.begin(); en_iter != enums.end(); ++en_iter) { + if( is_deprecated((*en_iter)->annotations_)) { + return true; + } + + // enum values + vector evals = (*en_iter)->get_constants(); + vector::iterator ev_iter; + for (ev_iter = evals.begin(); ev_iter != evals.end(); ++ev_iter) { + if( is_deprecated((*ev_iter)->annotations_)) { + return true; + } + } + } + + // typedefs + vector typedefs = program_->get_typedefs(); + vector::iterator td_iter; + for (td_iter = typedefs.begin(); td_iter != typedefs.end(); ++td_iter) { + if( is_deprecated((*td_iter)->annotations_)) { + return true; + } + } + + // structs, exceptions, unions + vector objects = program_->get_objects(); + vector::iterator o_iter; + for (o_iter = objects.begin(); o_iter != objects.end(); ++o_iter) { + if( is_deprecated((*o_iter)->annotations_)) { + return true; + } + + // struct members + const vector& members = (*o_iter)->get_members(); + vector::const_iterator m_iter; + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + if( is_deprecated((*m_iter)->annotations_)) { + return true; + } + } + } + + /* not yet + // constants + vector consts = program_->get_consts(); + vector::iterator c_iter; + for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) { + if( is_deprecated((*c_iter)->annotations_)) { + return true; + } + } + */ + + // services + vector services = program_->get_services(); + vector::iterator sv_iter; + for (sv_iter = services.begin(); sv_iter != services.end(); ++sv_iter) { + if( is_deprecated((*sv_iter)->annotations_)) { + return true; + } + + // service methods + vector functions = (*sv_iter)->get_functions(); + vector::iterator f_iter; + for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { + if( is_deprecated((*f_iter)->annotations_)) { + return true; + } + } + } + + return false; +} + + void t_netstd_generator::start_netstd_namespace(ostream& out) { if (!namespace_name_.empty()) @@ -315,6 +399,7 @@ void t_netstd_generator::generate_enum(ostream& out, t_enum* tenum) start_netstd_namespace(out); generate_netstd_doc(out, tenum); + generate_deprecation_attribute(out, tenum->annotations_); out << indent() << "public enum " << type_name(tenum,false) << '\n'; scope_up(out); @@ -325,6 +410,7 @@ void t_netstd_generator::generate_enum(ostream& out, t_enum* tenum) { generate_netstd_doc(out, *c_iter); int value = (*c_iter)->get_value(); + generate_deprecation_attribute(out, (*c_iter)->annotations_); out << indent() << normalize_name((*c_iter)->get_name()) << " = " << value << "," << '\n'; } @@ -850,6 +936,7 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc string sharp_struct_name = type_name(tstruct, false); + generate_deprecation_attribute(out, tstruct->annotations_); out << indent() << "public " << (is_final ? "sealed " : "") << "partial class " << sharp_struct_name << " : "; if (is_exception) @@ -1055,6 +1142,7 @@ void t_netstd_generator::generate_netstd_wcffault(ostream& out, t_struct* tstruc bool is_final = tstruct->annotations_.find("final") != tstruct->annotations_.end(); + generate_deprecation_attribute(out, tstruct->annotations_); out << indent() << "public " << (is_final ? "sealed " : "") << "partial class " << type_name(tstruct,false) << "Fault" << '\n' << indent() << "{" << '\n'; indent_up(); @@ -1103,7 +1191,7 @@ void t_netstd_generator::generate_netstd_deepcopy_method(ostream& out, t_struct* out << '\n' << indent() << "{" << '\n'; indent_up(); } else { - out << '\n'; + out << ";\n"; } for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -1526,6 +1614,7 @@ void t_netstd_generator::generate_netstd_union_definition(ostream& out, t_struct // Let's define the class first start_netstd_namespace(out); + generate_deprecation_attribute(out, tunion->annotations_); out << indent() << "public abstract partial class " << normalize_name(tunion->get_name()) << " : TUnionBase" << '\n'; out << indent() << "{" << '\n'; indent_up(); @@ -1979,6 +2068,7 @@ void t_netstd_generator::generate_service_interface(ostream& out, t_service* tse out << indent() << "[ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << '\n'; } + generate_deprecation_attribute(out, tservice->annotations_); prepare_member_name_mapping(tservice); out << indent() << "public interface IAsync" << extends_iface << '\n' << indent() << "{" << '\n'; @@ -2003,7 +2093,7 @@ void t_netstd_generator::generate_service_interface(ostream& out, t_service* tse } } - generate_deprecation_attribute(out, *f_iter); + generate_deprecation_attribute(out, (*f_iter)->annotations_); out << indent() << function_signature_async(*f_iter) << ";" << '\n' << '\n'; } indent_down(); @@ -2011,10 +2101,16 @@ void t_netstd_generator::generate_service_interface(ostream& out, t_service* tse cleanup_member_name_mapping(tservice); } -void t_netstd_generator::generate_deprecation_attribute(ostream& out, t_function* func) +bool t_netstd_generator::is_deprecated(std::map>& annotations) +{ + auto iter = annotations.find("deprecated"); + return (annotations.end() != iter); +} + +void t_netstd_generator::generate_deprecation_attribute(ostream& out, std::map>& annotations) { - auto iter = func->annotations_.find("deprecated"); - if( func->annotations_.end() != iter) { + auto iter = annotations.find("deprecated"); + if( annotations.end() != iter) { out << indent() << "[Obsolete"; // empty annotation values end up with "1" somewhere, ignore these as well if ((iter->second.back().length() > 0) && (iter->second.back() != "1")) { @@ -2066,6 +2162,7 @@ void t_netstd_generator::generate_service_client(ostream& out, t_service* tservi out << '\n'; generate_netstd_doc(out, tservice); + generate_deprecation_attribute(out, tservice->annotations_); prepare_member_name_mapping(tservice); out << indent() << "public class Client : " << extends_client << "IAsync" << '\n' << indent() << "{" << '\n'; @@ -2089,7 +2186,7 @@ void t_netstd_generator::generate_service_client(ostream& out, t_service* tservi string function_name = raw_func_name + (add_async_postfix ? "Async" : ""); // async - generate_deprecation_attribute(out, *functions_iterator); + generate_deprecation_attribute(out, (*functions_iterator)->annotations_); out << indent() << "public async " << function_signature_async(*functions_iterator, "") << '\n' << indent() << "{" << '\n'; indent_up(); @@ -2107,7 +2204,7 @@ void t_netstd_generator::generate_service_client(ostream& out, t_service* tservi out << indent() << "}" << '\n' << '\n'; // async send - generate_deprecation_attribute(out, *functions_iterator); + generate_deprecation_attribute(out, (*functions_iterator)->annotations_); out << indent() << "public async " << function_signature_async(*functions_iterator, "send_", MODE_NO_RETURN) << '\n' << indent() << "{" << '\n'; indent_up(); @@ -2148,7 +2245,7 @@ void t_netstd_generator::generate_service_client(ostream& out, t_service* tservi if (!(*functions_iterator)->is_oneway()) { // async recv - generate_deprecation_attribute(out, *functions_iterator); + generate_deprecation_attribute(out, (*functions_iterator)->annotations_); out << indent() << "public async " << function_signature_async(*functions_iterator, "recv_", MODE_NO_ARGS) << '\n' << indent() << "{" << '\n'; indent_up(); @@ -3022,6 +3119,7 @@ void t_netstd_generator::generate_netstd_property(ostream& out, t_field* tfield, { out << indent() << "[DataMember(Order = 0)]" << '\n'; } + generate_deprecation_attribute(out, tfield->annotations_); out << indent() << (isPublic ? "public " : "private ") diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.h b/compiler/cpp/src/thrift/generate/t_netstd_generator.h index a6e4d90a496..c65414a4cdc 100644 --- a/compiler/cpp/src/thrift/generate/t_netstd_generator.h +++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.h @@ -104,7 +104,7 @@ class t_netstd_generator : public t_oop_generator void generate_netstd_union_reader(ostream& out, t_struct* tunion); void generate_function_helpers(ostream& out, t_function* tfunction); void generate_service_interface(ostream& out, t_service* tservice); - void generate_deprecation_attribute(ostream& out, t_function* func); + void generate_deprecation_attribute(ostream& out, std::map>& annotations); void generate_service_helpers(ostream& out, t_service* tservice); void generate_service_client(ostream& out, t_service* tservice); void generate_service_server(ostream& out, t_service* tservice); @@ -218,6 +218,8 @@ class t_netstd_generator : public t_oop_generator string initialize_field(t_field* tfield); void pragmas_and_directives(ostream& out); + bool any_deprecations(); + bool is_deprecated(std::map>& annotations); bool is_nullable_type(t_type* ttype); bool force_member_nullable(t_field* tfield); // see there string nullable_suffix(); // unconditionally From c3d8a4ef61b439464cd2d5c417a6ceb03e6cafb1 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sat, 27 Apr 2024 00:08:15 +0200 Subject: [PATCH 055/430] THRIFT-5782 implement full deprecation support Client: Delphi Patch: Jens Geyer plus a minor netstd fix --- .../src/thrift/generate/t_delphi_generator.cc | 70 ++++++++++++++----- .../src/thrift/generate/t_netstd_generator.cc | 5 +- 2 files changed, 54 insertions(+), 21 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc index d5e8d5d2229..f624bb048bb 100644 --- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc @@ -191,6 +191,9 @@ class t_delphi_generator : public t_oop_generator { t_struct* tstruct, bool is_exception); + bool is_deprecated(std::map>& annotations); + std::string render_deprecation_attribute(std::map>& annotations, std::string prefix, std::string postfix); + bool const_needs_var(t_type* type); void print_const_prop(std::ostream& out, string name, t_type* type, t_const_value* value); void print_private_field(std::ostream& out, string name, t_type* type, t_const_value* value); @@ -961,11 +964,12 @@ void t_delphi_generator::generate_enum(t_enum* tenum) { } generate_delphi_doc(s_enum, *c_iter); indent(s_enum) << normalize_name((*c_iter)->get_name()) << " = " << value; + s_enum << render_deprecation_attribute((*c_iter)->annotations_, " // ", ""); } } s_enum << '\n'; indent_down(); - indent(s_enum) << ");" << '\n' << '\n'; + indent(s_enum) << ")" << render_deprecation_attribute(tenum->annotations_, " ", "") << ";" << '\n' << '\n'; indent_down(); } @@ -1709,7 +1713,9 @@ void t_delphi_generator::generate_delphi_struct_definition(ostream& out, } indent_down(); - indent(out) << "end;" << '\n'; + indent(out) << "end;" + << render_deprecation_attribute(tstruct->annotations_, " // ", "") + << '\n'; if(rtti_) { indent(out) << "{$IFNDEF TYPEINFO_WAS_ON} {$TYPEINFO OFF} {$ENDIF}" << '\n'; } @@ -1800,11 +1806,11 @@ void t_delphi_generator::generate_delphi_struct_definition(ostream& out, indent_up(); if ((members.size() > 0) && is_exception && (!is_x_factory)) { - indent(out) << "constructor Create; overload;" << '\n'; + indent(out) << "constructor Create; overload;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n'; indent(out) << "constructor Create(" << constructor_argument_list(tstruct, indent()) - << "); overload;" << '\n'; + << "); overload;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n'; } else { - indent(out) << "constructor Create;" << '\n'; + indent(out) << "constructor Create;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n'; } indent(out) << "destructor Destroy; override;" << '\n'; @@ -1905,7 +1911,9 @@ void t_delphi_generator::generate_service_interface(t_service* tservice, bool fo indent(s_service) << function_signature(*f_iter, for_async) << '\n'; } indent_down(); - indent(s_service) << "end;" << '\n' << '\n'; + indent(s_service) << "end;" + << render_deprecation_attribute( tservice->annotations_, " // ", "") + << '\n' << '\n'; indent_down(); } @@ -2222,7 +2230,9 @@ void t_delphi_generator::generate_service_client(t_service* tservice) { } indent_down(); - indent(s_service) << "end;" << '\n' << '\n'; + indent(s_service) << "end;" + << render_deprecation_attribute( tservice->annotations_, " // ", "") + << '\n' << '\n'; } void t_delphi_generator::generate_service_server(t_service* tservice) { @@ -2990,7 +3000,9 @@ void t_delphi_generator::generate_delphi_property(ostream& out, << type_name(ftype, false, true, is_xception, true) << " read " << prop_name(tfield, struct_is_xception, fieldPrefix) << " write " << prop_name(tfield, struct_is_xception, "Set") - << ";" << '\n'; + << ";" + << render_deprecation_attribute(tfield->annotations_, " // ", ";") + << '\n'; } std::string t_delphi_generator::prop_name(t_field* tfield, bool is_xception, std::string prefix) { @@ -3238,15 +3250,7 @@ string t_delphi_generator::function_signature(t_function* tfunction, // deprecated method? only at intf decl! if( full_cls == "") { - auto iter = tfunction->annotations_.find("deprecated"); - if( tfunction->annotations_.end() != iter && !iter->second.empty()) { - signature += " deprecated"; - // empty annotation values end up with "1" somewhere, ignore these as well - if ((iter->second.back().length() > 0) && (iter->second.back() != "1")) { - signature += " " + make_pascal_string_literal(iter->second.back()); - } - signature += ";"; - } + signature += render_deprecation_attribute(tfunction->annotations_, " ", ";"); } return signature; @@ -3417,6 +3421,7 @@ void t_delphi_generator::generate_delphi_property_writer_definition(ostream& out indent(out) << "procedure " << prop_name(tfield, is_xception_class, "Set") << "( const Value: " << type_name(ftype, false, true, is_xception, true) << ");" + << render_deprecation_attribute(tfield->annotations_, " ", ";") << '\n'; } @@ -3427,7 +3432,9 @@ void t_delphi_generator::generate_delphi_property_reader_definition(ostream& out bool is_xception = ftype->is_xception(); indent(out) << "function " << prop_name(tfield, is_xception_class, "Get") << ": " - << type_name(ftype, false, true, is_xception, true) << ";" << '\n'; + << type_name(ftype, false, true, is_xception, true) << ";" + << render_deprecation_attribute(tfield->annotations_, " ", ";") + << '\n'; } void t_delphi_generator::generate_delphi_isset_reader_writer_definition(ostream& out, @@ -4043,6 +4050,33 @@ std::string t_delphi_generator::display_name() const { } +bool t_delphi_generator::is_deprecated(std::map>& annotations) +{ + auto iter = annotations.find("deprecated"); + return (annotations.end() != iter); +} + +std::string t_delphi_generator::render_deprecation_attribute(std::map>& annotations, std::string prefix, std::string postfix) +{ + std::string result = ""; + auto iter = annotations.find("deprecated"); + if( annotations.end() != iter) { + result += prefix; + result += "deprecated"; + + // empty annotation values end up with "1" somewhere, ignore these as well + if ((iter->second.back().length() > 0) && (iter->second.back() != "1")) { + result += " " + make_pascal_string_literal(iter->second.back()); + } + + result += postfix; + } + return result; +} + + + + THRIFT_REGISTER_GENERATOR( delphi, "Delphi", diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc index e6176a7e187..feb58a0aa2e 100644 --- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc @@ -2519,8 +2519,7 @@ void t_netstd_generator::generate_process_function_async(ostream& out, t_service const vector& fields = arg_struct->get_members(); vector::const_iterator f_iter; - bool is_deprecated = (tfunction->annotations_.end() != tfunction->annotations_.find("deprecated")); - if( is_deprecated) { + if( is_deprecated(tfunction->annotations_)) { out << indent() << "#pragma warning disable CS0618,CS0612" << '\n'; } @@ -2558,7 +2557,7 @@ void t_netstd_generator::generate_process_function_async(ostream& out, t_service out << "" << CANCELLATION_TOKEN_NAME << ");" << '\n'; - if( is_deprecated) { + if( is_deprecated(tfunction->annotations_)) { out << indent() << "#pragma warning restore CS0618,CS0612" << '\n'; } From 344498b67f42af38118cc250b0b1ec212f09d927 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Mon, 29 Apr 2024 15:16:39 -0700 Subject: [PATCH 056/430] go: Define a bytePool for TRichTransport Client: go TBinaryProtocol and TCompactProtocol (and as an extension, THeaderProtocol) use TRichTransport's ReadByte/WriteByte functions a lot under the hood, and in some extreme cases those ReadByte/WriteByte calls can generate a lot of allocations for the byte they used. Use a resource pool to help reduce the allocations. --- lib/go/thrift/rich_transport.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/go/thrift/rich_transport.go b/lib/go/thrift/rich_transport.go index 83fdf29f5cb..f3d819e2330 100644 --- a/lib/go/thrift/rich_transport.go +++ b/lib/go/thrift/rich_transport.go @@ -49,9 +49,15 @@ func (r *RichTransport) RemainingBytes() (num_bytes uint64) { return r.TTransport.RemainingBytes() } +var bytePool = newPool(nil, func(b *[1]byte) { + b[0] = 0 +}) + func readByte(r io.Reader) (c byte, err error) { - v := [1]byte{0} - n, err := r.Read(v[0:1]) + v := bytePool.get() + defer bytePool.put(&v) + + n, err := r.Read(v[:]) if n > 0 && (err == nil || errors.Is(err, io.EOF)) { return v[0], nil } @@ -65,7 +71,10 @@ func readByte(r io.Reader) (c byte, err error) { } func writeByte(w io.Writer, c byte) error { - v := [1]byte{c} - _, err := w.Write(v[0:1]) + v := bytePool.get() + defer bytePool.put(&v) + + v[0] = c + _, err := w.Write(v[:]) return err } From 91d37026c3cd746a70d59bc9881d1a2cd94cf890 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Wed, 1 May 2024 09:17:09 -0700 Subject: [PATCH 057/430] Revert "go: Define a bytePool for TRichTransport" This reverts commit 344498b67f42af38118cc250b0b1ec212f09d927. In our extreme case this actually made things worse. On 30s cpu profiles, although mallocgc reduced from 27.13s to 26.30s, the byte pool itself costed 11.9s. Looking at writeByte and readByte, writeByte increased from 3.69s to 5.89s, and readByte increased from 11.36s to 16.09s. --- lib/go/thrift/rich_transport.go | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/lib/go/thrift/rich_transport.go b/lib/go/thrift/rich_transport.go index f3d819e2330..83fdf29f5cb 100644 --- a/lib/go/thrift/rich_transport.go +++ b/lib/go/thrift/rich_transport.go @@ -49,15 +49,9 @@ func (r *RichTransport) RemainingBytes() (num_bytes uint64) { return r.TTransport.RemainingBytes() } -var bytePool = newPool(nil, func(b *[1]byte) { - b[0] = 0 -}) - func readByte(r io.Reader) (c byte, err error) { - v := bytePool.get() - defer bytePool.put(&v) - - n, err := r.Read(v[:]) + v := [1]byte{0} + n, err := r.Read(v[0:1]) if n > 0 && (err == nil || errors.Is(err, io.EOF)) { return v[0], nil } @@ -71,10 +65,7 @@ func readByte(r io.Reader) (c byte, err error) { } func writeByte(w io.Writer, c byte) error { - v := bytePool.get() - defer bytePool.put(&v) - - v[0] = c - _, err := w.Write(v[:]) + v := [1]byte{c} + _, err := w.Write(v[0:1]) return err } From 0341323059119c7cb4d27839e92b2108875a7b03 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 1 May 2024 18:49:15 +0200 Subject: [PATCH 058/430] THRIFT-5783 drop net7 support Client: netstd Patch: Jens Geyer --- .../Thrift.Benchmarks/Thrift.Benchmarks.csproj | 2 +- .../Thrift.IntegrationTests.csproj | 10 +++++----- .../Thrift.PublicInterfaces.Compile.Tests.csproj | 2 +- lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj | 8 ++++---- lib/netstd/Thrift/Thrift.csproj | 4 ++-- test/netstd/Client/Client.csproj | 2 +- test/netstd/Server/Server.csproj | 2 +- tutorial/netstd/Interfaces/Interfaces.csproj | 4 ++-- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj index a8543a3bf37..fefaaadcb87 100644 --- a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj +++ b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj @@ -28,7 +28,7 @@ - + diff --git a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj index 5602f91292b..2cb634937a0 100644 --- a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj +++ b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj @@ -35,11 +35,11 @@ - - - - - + + + + + diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj index 5745bd9dae9..e96d2fe3ac8 100644 --- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj +++ b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj @@ -38,7 +38,7 @@ - + diff --git a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj index 7f9dcb7cbb5..0a9cff0c94c 100644 --- a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj +++ b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj @@ -26,10 +26,10 @@ - - - - + + + + diff --git a/lib/netstd/Thrift/Thrift.csproj b/lib/netstd/Thrift/Thrift.csproj index da93da496ec..da0057d8583 100644 --- a/lib/netstd/Thrift/Thrift.csproj +++ b/lib/netstd/Thrift/Thrift.csproj @@ -19,7 +19,7 @@ --> - netstandard2.1;netstandard2.0;net6.0;net7.0;net8.0 + netstandard2.1;netstandard2.0;net6.0;net8.0 Thrift ApacheThrift true @@ -89,7 +89,7 @@ - 8.0.0 + 8.0.4 diff --git a/test/netstd/Client/Client.csproj b/test/netstd/Client/Client.csproj index 977303bbc58..8a904dde1e4 100644 --- a/test/netstd/Client/Client.csproj +++ b/test/netstd/Client/Client.csproj @@ -37,7 +37,7 @@ - + diff --git a/test/netstd/Server/Server.csproj b/test/netstd/Server/Server.csproj index 359578a4e29..1bf48d9638a 100644 --- a/test/netstd/Server/Server.csproj +++ b/test/netstd/Server/Server.csproj @@ -38,7 +38,7 @@ - + diff --git a/tutorial/netstd/Interfaces/Interfaces.csproj b/tutorial/netstd/Interfaces/Interfaces.csproj index 576722ba591..73a09358ac1 100644 --- a/tutorial/netstd/Interfaces/Interfaces.csproj +++ b/tutorial/netstd/Interfaces/Interfaces.csproj @@ -19,7 +19,7 @@ --> - net6.0 + net8.0 Interfaces Interfaces 0.21.0.0 @@ -34,7 +34,7 @@ - + From 42dbefb023369747bf6135588599bbeeae9e8ef2 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 2 May 2024 10:28:38 +0200 Subject: [PATCH 059/430] THRIFT-5782 implement full deprecation support Client: Delphi Patch: Jens Geyer FIX: end-of-line comments may cause uncompileable code --- compiler/cpp/src/thrift/generate/t_delphi_generator.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc index f624bb048bb..2a428dc1cb1 100644 --- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc @@ -964,7 +964,7 @@ void t_delphi_generator::generate_enum(t_enum* tenum) { } generate_delphi_doc(s_enum, *c_iter); indent(s_enum) << normalize_name((*c_iter)->get_name()) << " = " << value; - s_enum << render_deprecation_attribute((*c_iter)->annotations_, " // ", ""); + s_enum << render_deprecation_attribute((*c_iter)->annotations_, " {", "}"); } } s_enum << '\n'; @@ -1714,7 +1714,7 @@ void t_delphi_generator::generate_delphi_struct_definition(ostream& out, indent_down(); indent(out) << "end;" - << render_deprecation_attribute(tstruct->annotations_, " // ", "") + << render_deprecation_attribute(tstruct->annotations_, " {", "}") << '\n'; if(rtti_) { indent(out) << "{$IFNDEF TYPEINFO_WAS_ON} {$TYPEINFO OFF} {$ENDIF}" << '\n'; @@ -1912,7 +1912,7 @@ void t_delphi_generator::generate_service_interface(t_service* tservice, bool fo } indent_down(); indent(s_service) << "end;" - << render_deprecation_attribute( tservice->annotations_, " // ", "") + << render_deprecation_attribute( tservice->annotations_, " {", "}") << '\n' << '\n'; indent_down(); @@ -2231,7 +2231,7 @@ void t_delphi_generator::generate_service_client(t_service* tservice) { indent_down(); indent(s_service) << "end;" - << render_deprecation_attribute( tservice->annotations_, " // ", "") + << render_deprecation_attribute( tservice->annotations_, " {", "}") << '\n' << '\n'; } @@ -3001,7 +3001,7 @@ void t_delphi_generator::generate_delphi_property(ostream& out, << " read " << prop_name(tfield, struct_is_xception, fieldPrefix) << " write " << prop_name(tfield, struct_is_xception, "Set") << ";" - << render_deprecation_attribute(tfield->annotations_, " // ", ";") + << render_deprecation_attribute(tfield->annotations_, " {", "}") << '\n'; } From fa9af0ab69affaefaf80ecf60a9a0392a4ac8609 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Thu, 9 May 2024 17:58:43 -0700 Subject: [PATCH 060/430] go: Use errors.Is over == Client: go Fix 2 instances we are using == to check on error but should have used errors.Is instead. --- lib/go/thrift/header_transport.go | 4 ++-- lib/go/thrift/simple_json_protocol.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/go/thrift/header_transport.go b/lib/go/thrift/header_transport.go index 3aea5a9888d..772d922a456 100644 --- a/lib/go/thrift/header_transport.go +++ b/lib/go/thrift/header_transport.go @@ -128,7 +128,7 @@ var _ io.ReadCloser = (*TransformReader)(nil) // // If you don't know the closers capacity beforehand, just use // -// &TransformReader{Reader: baseReader} +// &TransformReader{Reader: baseReader} // // instead would be sufficient. func NewTransformReaderWithCapacity(baseReader io.Reader, capacity int) *TransformReader { @@ -544,7 +544,7 @@ func (t *THeaderTransport) Read(p []byte) (read int, err error) { // the last Read finished the frame, do endOfFrame // handling here. err = t.endOfFrame() - } else if err == io.EOF { + } else if errors.Is(err, io.EOF) { err = t.endOfFrame() if err != nil { return diff --git a/lib/go/thrift/simple_json_protocol.go b/lib/go/thrift/simple_json_protocol.go index da12248a17f..f7fe68c23d2 100644 --- a/lib/go/thrift/simple_json_protocol.go +++ b/lib/go/thrift/simple_json_protocol.go @@ -1195,7 +1195,7 @@ func (p *TSimpleJSONProtocol) readNumeric() (Numeric, error) { for continueFor { c, err := p.reader.ReadByte() if err != nil { - if err == io.EOF { + if errors.Is(err, io.EOF) { break } return NUMERIC_NULL, NewTProtocolException(err) From b20f675af7ef0103a880889447a166e0e4261926 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Thu, 2 May 2024 16:50:08 -0700 Subject: [PATCH 061/430] THRIFT-5784: Add THeaderTransforms to TConfiguration Client: go While I'm here, also auto add compression transforms read (currently only zlib is supported) to writeTransforms so that a server will auto use the same compression on the responses as the client chose to use in the requests. --- lib/go/test/tests/header_zlib_test.go | 206 ++++++++++++++++++++++++++ lib/go/thrift/configuration.go | 76 ++++++---- lib/go/thrift/header_protocol.go | 5 + lib/go/thrift/header_protocol_test.go | 20 +++ lib/go/thrift/header_transport.go | 46 +++++- 5 files changed, 316 insertions(+), 37 deletions(-) create mode 100644 lib/go/test/tests/header_zlib_test.go diff --git a/lib/go/test/tests/header_zlib_test.go b/lib/go/test/tests/header_zlib_test.go new file mode 100644 index 00000000000..cf2f849358a --- /dev/null +++ b/lib/go/test/tests/header_zlib_test.go @@ -0,0 +1,206 @@ +/* + * 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. + */ + +package tests + +import ( + "context" + "errors" + "io" + "net" + "sync/atomic" + "testing" + "time" + + "github.com/apache/thrift/lib/go/test/gopath/src/servicestest" + "github.com/apache/thrift/lib/go/thrift" +) + +type zlibTestHandler struct { + servicestest.AServ + + tb testing.TB + text string +} + +func (z zlibTestHandler) Stringfunc_1int_1s(ctx context.Context, i int64, s string) (string, error) { + if s != z.text { + z.tb.Errorf("string arg got %q want %q", s, z.text) + } + return z.text, nil +} + +type countingProxy struct { + // Need to fill when constructing + tb testing.TB + remoteAddr net.Addr + + // internal states + listener net.Listener + clientWritten atomic.Int64 + serverWritten atomic.Int64 +} + +func (cp *countingProxy) getAndResetCounters() (req, resp int64) { + req = cp.clientWritten.Swap(0) + resp = cp.serverWritten.Swap(0) + return req, resp +} + +func (cp *countingProxy) serve() { + cp.tb.Helper() + + listener, err := net.Listen("tcp", ":0") + if err != nil { + cp.tb.Fatalf("Failed to listen proxy: %v", err) + } + go func() { + for { + client, err := listener.Accept() + if err != nil { + if !errors.Is(err, io.EOF) && !errors.Is(err, net.ErrClosed) { + cp.tb.Errorf("proxy accept error: %v", err) + } + return + } + server, err := net.Dial(cp.remoteAddr.Network(), cp.remoteAddr.String()) + if err != nil { + cp.tb.Logf("proxy failed to dial server %v: %v", cp.remoteAddr, err) + } + proxy := func(read, write net.Conn, count *atomic.Int64) { + var buf [1024]byte + for { + n, err := read.Read(buf[:]) + if n > 0 { + count.Add(int64(n)) + if _, err := write.Write(buf[:n]); err != nil { + cp.tb.Errorf("proxy write error: %v", err) + } + } + if err != nil { + if !errors.Is(err, io.EOF) && !errors.Is(err, net.ErrClosed) { + cp.tb.Errorf("proxy read error: %v", err) + } + read.Close() + write.Close() + return + } + } + } + // Read from client + go proxy(client, server, &cp.clientWritten) + // Read from server + go proxy(server, client, &cp.serverWritten) + } + }() + cp.listener = listener +} + +func TestTHeaderZlibClient(t *testing.T) { + // Some text that zlib should be able to compress + const text = `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.` + + socket, err := thrift.NewTServerSocket(":0") + if err != nil { + t.Fatalf("Failed to create server socket: %v", err) + } + // Call listen to reserve a port and check for any issues early + if err := socket.Listen(); err != nil { + t.Fatalf("Failed to listen server socket: %v", err) + } + server := thrift.NewTSimpleServer4( + servicestest.NewAServProcessor(zlibTestHandler{ + tb: t, + text: text, + }), + socket, + thrift.NewTHeaderTransportFactoryConf(nil, nil), + thrift.NewTHeaderProtocolFactoryConf(nil), + ) + go server.Serve() + // give the server a little time to start serving + time.Sleep(10 * time.Millisecond) + t.Cleanup(func() { + server.Stop() + }) + t.Logf("server running on %v", socket.Addr()) + + proxy := countingProxy{ + tb: t, + remoteAddr: socket.Addr(), + } + proxy.serve() + t.Cleanup(func() { + proxy.listener.Close() + }) + t.Logf("proxy running on %v", proxy.listener.Addr()) + + clientRoundtrip := func(cfg *thrift.TConfiguration) { + t.Helper() + + socket := thrift.NewTSocketConf(proxy.listener.Addr().String(), cfg) + if err := socket.Open(); err != nil { + t.Errorf("failed to open socket: %v", err) + return + } + defer socket.Close() + protoFactory := thrift.NewTHeaderProtocolFactoryConf(cfg) + client := thrift.NewTStandardClient( + protoFactory.GetProtocol(socket), + protoFactory.GetProtocol(socket), + ) + c := servicestest.NewAServClient(client) + got, err := c.Stringfunc_1int_1s(context.Background(), 0, text) + if err != nil { + t.Errorf("Stringfunc_1int_1s call failed: %v", err) + return + } + if got != text { + t.Errorf("Stringfunc_1int_1s got %q want %q", got, text) + } + } + + clientRoundtrip(nil) + nozlibReq, nozlibResp := proxy.getAndResetCounters() + t.Logf("nozlib request size: %d, response size: %d", nozlibReq, nozlibResp) + + clientRoundtrip(&thrift.TConfiguration{ + THeaderTransforms: []thrift.THeaderTransformID{thrift.TransformZlib}, + }) + zlibReq, zlibResp := proxy.getAndResetCounters() + t.Logf("zlib request size: %d, response size: %d", zlibReq, zlibResp) + + if zlibReq >= nozlibReq { + t.Errorf("zlib request size %d >= nozlib request size %d", zlibReq, nozlibReq) + } + if zlibResp >= nozlibResp { + t.Errorf("zlib response size %d >= nozlib response size %d", zlibResp, nozlibResp) + } + + clientRoundtrip(nil) + nozlibReq2, nozlibResp2 := proxy.getAndResetCounters() + t.Logf("nozlib2 request size: %d, response size: %d", nozlibReq, nozlibResp) + + if nozlibReq2 != nozlibReq { + t.Errorf("nozlib request 2 size %d != nozlib request size %d", nozlibReq2, nozlibReq) + } + if nozlibResp2 != nozlibResp { + t.Errorf("nozlib response 2 size %d != nozlib response size %d", nozlibResp2, nozlibResp) + } +} diff --git a/lib/go/thrift/configuration.go b/lib/go/thrift/configuration.go index de27edd674c..a9565d399df 100644 --- a/lib/go/thrift/configuration.go +++ b/lib/go/thrift/configuration.go @@ -56,47 +56,47 @@ const ( // // For example, say you want to migrate this old code into using TConfiguration: // -// sccket, err := thrift.NewTSocketTimeout("host:port", time.Second, time.Second) -// transFactory := thrift.NewTFramedTransportFactoryMaxLength( -// thrift.NewTTransportFactory(), -// 1024 * 1024 * 256, -// ) -// protoFactory := thrift.NewTBinaryProtocolFactory(true, true) +// socket, err := thrift.NewTSocketTimeout("host:port", time.Second, time.Second) +// transFactory := thrift.NewTFramedTransportFactoryMaxLength( +// thrift.NewTTransportFactory(), +// 1024 * 1024 * 256, +// ) +// protoFactory := thrift.NewTBinaryProtocolFactory(true, true) // // This is the wrong way to do it because in the end the TConfiguration used by // socket and transFactory will be overwritten by the one used by protoFactory // because of TConfiguration propagation: // -// // bad example, DO NOT USE -// sccket := thrift.NewTSocketConf("host:port", &thrift.TConfiguration{ -// ConnectTimeout: time.Second, -// SocketTimeout: time.Second, -// }) -// transFactory := thrift.NewTFramedTransportFactoryConf( -// thrift.NewTTransportFactory(), -// &thrift.TConfiguration{ -// MaxFrameSize: 1024 * 1024 * 256, -// }, -// ) -// protoFactory := thrift.NewTBinaryProtocolFactoryConf(&thrift.TConfiguration{ -// TBinaryStrictRead: thrift.BoolPtr(true), -// TBinaryStrictWrite: thrift.BoolPtr(true), -// }) +// // bad example, DO NOT USE +// socket := thrift.NewTSocketConf("host:port", &thrift.TConfiguration{ +// ConnectTimeout: time.Second, +// SocketTimeout: time.Second, +// }) +// transFactory := thrift.NewTFramedTransportFactoryConf( +// thrift.NewTTransportFactory(), +// &thrift.TConfiguration{ +// MaxFrameSize: 1024 * 1024 * 256, +// }, +// ) +// protoFactory := thrift.NewTBinaryProtocolFactoryConf(&thrift.TConfiguration{ +// TBinaryStrictRead: thrift.BoolPtr(true), +// TBinaryStrictWrite: thrift.BoolPtr(true), +// }) // // This is the correct way to do it: // -// conf := &thrift.TConfiguration{ -// ConnectTimeout: time.Second, -// SocketTimeout: time.Second, +// conf := &thrift.TConfiguration{ +// ConnectTimeout: time.Second, +// SocketTimeout: time.Second, // -// MaxFrameSize: 1024 * 1024 * 256, +// MaxFrameSize: 1024 * 1024 * 256, // -// TBinaryStrictRead: thrift.BoolPtr(true), -// TBinaryStrictWrite: thrift.BoolPtr(true), -// } -// sccket := thrift.NewTSocketConf("host:port", conf) -// transFactory := thrift.NewTFramedTransportFactoryConf(thrift.NewTTransportFactory(), conf) -// protoFactory := thrift.NewTBinaryProtocolFactoryConf(conf) +// TBinaryStrictRead: thrift.BoolPtr(true), +// TBinaryStrictWrite: thrift.BoolPtr(true), +// } +// socket := thrift.NewTSocketConf("host:port", conf) +// transFactory := thrift.NewTFramedTransportFactoryConf(thrift.NewTTransportFactory(), conf) +// protoFactory := thrift.NewTBinaryProtocolFactoryConf(conf) // // [1]: https://github.com/apache/thrift/blob/master/doc/specs/thrift-tconfiguration.md type TConfiguration struct { @@ -132,6 +132,8 @@ type TConfiguration struct { // THeaderProtocolIDPtr and THeaderProtocolIDPtrMust helper functions // are provided to help filling this value. THeaderProtocolID *THeaderProtocolID + // The write transforms to be applied to THeaderTransport. + THeaderTransforms []THeaderTransformID // Used internally by deprecated constructors, to avoid overriding // underlying TTransport/TProtocol's cfg by accidental propagations. @@ -245,6 +247,18 @@ func (tc *TConfiguration) GetTHeaderProtocolID() THeaderProtocolID { return protoID } +// GetTHeaderTransforms returns the THeaderTransformIDs to be applied on +// THeaderTransport writing. +// +// It's nil-safe. If tc is nil, empty slice will be returned (meaning no +// transforms to be applied). +func (tc *TConfiguration) GetTHeaderTransforms() []THeaderTransformID { + if tc == nil { + return nil + } + return tc.THeaderTransforms +} + // THeaderProtocolIDPtr validates and returns the pointer to id. // // If id is not a valid THeaderProtocolID, a pointer to THeaderProtocolDefault diff --git a/lib/go/thrift/header_protocol.go b/lib/go/thrift/header_protocol.go index 36777b4ca00..bec84b85c49 100644 --- a/lib/go/thrift/header_protocol.go +++ b/lib/go/thrift/header_protocol.go @@ -119,6 +119,11 @@ func (p *THeaderProtocol) ClearWriteHeaders() { } // AddTransform add a transform for writing. +// +// Deprecated: This only applies to the next message written, and the next read +// message will cause write transforms to be reset from what's configured in +// TConfiguration. For sticky transforms, use TConfiguration.THeaderTransforms +// instead. func (p *THeaderProtocol) AddTransform(transform THeaderTransformID) error { return p.transport.AddTransform(transform) } diff --git a/lib/go/thrift/header_protocol_test.go b/lib/go/thrift/header_protocol_test.go index 48a69bf23b0..dfd84f83012 100644 --- a/lib/go/thrift/header_protocol_test.go +++ b/lib/go/thrift/header_protocol_test.go @@ -39,4 +39,24 @@ func TestReadWriteHeaderProtocol(t *testing.T) { })) }, ) + + t.Run( + "binary-zlib", + func(t *testing.T) { + ReadWriteProtocolTest(t, NewTHeaderProtocolFactoryConf(&TConfiguration{ + THeaderProtocolID: THeaderProtocolIDPtrMust(THeaderProtocolBinary), + THeaderTransforms: []THeaderTransformID{TransformZlib}, + })) + }, + ) + + t.Run( + "compact-zlib", + func(t *testing.T) { + ReadWriteProtocolTest(t, NewTHeaderProtocolFactoryConf(&TConfiguration{ + THeaderProtocolID: THeaderProtocolIDPtrMust(THeaderProtocolCompact), + THeaderTransforms: []THeaderTransformID{TransformZlib}, + })) + }, + ) } diff --git a/lib/go/thrift/header_transport.go b/lib/go/thrift/header_transport.go index 772d922a456..d81fb29d31f 100644 --- a/lib/go/thrift/header_transport.go +++ b/lib/go/thrift/header_transport.go @@ -151,6 +151,11 @@ func (tr *TransformReader) Close() error { } // AddTransform adds a transform. +// +// Deprecated: This only applies to the next message written, and the next read +// message will cause write transforms to be reset from what's configured in +// TConfiguration. For sticky transforms, use TConfiguration.THeaderTransforms +// instead. func (tr *TransformReader) AddTransform(id THeaderTransformID) error { switch id { default: @@ -300,11 +305,12 @@ func NewTHeaderTransportConf(trans TTransport, conf *TConfiguration) *THeaderTra } PropagateTConfiguration(trans, conf) return &THeaderTransport{ - transport: trans, - reader: bufio.NewReader(trans), - writeHeaders: make(THeaderMap), - protocolID: conf.GetTHeaderProtocolID(), - cfg: conf, + transport: trans, + reader: bufio.NewReader(trans), + writeHeaders: make(THeaderMap), + writeTransforms: conf.GetTHeaderTransforms(), + protocolID: conf.GetTHeaderProtocolID(), + cfg: conf, } } @@ -449,6 +455,11 @@ func (t *THeaderTransport) parseHeaders(ctx context.Context, frameSize uint32) e } t.protocolID = THeaderProtocolID(protoID) + // Reset writeTransforms to the ones from cfg, as we are going to add + // compression transforms from what we read, we don't want to accumulate + // different transforms read from different requests + t.writeTransforms = t.cfg.GetTHeaderTransforms() + var transformCount int32 transformCount, err = hp.readVarint32() if err != nil { @@ -466,7 +477,16 @@ func (t *THeaderTransport) parseHeaders(ctx context.Context, frameSize uint32) e if err != nil { return err } - transformIDs[i] = THeaderTransformID(id) + tID := THeaderTransformID(id) + transformIDs[i] = tID + + // For compression transforms, we should also add them + // to writeTransforms so that the response (assuming we + // are reading a request) would do the same compression. + switch tID { + case TransformZlib: + t.addWriteTransformsDedupe(tID) + } } // The transform IDs on the wire was added based on the order of // writing, so on the reading side we need to reverse the order. @@ -726,6 +746,9 @@ func (t *THeaderTransport) ClearWriteHeaders() { } // AddTransform add a transform for writing. +// +// NOTE: This is provided as a low-level API, but in general you should use +// TConfiguration.THeaderTransforms to set transforms for writing instead. func (t *THeaderTransport) AddTransform(transform THeaderTransformID) error { if !supportedTransformIDs[transform] { return NewTProtocolExceptionWithType( @@ -758,6 +781,17 @@ func (t *THeaderTransport) isFramed() bool { } } +// addWriteTransformsDedupe adds id to writeTransforms only if it's not already +// there. +func (t *THeaderTransport) addWriteTransformsDedupe(id THeaderTransformID) { + for _, existingID := range t.writeTransforms { + if existingID == id { + return + } + } + t.writeTransforms = append(t.writeTransforms, id) +} + // SetTConfiguration implements TConfigurationSetter. func (t *THeaderTransport) SetTConfiguration(cfg *TConfiguration) { PropagateTConfiguration(t.transport, cfg) From c53a1b78bac23cdda13feb13b6d3348c11083007 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Mon, 13 May 2024 17:03:17 +0200 Subject: [PATCH 062/430] THRIFT-5781 implement full deprecation support -> fix uncompileable issue at deprecated enums Client: netstd Patch: Jens Geyer --- compiler/cpp/src/thrift/generate/t_netstd_generator.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc index feb58a0aa2e..aa570ec7f0f 100644 --- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc @@ -393,7 +393,8 @@ void t_netstd_generator::generate_enum(t_enum* tenum) void t_netstd_generator::generate_enum(ostream& out, t_enum* tenum) { reset_indent(); - out << autogen_comment() << '\n'; + out << autogen_comment(); + out << "using System;" << '\n' << '\n'; // needed for Obsolete() attribute pragmas_and_directives(out); start_netstd_namespace(out); From 4930caca8beb340b6543dd27856d3699dce40e54 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Tue, 14 May 2024 14:08:00 -0700 Subject: [PATCH 063/430] go: Proper indent in compiler This is a "trivial" change for go compiler to always use the combination of indent_up, indent_down, and indent, over manual indentation (by adding 2 spaces at the beginning of the string). Also change go compiler's indent_str to tab over 2 spaces. While I'm here, also made a few minor tweaks on generated go code. --- .../cpp/src/thrift/generate/t_go_generator.cc | 591 ++++++++++++------ .../cpp/src/thrift/generate/t_go_generator.h | 4 + 2 files changed, 394 insertions(+), 201 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc index 72a9f065a53..c135d64edc2 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc @@ -785,46 +785,54 @@ void t_go_generator::generate_enum(t_enum* tenum) { std::ostringstream to_string_mapping, from_string_mapping; std::string tenum_name(publicize(tenum->get_name())); generate_go_docstring(f_types_, tenum); - f_types_ << "type " << tenum_name << " int64" << '\n' << "const (" << '\n'; + f_types_ << '\n' << "type " << tenum_name << " int64" << '\n' << "const (" << '\n'; to_string_mapping << indent() << "func (p " << tenum_name << ") String() string {" << '\n'; - to_string_mapping << indent() << " switch p {" << '\n'; + indent_up(); + to_string_mapping << indent() << "switch p {" << '\n'; + indent_down(); from_string_mapping << indent() << "func " << tenum_name << "FromString(s string) (" << tenum_name << ", error) {" << '\n'; - from_string_mapping << indent() << " switch s {" << '\n'; + indent_up(); + from_string_mapping << indent() << "switch s {" << '\n'; + indent_down(); vector constants = tenum->get_constants(); vector::iterator c_iter; int value = -1; + indent_up(); for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) { value = (*c_iter)->get_value(); string iter_std_name(escape_string((*c_iter)->get_name())); string iter_name((*c_iter)->get_name()); - f_types_ << indent() << " " << tenum_name << "_" << iter_name << ' ' << tenum_name << " = " + f_types_ << indent() << tenum_name << "_" << iter_name << ' ' << tenum_name << " = " << value << '\n'; // Dictionaries to/from string names of enums - to_string_mapping << indent() << " case " << tenum_name << "_" << iter_name << ": return \"" + to_string_mapping << indent() << "case " << tenum_name << "_" << iter_name << ": return \"" << iter_std_name << "\"" << '\n'; if (iter_std_name != escape_string(iter_name)) { - from_string_mapping << indent() << " case \"" << iter_std_name << "\", \"" + from_string_mapping << indent() << "case \"" << iter_std_name << "\", \"" << escape_string(iter_name) << "\": return " << tenum_name << "_" << iter_name << ", nil " << '\n'; } else { - from_string_mapping << indent() << " case \"" << iter_std_name << "\": return " << tenum_name + from_string_mapping << indent() << "case \"" << iter_std_name << "\": return " << tenum_name << "_" << iter_name << ", nil " << '\n'; } } - to_string_mapping << indent() << " }" << '\n'; - to_string_mapping << indent() << " return \"\"" << '\n'; to_string_mapping << indent() << "}" << '\n'; - from_string_mapping << indent() << " }" << '\n'; - from_string_mapping << indent() << " return " << tenum_name << "(0)," + to_string_mapping << indent() << "return \"\"" << '\n'; + indent_down(); + to_string_mapping << indent() << "}" << '\n'; + indent_up(); + from_string_mapping << indent() << "}" << '\n'; + from_string_mapping << indent() << "return " << tenum_name << "(0)," << " fmt.Errorf(\"not a valid " << tenum_name << " string\")" << '\n'; + indent_down(); from_string_mapping << indent() << "}" << '\n'; f_types_ << ")" << '\n' << '\n' << to_string_mapping.str() << '\n' << from_string_mapping.str() @@ -838,33 +846,49 @@ void t_go_generator::generate_enum(t_enum* tenum) { // Generate MarshalText f_types_ << "func (p " << tenum_name << ") MarshalText() ([]byte, error) {" << '\n'; - f_types_ << "return []byte(p.String()), nil" << '\n'; + indent_up(); + f_types_ << indent() << "return []byte(p.String()), nil" << '\n'; + indent_down(); f_types_ << "}" << '\n' << '\n'; // Generate UnmarshalText f_types_ << "func (p *" << tenum_name << ") UnmarshalText(text []byte) error {" << '\n'; - f_types_ << "q, err := " << tenum_name << "FromString(string(text))" << '\n'; - f_types_ << "if (err != nil) {" << '\n' << "return err" << '\n' << "}" << '\n'; - f_types_ << "*p = q" << '\n'; - f_types_ << "return nil" << '\n'; + indent_up(); + f_types_ << indent() << "q, err := " << tenum_name << "FromString(string(text))" << '\n'; + f_types_ << indent() << "if err != nil {" << '\n'; + indent_up(); + f_types_ << indent() << "return err" << '\n'; + indent_down(); + f_types_ << indent() << "}" << '\n'; + f_types_ << indent() << "*p = q" << '\n'; + f_types_ << indent() << "return nil" << '\n'; + indent_down(); f_types_ << "}" << '\n' << '\n'; // Generate Scan for sql.Scanner interface f_types_ << "func (p *" << tenum_name << ") Scan(value interface{}) error {" << '\n'; - f_types_ << "v, ok := value.(int64)" << '\n'; - f_types_ << "if !ok {" << '\n'; - f_types_ << "return errors.New(\"Scan value is not int64\")" << '\n'; - f_types_ << "}" << '\n'; - f_types_ << "*p = " << tenum_name << "(v)" << '\n'; - f_types_ << "return nil" << '\n'; + indent_up(); + f_types_ << indent() << "v, ok := value.(int64)" << '\n'; + f_types_ << indent() << "if !ok {" << '\n'; + indent_up(); + f_types_ << indent() << "return errors.New(\"Scan value is not int64\")" << '\n'; + indent_down(); + f_types_ << indent() << "}" << '\n'; + f_types_ << indent() << "*p = " << tenum_name << "(v)" << '\n'; + f_types_ << indent() << "return nil" << '\n'; + indent_down(); f_types_ << "}" << '\n' << '\n'; // Generate Value for driver.Valuer interface - f_types_ << "func (p * " << tenum_name << ") Value() (driver.Value, error) {" << '\n'; - f_types_ << " if p == nil {" << '\n'; - f_types_ << " return nil, nil" << '\n'; - f_types_ << " }" << '\n'; - f_types_ << "return int64(*p), nil" << '\n'; + f_types_ << "func (p *" << tenum_name << ") Value() (driver.Value, error) {" << '\n'; + indent_up(); + f_types_ << indent() << "if p == nil {" << '\n'; + indent_up(); + f_types_ << indent() << "return nil, nil" << '\n'; + indent_down(); + f_types_ << indent() << "}" << '\n'; + f_types_ << indent() << "return int64(*p), nil" << '\n'; + indent_down(); f_types_ << "}" << '\n'; } @@ -1330,6 +1354,7 @@ void t_go_generator::generate_go_struct_definition(ostream& out, } out << '\n'; } + out << '\n'; // num_setable is used for deciding if Count* methods will be generated for union fields. // This applies to all nullable fields including slices (used for set, list and binary) and maps, not just pointers. @@ -1521,8 +1546,10 @@ void t_go_generator::generate_go_struct_reader(ostream& out, << '\n'; indent_up(); out << indent() << "if _, err := iprot.ReadStructBegin(ctx); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)" + indent_up(); + out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)" << '\n'; + indent_down(); out << indent() << "}" << '\n' << '\n'; // Required variables does not have IsSet functions, so we need tmp vars to check them. @@ -1540,11 +1567,17 @@ void t_go_generator::generate_go_struct_reader(ostream& out, // Read beginning field marker out << indent() << "_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)" << '\n'; out << indent() << "if err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(fmt.Sprintf(" + indent_up(); + out << indent() << "return thrift.PrependError(fmt.Sprintf(" "\"%T field %d read error: \", p, fieldId), err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; // Check for field STOP marker and break - out << indent() << "if fieldTypeId == thrift.STOP { break; }" << '\n'; + out << indent() << "if fieldTypeId == thrift.STOP {" << '\n'; + indent_up(); + out << indent() << "break" << '\n'; + indent_down(); + out << indent() << "}" << '\n'; string thriftFieldTypeId; // Generate deserialization code for known cases @@ -1578,21 +1611,29 @@ void t_go_generator::generate_go_struct_reader(ostream& out, } out << indent() << "if fieldTypeId == " << thriftFieldTypeId << " {" << '\n'; - out << indent() << " if err := p." << field_method_prefix << field_method_suffix << "(ctx, iprot); err != nil {" + indent_up(); + out << indent() << "if err := p." << field_method_prefix << field_method_suffix << "(ctx, iprot); err != nil {" << '\n'; - out << indent() << " return err" << '\n'; - out << indent() << " }" << '\n'; + indent_up(); + out << indent() << "return err" << '\n'; + indent_down(); + out << indent() << "}" << '\n'; // Mark required field as read if ((*f_iter)->get_req() == t_field::T_REQUIRED) { const string field_name(publicize(escape_string((*f_iter)->get_name()))); - out << indent() << " isset" << field_name << " = true" << '\n'; + out << indent() << "isset" << field_name << " = true" << '\n'; } + indent_down(); out << indent() << "} else {" << '\n'; - out << indent() << " if err := iprot.Skip(ctx, fieldTypeId); err != nil {" << '\n'; - out << indent() << " return err" << '\n'; - out << indent() << " }" << '\n'; + indent_up(); + out << indent() << "if err := iprot.Skip(ctx, fieldTypeId); err != nil {" << '\n'; + indent_up(); + out << indent() << "return err" << '\n'; + indent_down(); + out << indent() << "}" << '\n'; + indent_down(); out << indent() << "}" << '\n'; @@ -1607,7 +1648,9 @@ void t_go_generator::generate_go_struct_reader(ostream& out, // Skip unknown fields in either case out << indent() << "if err := iprot.Skip(ctx, fieldTypeId); err != nil {" << '\n'; - out << indent() << " return err" << '\n'; + indent_up(); + out << indent() << "return err" << '\n'; + indent_down(); out << indent() << "}" << '\n'; // End switch default case @@ -1618,13 +1661,17 @@ void t_go_generator::generate_go_struct_reader(ostream& out, // Read field end marker out << indent() << "if err := iprot.ReadFieldEnd(ctx); err != nil {" << '\n'; - out << indent() << " return err" << '\n'; + indent_up(); + out << indent() << "return err" << '\n'; + indent_down(); out << indent() << "}" << '\n'; indent_down(); out << indent() << "}" << '\n'; out << indent() << "if err := iprot.ReadStructEnd(ctx); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(fmt.Sprintf(" + indent_up(); + out << indent() << "return thrift.PrependError(fmt.Sprintf(" "\"%T read struct end error: \", p), err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; // Return error if any required fields are missing. @@ -1632,8 +1679,10 @@ void t_go_generator::generate_go_struct_reader(ostream& out, if ((*f_iter)->get_req() == t_field::T_REQUIRED) { const string field_name(publicize(escape_string((*f_iter)->get_name()))); out << indent() << "if !isset" << field_name << "{" << '\n'; - out << indent() << " return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, " + indent_up(); + out << indent() << "return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, " "fmt.Errorf(\"Required field " << field_name << " is not set\"));" << '\n'; + indent_down(); out << indent() << "}" << '\n'; } } @@ -1654,12 +1703,12 @@ void t_go_generator::generate_go_struct_reader(ostream& out, field_method_suffix *= -1; } - out << indent() << "func (p *" << tstruct_name << ") " << field_method_prefix << field_method_suffix + out << indent() << "func (p *" << tstruct_name << ") " << field_method_prefix << field_method_suffix << "(ctx context.Context, iprot thrift.TProtocol) error {" << '\n'; indent_up(); generate_deserialize_field(out, *f_iter, false, "p."); + out << indent() << "return nil" << '\n'; indent_down(); - out << indent() << " return nil" << '\n'; out << indent() << "}" << '\n' << '\n'; } } @@ -1677,14 +1726,18 @@ void t_go_generator::generate_go_struct_writer(ostream& out, indent_up(); if (tstruct->is_union() && uses_countsetfields) { std::string tstruct_name(publicize(tstruct->get_name())); - out << indent() << "if c := p.CountSetFields" << tstruct_name << "(); c != 1 {" << '\n' - << indent() - << " return fmt.Errorf(\"%T write union: exactly one field must be set (%d set)\", p, c)" - << '\n' << indent() << "}" << '\n'; + out << indent() << "if c := p.CountSetFields" << tstruct_name << "(); c != 1 {" << '\n'; + indent_up(); + out << indent() << "return fmt.Errorf(\"%T write union: exactly one field must be set (%d set)\", p, c)" << '\n'; + indent_down(); + out << indent() << "}" << '\n'; } out << indent() << "if err := oprot.WriteStructBegin(ctx, \"" << name << "\"); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(fmt.Sprintf(" - "\"%T write struct begin error: \", p), err) }" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(fmt.Sprintf(" + "\"%T write struct begin error: \", p), err)" << '\n'; + indent_down(); + out << indent() << "}" << '\n'; string field_name; string escape_field_name; @@ -1716,9 +1769,15 @@ void t_go_generator::generate_go_struct_writer(ostream& out, // Write the struct map out << indent() << "if err := oprot.WriteFieldStop(ctx); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"write field stop error: \", err) }" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"write field stop error: \", err)" << '\n'; + indent_down(); + out << indent() << "}" << '\n'; out << indent() << "if err := oprot.WriteStructEnd(ctx); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"write struct stop error: \", err) }" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"write struct stop error: \", err)" << '\n'; + indent_down(); + out << indent() << "}" << '\n'; out << indent() << "return nil" << '\n'; indent_down(); out << indent() << "}" << '\n' << '\n'; @@ -1748,24 +1807,30 @@ void t_go_generator::generate_go_struct_writer(ostream& out, out << indent() << "if err := oprot.WriteFieldBegin(ctx, \"" << escape_field_name << "\", " << type_to_enum((*f_iter)->get_type()) << ", " << field_id << "); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(fmt.Sprintf(\"%T write field begin error " - << field_id << ":" << escape_field_name << ": \", p), err) }" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T write field begin error " + << field_id << ":" << escape_field_name << ": \", p), err)" << '\n'; + indent_down(); + out << indent() << "}" << '\n'; // Write field contents generate_serialize_field(out, *f_iter, "p."); // Write field closer out << indent() << "if err := oprot.WriteFieldEnd(ctx); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(fmt.Sprintf(\"%T write field end error " - << field_id << ":" << escape_field_name << ": \", p), err) }" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T write field end error " + << field_id << ":" << escape_field_name << ": \", p), err)" << '\n'; + indent_down(); + out << indent() << "}" << '\n'; if (field_required == t_field::T_OPTIONAL) { indent_down(); out << indent() << "}" << '\n'; } + out << indent() << "return err" << '\n'; indent_down(); - out << indent() << " return err" << '\n'; out << indent() << "}" << '\n' << '\n'; } } @@ -1906,12 +1971,14 @@ void t_go_generator::generate_service_interface(t_service* tservice) { extends = type_name(tservice->get_extends()); size_t index = extends.rfind("."); + indent_up(); if (index != string::npos) { - extends_if = "\n" + indent() + " " + extends.substr(0, index + 1) + extends_if = "\n" + indent() + extends.substr(0, index + 1) + publicize(extends.substr(index + 1)) + "\n"; } else { extends_if = "\n" + indent() + publicize(extends) + "\n"; } + indent_down(); } f_types_ << indent() << "type " << interfaceName << " interface {" << extends_if; @@ -2233,16 +2300,17 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << unused_protection; // filled in render_included_programs() f_remote << indent() << '\n'; f_remote << indent() << "func Usage() {" << '\n'; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Usage of \", os.Args[0], \" " + indent_up(); + f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Usage of \", os.Args[0], \" " "[-h host:port] [-u url] [-f[ramed]] function [arg1 [arg2...]]:\")" << '\n'; - f_remote << indent() << " flag.PrintDefaults()" << '\n'; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"\\nFunctions:\")" << '\n'; + f_remote << indent() << "flag.PrintDefaults()" << '\n'; + f_remote << indent() << "fmt.Fprintln(os.Stderr, \"\\nFunctions:\")" << '\n'; string package_name_aliased = package_identifiers_[get_real_go_module(program_)]; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { - f_remote << " fmt.Fprintln(os.Stderr, \" " << (*f_iter)->get_returntype()->get_name() << " " + f_remote << indent() << "fmt.Fprintln(os.Stderr, \" " << (*f_iter)->get_returntype()->get_name() << " " << (*f_iter)->get_name() << "("; t_struct* arg_struct = (*f_iter)->get_arglist(); const std::vector& args = arg_struct->get_members(); @@ -2262,25 +2330,32 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << ")\")" << '\n'; } - f_remote << indent() << " fmt.Fprintln(os.Stderr)" << '\n'; - f_remote << indent() << " os.Exit(0)" << '\n'; + f_remote << indent() << "fmt.Fprintln(os.Stderr)" << '\n'; + f_remote << indent() << "os.Exit(0)" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << '\n'; f_remote << indent() << "type httpHeaders map[string]string" << '\n'; f_remote << indent() << '\n'; f_remote << indent() << "func (h httpHeaders) String() string {" << '\n'; - f_remote << indent() << " var m map[string]string = h" << '\n'; - f_remote << indent() << " return fmt.Sprintf(\"%s\", m)" << '\n'; + indent_up(); + f_remote << indent() << "var m map[string]string = h" << '\n'; + f_remote << indent() << "return fmt.Sprintf(\"%s\", m)" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << '\n'; f_remote << indent() << "func (h httpHeaders) Set(value string) error {" << '\n'; - f_remote << indent() << " parts := strings.Split(value, \": \")" << '\n'; - f_remote << indent() << " if len(parts) != 2 {" << '\n'; - f_remote << indent() << " return fmt.Errorf(\"header should be of format 'Key: Value'\")" << '\n'; - f_remote << indent() << " }" << '\n'; - f_remote << indent() << " h[parts[0]] = parts[1]" << '\n'; - f_remote << indent() << " return nil" << '\n'; + indent_up(); + f_remote << indent() << "parts := strings.Split(value, \": \")" << '\n'; + f_remote << indent() << "if len(parts) != 2 {" << '\n'; + indent_up(); + f_remote << indent() << "return fmt.Errorf(\"header should be of format 'Key: Value'\")" << '\n'; + indent_down(); + f_remote << indent() << "}" << '\n'; + f_remote << indent() << "h[parts[0]] = parts[1]" << '\n'; + f_remote << indent() << "return nil" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << '\n'; @@ -2312,87 +2387,120 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "flag.Parse()" << '\n'; f_remote << indent() << '\n'; f_remote << indent() << "if len(urlString) > 0 {" << '\n'; - f_remote << indent() << " var err error" << '\n'; - f_remote << indent() << " parsedUrl, err = url.Parse(urlString)" << '\n'; - f_remote << indent() << " if err != nil {" << '\n'; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << '\n'; - f_remote << indent() << " flag.Usage()" << '\n'; - f_remote << indent() << " }" << '\n'; - f_remote << indent() << " host = parsedUrl.Host" << '\n'; - f_remote << indent() << " useHttp = len(parsedUrl.Scheme) <= 0 || parsedUrl.Scheme == \"http\" || parsedUrl.Scheme == \"https\"" + indent_up(); + f_remote << indent() << "var err error" << '\n'; + f_remote << indent() << "parsedUrl, err = url.Parse(urlString)" << '\n'; + f_remote << indent() << "if err != nil {" << '\n'; + indent_up(); + f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << '\n'; + f_remote << indent() << "flag.Usage()" << '\n'; + indent_down(); + f_remote << indent() << "}" << '\n'; + f_remote << indent() << "host = parsedUrl.Host" << '\n'; + f_remote << indent() << "useHttp = len(parsedUrl.Scheme) <= 0 || parsedUrl.Scheme == \"http\" || parsedUrl.Scheme == \"https\"" << '\n'; + indent_down(); f_remote << indent() << "} else if useHttp {" << '\n'; - f_remote << indent() << " _, err := url.Parse(fmt.Sprint(\"http://\", host, \":\", port))" + indent_up(); + f_remote << indent() << "_, err := url.Parse(fmt.Sprint(\"http://\", host, \":\", port))" << '\n'; - f_remote << indent() << " if err != nil {" << '\n'; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << '\n'; - f_remote << indent() << " flag.Usage()" << '\n'; - f_remote << indent() << " }" << '\n'; + f_remote << indent() << "if err != nil {" << '\n'; + indent_up(); + f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << '\n'; + f_remote << indent() << "flag.Usage()" << '\n'; + indent_down(); + f_remote << indent() << "}" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << '\n'; f_remote << indent() << "cmd := flag.Arg(0)" << '\n'; f_remote << indent() << "var err error" << '\n'; f_remote << indent() << "var cfg *thrift.TConfiguration = nil" << '\n'; f_remote << indent() << "if useHttp {" << '\n'; - f_remote << indent() << " trans, err = thrift.NewTHttpClient(parsedUrl.String())" << '\n'; - f_remote << indent() << " if len(headers) > 0 {" << '\n'; - f_remote << indent() << " httptrans := trans.(*thrift.THttpClient)" << '\n'; - f_remote << indent() << " for key, value := range headers {" << '\n'; - f_remote << indent() << " httptrans.SetHeader(key, value)" << '\n'; - f_remote << indent() << " }" << '\n'; - f_remote << indent() << " }" << '\n'; + indent_up(); + f_remote << indent() << "trans, err = thrift.NewTHttpClient(parsedUrl.String())" << '\n'; + f_remote << indent() << "if len(headers) > 0 {" << '\n'; + indent_up(); + f_remote << indent() << "httptrans := trans.(*thrift.THttpClient)" << '\n'; + f_remote << indent() << "for key, value := range headers {" << '\n'; + indent_up(); + f_remote << indent() << "httptrans.SetHeader(key, value)" << '\n'; + indent_down(); + f_remote << indent() << "}" << '\n'; + indent_down(); + f_remote << indent() << "}" << '\n'; + indent_down(); f_remote << indent() << "} else {" << '\n'; - f_remote << indent() << " portStr := fmt.Sprint(port)" << '\n'; - f_remote << indent() << " if strings.Contains(host, \":\") {" << '\n'; - f_remote << indent() << " host, portStr, err = net.SplitHostPort(host)" << '\n'; - f_remote << indent() << " if err != nil {" << '\n'; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"error with host:\", err)" + indent_up(); + f_remote << indent() << "portStr := fmt.Sprint(port)" << '\n'; + f_remote << indent() << "if strings.Contains(host, \":\") {" << '\n'; + indent_up(); + f_remote << indent() << "host, portStr, err = net.SplitHostPort(host)" << '\n'; + f_remote << indent() << "if err != nil {" << '\n'; + indent_up(); + f_remote << indent() << "fmt.Fprintln(os.Stderr, \"error with host:\", err)" << '\n'; - f_remote << indent() << " os.Exit(1)" << '\n'; - f_remote << indent() << " }" << '\n'; - f_remote << indent() << " }" << '\n'; - f_remote << indent() << " trans = thrift.NewTSocketConf(net.JoinHostPort(host, portStr), cfg)" << '\n'; - f_remote << indent() << " if err != nil {" << '\n'; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"error resolving address:\", err)" << '\n'; - f_remote << indent() << " os.Exit(1)" << '\n'; - f_remote << indent() << " }" << '\n'; - f_remote << indent() << " if framed {" << '\n'; - f_remote << indent() << " trans = thrift.NewTFramedTransportConf(trans, cfg)" << '\n'; - f_remote << indent() << " }" << '\n'; + f_remote << indent() << "os.Exit(1)" << '\n'; + indent_down(); + f_remote << indent() << "}" << '\n'; + indent_down(); + f_remote << indent() << "}" << '\n'; + f_remote << indent() << "trans = thrift.NewTSocketConf(net.JoinHostPort(host, portStr), cfg)" << '\n'; + f_remote << indent() << "if err != nil {" << '\n'; + indent_up(); + f_remote << indent() << "fmt.Fprintln(os.Stderr, \"error resolving address:\", err)" << '\n'; + f_remote << indent() << "os.Exit(1)" << '\n'; + indent_down(); + f_remote << indent() << "}" << '\n'; + f_remote << indent() << "if framed {" << '\n'; + indent_up(); + f_remote << indent() << "trans = thrift.NewTFramedTransportConf(trans, cfg)" << '\n'; + indent_down(); + f_remote << indent() << "}" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << "if err != nil {" << '\n'; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Error creating transport\", err)" << '\n'; - f_remote << indent() << " os.Exit(1)" << '\n'; + indent_up(); + f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Error creating transport\", err)" << '\n'; + f_remote << indent() << "os.Exit(1)" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << "defer trans.Close()" << '\n'; f_remote << indent() << "var protocolFactory thrift.TProtocolFactory" << '\n'; f_remote << indent() << "switch protocol {" << '\n'; f_remote << indent() << "case \"compact\":" << '\n'; - f_remote << indent() << " protocolFactory = thrift.NewTCompactProtocolFactoryConf(cfg)" << '\n'; - f_remote << indent() << " break" << '\n'; + indent_up(); + f_remote << indent() << "protocolFactory = thrift.NewTCompactProtocolFactoryConf(cfg)" << '\n'; + indent_down(); f_remote << indent() << "case \"simplejson\":" << '\n'; - f_remote << indent() << " protocolFactory = thrift.NewTSimpleJSONProtocolFactoryConf(cfg)" << '\n'; - f_remote << indent() << " break" << '\n'; + indent_up(); + f_remote << indent() << "protocolFactory = thrift.NewTSimpleJSONProtocolFactoryConf(cfg)" << '\n'; f_remote << indent() << "case \"json\":" << '\n'; - f_remote << indent() << " protocolFactory = thrift.NewTJSONProtocolFactory()" << '\n'; - f_remote << indent() << " break" << '\n'; + indent_up(); + f_remote << indent() << "protocolFactory = thrift.NewTJSONProtocolFactory()" << '\n'; + indent_down(); f_remote << indent() << "case \"binary\", \"\":" << '\n'; - f_remote << indent() << " protocolFactory = thrift.NewTBinaryProtocolFactoryConf(cfg)" << '\n'; - f_remote << indent() << " break" << '\n'; + indent_up(); + f_remote << indent() << "protocolFactory = thrift.NewTBinaryProtocolFactoryConf(cfg)" << '\n'; + indent_down(); f_remote << indent() << "default:" << '\n'; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Invalid protocol specified: \", protocol)" + indent_up(); + f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Invalid protocol specified: \", protocol)" << '\n'; - f_remote << indent() << " Usage()" << '\n'; - f_remote << indent() << " os.Exit(1)" << '\n'; + f_remote << indent() << "Usage()" << '\n'; + f_remote << indent() << "os.Exit(1)" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << "iprot := protocolFactory.GetProtocol(trans)" << '\n'; f_remote << indent() << "oprot := protocolFactory.GetProtocol(trans)" << '\n'; f_remote << indent() << "client := " << package_name_aliased << ".New" << publicize(service_name_) << "Client(thrift.NewTStandardClient(iprot, oprot))" << '\n'; f_remote << indent() << "if err := trans.Open(); err != nil {" << '\n'; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Error opening socket to \", " + indent_up(); + f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Error opening socket to \", " "host, \":\", port, \" \", err)" << '\n'; - f_remote << indent() << " os.Exit(1)" << '\n'; + f_remote << indent() << "os.Exit(1)" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << '\n'; f_remote << indent() << "switch cmd {" << '\n'; @@ -2407,9 +2515,11 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "case \"" << escape_string(funcName) << "\":" << '\n'; indent_up(); f_remote << indent() << "if flag.NArg() - 1 != " << num_args << " {" << '\n'; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"" << escape_string(pubName) << " requires " + indent_up(); + f_remote << indent() << "fmt.Fprintln(os.Stderr, \"" << escape_string(pubName) << " requires " << num_args << " args\")" << '\n'; - f_remote << indent() << " flag.Usage()" << '\n'; + f_remote << indent() << "flag.Usage()" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; for (std::vector::size_type i = 0; i < num_args; ++i) { @@ -2421,8 +2531,10 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "tmp" << i << ", err := (strconv.Atoi(flag.Arg(" << flagArg << ")))" << '\n'; f_remote << indent() << "if err != nil {" << '\n'; - f_remote << indent() << " Usage()" << '\n'; - f_remote << indent() << " return" << '\n'; + indent_up(); + f_remote << indent() << "Usage()" << '\n'; + f_remote << indent() << "return" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << "argvalue" << i << " := " << package_name_aliased << "." << publicize(the_type->get_name()) << "(tmp" << i << ")" << '\n'; @@ -2452,8 +2564,10 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "tmp" << i << ", " << err << " := (strconv.Atoi(flag.Arg(" << flagArg << ")))" << '\n'; f_remote << indent() << "if " << err << " != nil {" << '\n'; - f_remote << indent() << " Usage()" << '\n'; - f_remote << indent() << " return" << '\n'; + indent_up(); + f_remote << indent() << "Usage()" << '\n'; + f_remote << indent() << "return" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << "argvalue" << i << " := int8(tmp" << i << ")" << '\n'; break; @@ -2462,8 +2576,10 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "tmp" << i << ", " << err << " := (strconv.Atoi(flag.Arg(" << flagArg << ")))" << '\n'; f_remote << indent() << "if " << err << " != nil {" << '\n'; - f_remote << indent() << " Usage()" << '\n'; - f_remote << indent() << " return" << '\n'; + indent_up(); + f_remote << indent() << "Usage()" << '\n'; + f_remote << indent() << "return" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << "argvalue" << i << " := int16(tmp" << i << ")" << '\n'; break; @@ -2472,8 +2588,10 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "tmp" << i << ", " << err << " := (strconv.Atoi(flag.Arg(" << flagArg << ")))" << '\n'; f_remote << indent() << "if " << err << " != nil {" << '\n'; - f_remote << indent() << " Usage()" << '\n'; - f_remote << indent() << " return" << '\n'; + indent_up(); + f_remote << indent() << "Usage()" << '\n'; + f_remote << indent() << "return" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << "argvalue" << i << " := int32(tmp" << i << ")" << '\n'; break; @@ -2482,8 +2600,10 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "argvalue" << i << ", " << err << " := (strconv.ParseInt(flag.Arg(" << flagArg << "), 10, 64))" << '\n'; f_remote << indent() << "if " << err << " != nil {" << '\n'; - f_remote << indent() << " Usage()" << '\n'; - f_remote << indent() << " return" << '\n'; + indent_up(); + f_remote << indent() << "Usage()" << '\n'; + f_remote << indent() << "return" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; break; @@ -2491,8 +2611,10 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "argvalue" << i << ", " << err << " := (strconv.ParseFloat(flag.Arg(" << flagArg << "), 64))" << '\n'; f_remote << indent() << "if " << err << " != nil {" << '\n'; - f_remote << indent() << " Usage()" << '\n'; - f_remote << indent() << " return" << '\n'; + indent_up(); + f_remote << indent() << "Usage()" << '\n'; + f_remote << indent() << "return" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; break; @@ -2500,8 +2622,10 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "argvalue" << i << ", " << err << " := (thrift.ParseTuuid(flag.Arg(" << flagArg << ")))" << '\n'; f_remote << indent() << "if " << err << " != nil {" << '\n'; - f_remote << indent() << " Usage()" << '\n'; - f_remote << indent() << " return" << '\n'; + indent_up(); + f_remote << indent() << "Usage()" << '\n'; + f_remote << indent() << "return" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; break; @@ -2531,18 +2655,22 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "_, " << err1 << " := " << mbTrans << ".WriteString(" << arg << ")" << '\n'; f_remote << indent() << "if " << err1 << " != nil {" << '\n'; - f_remote << indent() << " Usage()" << '\n'; - f_remote << indent() << " return" << '\n'; + indent_up(); + f_remote << indent() << "Usage()" << '\n'; + f_remote << indent() << "return" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << factory << " := thrift.NewTJSONProtocolFactory()" << '\n'; f_remote << indent() << jsProt << " := " << factory << ".GetProtocol(" << mbTrans << ")" << '\n'; f_remote << indent() << "argvalue" << i << " := " << tstruct_module << ".New" << tstruct_name << "()" << '\n'; - f_remote << indent() << err2 << " := argvalue" << i << "." << read_method_name_ << "(context.Background(), " << jsProt << ")" << '\n'; + f_remote << indent() << err2 << " := argvalue" << i << "." << read_method_name_ << "(context.Background(), " << jsProt << ")" << '\n'; f_remote << indent() << "if " << err2 << " != nil {" << '\n'; - f_remote << indent() << " Usage()" << '\n'; - f_remote << indent() << " return" << '\n'; + indent_up(); + f_remote << indent() << "Usage()" << '\n'; + f_remote << indent() << "return" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; } else if (the_type2->is_container() || the_type2->is_xception()) { string arg(tmp("arg")); @@ -2559,8 +2687,10 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "_, " << err1 << " := " << mbTrans << ".WriteString(" << arg << ")" << '\n'; f_remote << indent() << "if " << err1 << " != nil { " << '\n'; - f_remote << indent() << " Usage()" << '\n'; - f_remote << indent() << " return" << '\n'; + indent_up(); + f_remote << indent() << "Usage()" << '\n'; + f_remote << indent() << "return" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << factory << " := thrift.NewTJSONProtocolFactory()" << '\n'; f_remote << indent() << jsProt << " := " << factory << ".GetProtocol(" << mbTrans << ")" @@ -2570,8 +2700,10 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << err2 << " := containerStruct" << i << ".ReadField" << (i + 1) << "(context.Background(), " << jsProt << ")" << '\n'; f_remote << indent() << "if " << err2 << " != nil {" << '\n'; - f_remote << indent() << " Usage()" << '\n'; - f_remote << indent() << " return" << '\n'; + indent_up(); + f_remote << indent() << "Usage()" << '\n'; + f_remote << indent() << "return" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; f_remote << indent() << "argvalue" << i << " := containerStruct" << i << "." << argName << '\n'; @@ -2641,10 +2773,13 @@ void t_go_generator::generate_service_remote(t_service* tservice) { } f_remote << indent() << "case \"\":" << '\n'; - f_remote << indent() << " Usage()" << '\n'; - f_remote << indent() << " break" << '\n'; + indent_up(); + f_remote << indent() << "Usage()" << '\n'; + indent_down(); f_remote << indent() << "default:" << '\n'; - f_remote << indent() << " fmt.Fprintln(os.Stderr, \"Invalid function \", cmd)" << '\n'; + indent_up(); + f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Invalid function \", cmd)" << '\n'; + indent_down(); f_remote << indent() << "}" << '\n'; indent_down(); f_remote << indent() << "}" << '\n'; @@ -2697,78 +2832,95 @@ void t_go_generator::generate_service_server(t_service* tservice) { if (extends_processor.empty()) { f_types_ << indent() << "type " << serviceName << "Processor struct {" << '\n'; - f_types_ << indent() << " processorMap map[string]thrift.TProcessorFunction" << '\n'; - f_types_ << indent() << " handler " << serviceName << '\n'; + indent_up(); + f_types_ << indent() << "processorMap map[string]thrift.TProcessorFunction" << '\n'; + f_types_ << indent() << "handler " << serviceName << '\n'; + indent_down(); f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func (p *" << serviceName << "Processor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {" << '\n'; - f_types_ << indent() << " p.processorMap[key] = processor" << '\n'; + indent_up(); + f_types_ << indent() << "p.processorMap[key] = processor" << '\n'; + indent_down(); f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func (p *" << serviceName << "Processor) GetProcessorFunction(key string) " "(processor thrift.TProcessorFunction, ok bool) {" << '\n'; - f_types_ << indent() << " processor, ok = p.processorMap[key]" << '\n'; - f_types_ << indent() << " return processor, ok" << '\n'; + indent_up(); + f_types_ << indent() << "processor, ok = p.processorMap[key]" << '\n'; + f_types_ << indent() << "return processor, ok" << '\n'; + indent_down(); f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func (p *" << serviceName << "Processor) ProcessorMap() map[string]thrift.TProcessorFunction {" << '\n'; - f_types_ << indent() << " return p.processorMap" << '\n'; + indent_up(); + f_types_ << indent() << "return p.processorMap" << '\n'; + indent_down(); f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func New" << serviceName << "Processor(handler " << serviceName << ") *" << serviceName << "Processor {" << '\n' << '\n'; + indent_up(); f_types_ - << indent() << " " << self << " := &" << serviceName + << indent() << self << " := &" << serviceName << "Processor{handler:handler, processorMap:make(map[string]thrift.TProcessorFunction)}" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { string escapedFuncName(escape_string((*f_iter)->get_name())); - f_types_ << indent() << " " << self << ".processorMap[\"" << escapedFuncName << "\"] = &" + f_types_ << indent() << self << ".processorMap[\"" << escapedFuncName << "\"] = &" << pServiceName << "Processor" << publicize((*f_iter)->get_name()) << "{handler:handler}" << '\n'; } string x(tmp("x")); f_types_ << indent() << "return " << self << '\n'; + indent_down(); f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func (p *" << serviceName << "Processor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err " "thrift.TException) {" << '\n'; - f_types_ << indent() << " name, _, seqId, err2 := iprot.ReadMessageBegin(ctx)" << '\n'; - f_types_ << indent() << " if err2 != nil { return false, thrift.WrapTException(err2) }" << '\n'; - f_types_ << indent() << " if processor, ok := p.GetProcessorFunction(name); ok {" << '\n'; - f_types_ << indent() << " return processor.Process(ctx, seqId, iprot, oprot)" << '\n'; - f_types_ << indent() << " }" << '\n'; - f_types_ << indent() << " iprot.Skip(ctx, thrift.STRUCT)" << '\n'; - f_types_ << indent() << " iprot.ReadMessageEnd(ctx)" << '\n'; - f_types_ << indent() << " " << x + indent_up(); + f_types_ << indent() << "name, _, seqId, err2 := iprot.ReadMessageBegin(ctx)" << '\n'; + f_types_ << indent() << "if err2 != nil { return false, thrift.WrapTException(err2) }" << '\n'; + f_types_ << indent() << "if processor, ok := p.GetProcessorFunction(name); ok {" << '\n'; + indent_up(); + f_types_ << indent() << "return processor.Process(ctx, seqId, iprot, oprot)" << '\n'; + indent_down(); + f_types_ << indent() << "}" << '\n'; + f_types_ << indent() << "iprot.Skip(ctx, thrift.STRUCT)" << '\n'; + f_types_ << indent() << "iprot.ReadMessageEnd(ctx)" << '\n'; + f_types_ << indent() << "" << x << " := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function " "\" + name)" << '\n'; - f_types_ << indent() << " oprot.WriteMessageBegin(ctx, name, thrift.EXCEPTION, seqId)" << '\n'; - f_types_ << indent() << " " << x << ".Write(ctx, oprot)" << '\n'; - f_types_ << indent() << " oprot.WriteMessageEnd(ctx)" << '\n'; - f_types_ << indent() << " oprot.Flush(ctx)" << '\n'; - f_types_ << indent() << " return false, " << x << '\n'; - f_types_ << indent() << "" << '\n'; + f_types_ << indent() << "oprot.WriteMessageBegin(ctx, name, thrift.EXCEPTION, seqId)" << '\n'; + f_types_ << indent() << "" << x << ".Write(ctx, oprot)" << '\n'; + f_types_ << indent() << "oprot.WriteMessageEnd(ctx)" << '\n'; + f_types_ << indent() << "oprot.Flush(ctx)" << '\n'; + f_types_ << indent() << "return false, " << x << '\n'; + indent_down(); f_types_ << indent() << "}" << '\n' << '\n'; } else { f_types_ << indent() << "type " << serviceName << "Processor struct {" << '\n'; - f_types_ << indent() << " *" << extends_processor << '\n'; + indent_up(); + f_types_ << indent() << "*" << extends_processor << '\n'; + indent_down(); f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func New" << serviceName << "Processor(handler " << serviceName << ") *" << serviceName << "Processor {" << '\n'; - f_types_ << indent() << " " << self << " := &" << serviceName << "Processor{" + indent_up(); + f_types_ << indent() << self << " := &" << serviceName << "Processor{" << extends_processor_new << "(handler)}" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { string escapedFuncName(escape_string((*f_iter)->get_name())); - f_types_ << indent() << " " << self << ".AddToProcessorMap(\"" << escapedFuncName + f_types_ << indent() << self << ".AddToProcessorMap(\"" << escapedFuncName << "\", &" << pServiceName << "Processor" << publicize((*f_iter)->get_name()) << "{handler:handler})" << '\n'; } - f_types_ << indent() << " return " << self << '\n'; + f_types_ << indent() << "return " << self << '\n'; + indent_down(); f_types_ << indent() << "}" << '\n' << '\n'; } @@ -2795,7 +2947,9 @@ void t_go_generator::generate_process_function(t_service* tservice, t_function* // t_struct* xs = tfunction->get_xceptions(); // const std::vector& xceptions = xs->get_members(); f_types_ << indent() << "type " << processorName << " struct {" << '\n'; - f_types_ << indent() << " handler " << publicize(tservice->get_name()) << '\n'; + indent_up(); + f_types_ << indent() << "handler " << publicize(tservice->get_name()) << '\n'; + indent_down(); f_types_ << indent() << "}" << '\n' << '\n'; f_types_ << indent() << "func (p *" << processorName << ") Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err " @@ -2807,7 +2961,7 @@ void t_go_generator::generate_process_function(t_service* tservice, t_function* f_types_ << indent() << "var " << write_err << " error" << '\n'; } f_types_ << indent() << "args := " << argsname << "{}" << '\n'; - f_types_ << indent() << "if err2 := args." << read_method_name_ << "(ctx, iprot); err2 != nil {" << '\n'; + f_types_ << indent() << "if err2 := args." << read_method_name_ << "(ctx, iprot); err2 != nil {" << '\n'; indent_up(); f_types_ << indent() << "iprot.ReadMessageEnd(ctx)" << '\n'; if (!tfunction->is_oneway()) { @@ -3096,7 +3250,7 @@ void t_go_generator::generate_deserialize_field(ostream& out, string type_name = inkey ? type_to_go_key_type(tfield->get_type()) : type_to_go_type(tfield->get_type()); - out << "var " << tfield->get_name() << " " << type_name << '\n'; + out << indent() << "var " << tfield->get_name() << " " << type_name << '\n'; } indent(out) << "if v, err := iprot."; @@ -3154,10 +3308,13 @@ void t_go_generator::generate_deserialize_field(ostream& out, } out << "; err != nil {" << '\n'; + indent_up(); out << indent() << "return thrift.PrependError(\"error reading field " << tfield->get_key() << ": \", err)" << '\n'; - out << "} else {" << '\n'; + indent_down(); + out << indent() << "} else {" << '\n'; + indent_up(); string wrap; if (type->is_enum() || orig_type->is_typedef()) { @@ -3174,7 +3331,8 @@ void t_go_generator::generate_deserialize_field(ostream& out, indent(out) << name << " = " << maybe_address << "temp" << '\n'; } - out << "}" << '\n'; + indent_down(); + out << indent() << "}" << '\n'; } else { throw "INVALID TYPE IN generate_deserialize_field '" + type->get_name() + "' for field '" + tfield->get_name() + "'"; @@ -3193,9 +3351,11 @@ void t_go_generator::generate_deserialize_struct(ostream& out, out << indent() << prefix << eq << (pointer_field ? "&" : ""); generate_go_struct_initializer(out, tstruct); - out << indent() << "if err := " << prefix << "." << read_method_name_ << "(ctx, iprot); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", " + out << indent() << "if err := " << prefix << "." << read_method_name_ << "(ctx, iprot); err != nil {" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", " << prefix << "), err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; } @@ -3219,31 +3379,37 @@ void t_go_generator::generate_deserialize_container(ostream& out, if (ttype->is_map()) { out << indent() << "_, _, size, err := iprot.ReadMapBegin(ctx)" << '\n'; out << indent() << "if err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"error reading map begin: \", err)" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"error reading map begin: \", err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; out << indent() << "tMap := make(" << type_to_go_type(orig_type) << ", size)" << '\n'; - out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tMap" << '\n'; + out << indent() << prefix << eq << (pointer_field ? "&" : "") << "tMap" << '\n'; } else if (ttype->is_set()) { out << indent() << "_, size, err := iprot.ReadSetBegin(ctx)" << '\n'; out << indent() << "if err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"error reading set begin: \", err)" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"error reading set begin: \", err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; out << indent() << "tSet := make(" << type_to_go_type(orig_type) << ", 0, size)" << '\n'; - out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSet" << '\n'; + out << indent() << prefix << eq << (pointer_field ? "&" : "") << "tSet" << '\n'; } else if (ttype->is_list()) { out << indent() << "_, size, err := iprot.ReadListBegin(ctx)" << '\n'; out << indent() << "if err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"error reading list begin: \", err)" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"error reading list begin: \", err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; out << indent() << "tSlice := make(" << type_to_go_type(orig_type) << ", 0, size)" << '\n'; - out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSlice" << '\n'; + out << indent() << prefix << eq << (pointer_field ? "&" : "") << "tSlice" << '\n'; } else { throw "INVALID TYPE IN generate_deserialize_container '" + ttype->get_name() + "' for prefix '" + prefix + "'"; } // For loop iterates over elements - out << indent() << "for i := 0; i < size; i ++ {" << '\n'; + out << indent() << "for i := 0; i < size; i++ {" << '\n'; indent_up(); if (pointer_field) { @@ -3263,15 +3429,21 @@ void t_go_generator::generate_deserialize_container(ostream& out, // Read container end if (ttype->is_map()) { out << indent() << "if err := iprot.ReadMapEnd(ctx); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"error reading map end: \", err)" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"error reading map end: \", err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; } else if (ttype->is_set()) { out << indent() << "if err := iprot.ReadSetEnd(ctx); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"error reading set end: \", err)" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"error reading set end: \", err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; } else if (ttype->is_list()) { out << indent() << "if err := iprot.ReadListEnd(ctx); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"error reading list end: \", err)" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"error reading list end: \", err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; } } @@ -3407,9 +3579,12 @@ void t_go_generator::generate_serialize_field(ostream& out, } out << "; err != nil {" << '\n'; + indent_up(); out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T." << escape_string(tfield->get_name()) << " (" << tfield->get_key() - << ") field write error: \", p), err) }" << '\n'; + << ") field write error: \", p), err)" << '\n'; + indent_down(); + out << indent() << "}" << '\n'; } else { throw "compiler error: Invalid type in generate_serialize_field '" + type->get_name() + "' for field '" + name + "'"; @@ -3425,8 +3600,10 @@ void t_go_generator::generate_serialize_field(ostream& out, void t_go_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) { (void)tstruct; out << indent() << "if err := " << prefix << "." << write_method_name_ << "(ctx, oprot); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", " + indent_up(); + out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", " << prefix << "), err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; } @@ -3442,19 +3619,25 @@ void t_go_generator::generate_serialize_container(ostream& out, << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << "len(" << prefix << ")); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"error writing map begin: \", err)" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"error writing map begin: \", err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; } else if (ttype->is_set()) { out << indent() << "if err := oprot.WriteSetBegin(ctx, " << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " << "len(" << prefix << ")); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"error writing set begin: \", err)" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"error writing set begin: \", err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; } else if (ttype->is_list()) { out << indent() << "if err := oprot.WriteListBegin(ctx, " << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << "len(" << prefix << ")); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"error writing list begin: \", err)" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"error writing list begin: \", err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; } else { throw "compiler error: Invalid type in generate_serialize_container '" + ttype->get_name() @@ -3513,15 +3696,21 @@ void t_go_generator::generate_serialize_container(ostream& out, if (ttype->is_map()) { out << indent() << "if err := oprot.WriteMapEnd(ctx); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"error writing map end: \", err)" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"error writing map end: \", err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; } else if (ttype->is_set()) { out << indent() << "if err := oprot.WriteSetEnd(ctx); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"error writing set end: \", err)" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"error writing set end: \", err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; } else if (ttype->is_list()) { out << indent() << "if err := oprot.WriteListEnd(ctx); err != nil {" << '\n'; - out << indent() << " return thrift.PrependError(\"error writing list end: \", err)" << '\n'; + indent_up(); + out << indent() << "return thrift.PrependError(\"error writing list end: \", err)" << '\n'; + indent_down(); out << indent() << "}" << '\n'; } } diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.h b/compiler/cpp/src/thrift/generate/t_go_generator.h index 55f544e19f8..1efa32daa33 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.h +++ b/compiler/cpp/src/thrift/generate/t_go_generator.h @@ -286,6 +286,10 @@ class t_go_generator : public t_generator { static bool is_pointer_field(t_field* tfield, bool in_container = false); + std::string indent_str() const { + return "\t"; + } + private: std::string gen_package_prefix_; std::string gen_thrift_import_; From b429cc9fa197b9da45f98f14efcf03bf84f02307 Mon Sep 17 00:00:00 2001 From: Nicholas La Roux Date: Fri, 17 May 2024 11:09:09 +0900 Subject: [PATCH 064/430] Remove deprecated has_rdoc from gemspec --- lib/rb/thrift.gemspec | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/rb/thrift.gemspec b/lib/rb/thrift.gemspec index 86d21897bc2..1977ec4766f 100644 --- a/lib/rb/thrift.gemspec +++ b/lib/rb/thrift.gemspec @@ -12,7 +12,6 @@ Gem::Specification.new do |s| s.license = 'Apache-2.0' s.extensions = ['ext/extconf.rb'] - s.has_rdoc = true s.rdoc_options = %w[--line-numbers --inline-source --title Thrift --main README] s.rubyforge_project = 'thrift' From 55014bad62e03ebd1e02cd7f12bdcc48780bcff9 Mon Sep 17 00:00:00 2001 From: Steven Mitcham Date: Wed, 22 May 2024 13:30:37 -0500 Subject: [PATCH 065/430] THRIFT-5787 restoring binary compatibility of Factory constructor Client: netstd Patch: Steven Mitcham This closes #2979 --- lib/netstd/Thrift/Protocol/TBinaryProtocol.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs b/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs index 6389184a41c..186d220cbf7 100644 --- a/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs +++ b/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs @@ -475,7 +475,13 @@ public class Factory : TProtocolFactory protected readonly bool StrictRead; protected readonly bool StrictWrite; - public Factory(bool strictRead = false, bool strictWrite = true) + // emtpy default CTOR required + public Factory() + : this(false, true) + { + } + + public Factory(bool strictRead, bool strictWrite) { StrictRead = strictRead; StrictWrite = strictWrite; From da5ef3637eb078bf3f411c2b3d14b91b84837230 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 24 May 2024 21:09:42 +0200 Subject: [PATCH 066/430] THRIFT-5788 Refactor and streamline hash set implementation Client: delphi Patch: Jens Geyer --- lib/delphi/src/Thrift.Collections.pas | 97 +++++++++------------------ 1 file changed, 33 insertions(+), 64 deletions(-) diff --git a/lib/delphi/src/Thrift.Collections.pas b/lib/delphi/src/Thrift.Collections.pas index 2cb2395adcc..c0fe3231946 100644 --- a/lib/delphi/src/Thrift.Collections.pas +++ b/lib/delphi/src/Thrift.Collections.pas @@ -191,127 +191,96 @@ TThriftListImpl = class( TInterfacedObject, IThriftList, IThriftContaine function ToString : string; override; end; - IThriftHashSet = interface(IThriftContainer) - ['{0923A3B5-D4D4-48A8-91AD-40238E2EAD66}'] - function GetEnumerator: TEnumerator; - function GetIsReadOnly: Boolean; + IThriftHashSet = interface(IThriftContainer) + ['{733E2B57-C374-4359-BBD5-2B9CD8DF737C}'] + function GetEnumerator: TEnumerator; function GetCount: Integer; property Count: Integer read GetCount; - property IsReadOnly: Boolean read GetIsReadOnly; - procedure Add( const item: TValue); + function Add( const item: T) : Boolean; procedure Clear; - function Contains( const item: TValue): Boolean; - procedure CopyTo(var A: TArray; arrayIndex: Integer); - function Remove( const item: TValue ): Boolean; + function Contains( const item: T): Boolean; + function Remove( const item: T): Boolean; end; // compatibility - IHashSet = interface( IThriftHashSet) + IHashSet = interface( IThriftHashSet) ['{C3CF557F-21D9-4524-B899-D3145B0389BB}'] end deprecated 'use IThriftHashSet'; {$WARN SYMBOL_DEPRECATED OFF} - TThriftHashSetImpl = class( TInterfacedObject, IHashSet, IThriftHashSet, IThriftContainer, ISupportsToString) + TThriftHashSetImpl = class( TInterfacedObject, IHashSet, IThriftHashSet, IThriftContainer, ISupportsToString) {$WARN SYMBOL_DEPRECATED DEFAULT} strict private - FDictionary : IThriftDictionary; - FIsReadOnly: Boolean; + FDictionary : TDictionary; // there is no THashSet in older Delphi versions strict protected - function GetEnumerator: TEnumerator; - function GetIsReadOnly: Boolean; + function GetEnumerator: TEnumerator; function GetCount: Integer; property Count: Integer read GetCount; - property IsReadOnly: Boolean read FIsReadOnly; - procedure Add( const item: TValue); + function Add( const item: T) : Boolean; procedure Clear; - function Contains( const item: TValue): Boolean; - procedure CopyTo(var A: TArray; arrayIndex: Integer); - function Remove( const item: TValue ): Boolean; + function Contains( const item: T): Boolean; + function Remove( const item: T): Boolean; public constructor Create( const aCapacity: Integer = 0); overload; - constructor Create( const aCapacity: Integer; const aComparer : IEqualityComparer); overload; + constructor Create( const aCapacity: Integer; const aComparer : IEqualityComparer); overload; function ToString : string; override; end; // compatibility - THashSetImpl = class( TThriftHashSetImpl) + THashSetImpl = class( TThriftHashSetImpl) end deprecated 'use TThriftHashSetImpl'; implementation -{ TThriftHashSetImpl. } +{ TThriftHashSetImpl. } -procedure TThriftHashSetImpl.Add( const item: TValue); +function TThriftHashSetImpl.Add( const item: T) : Boolean; begin - if not FDictionary.ContainsKey(item) then - begin - FDictionary.Add( item, 0); - end; + result := not FDictionary.ContainsKey(item); + if result then FDictionary.Add( item, 0); end; -procedure TThriftHashSetImpl.Clear; +procedure TThriftHashSetImpl.Clear; begin FDictionary.Clear; end; -function TThriftHashSetImpl.Contains( const item: TValue): Boolean; +function TThriftHashSetImpl.Contains( const item: T): Boolean; begin Result := FDictionary.ContainsKey(item); end; -procedure TThriftHashSetImpl.CopyTo(var A: TArray; arrayIndex: Integer); -var - i : Integer; - Enumlator : TEnumerator; -begin - Enumlator := GetEnumerator; - while Enumlator.MoveNext do - begin - A[arrayIndex] := Enumlator.Current; - Inc(arrayIndex); - end; -end; - -constructor TThriftHashSetImpl.Create( const aCapacity: Integer); +constructor TThriftHashSetImpl.Create( const aCapacity: Integer); begin inherited Create; - FDictionary := TThriftDictionaryImpl.Create( aCapacity); + FDictionary := TDictionary.Create( aCapacity); end; -constructor TThriftHashSetImpl.Create( const aCapacity: Integer; const aComparer : IEqualityComparer); +constructor TThriftHashSetImpl.Create( const aCapacity: Integer; const aComparer : IEqualityComparer); begin inherited Create; - FDictionary := TThriftDictionaryImpl.Create( aCapacity, aComparer); + FDictionary := TDictionary.Create( aCapacity, aComparer); end; -function TThriftHashSetImpl.GetCount: Integer; +function TThriftHashSetImpl.GetCount: Integer; begin Result := FDictionary.Count; end; -function TThriftHashSetImpl.GetEnumerator: TEnumerator; +function TThriftHashSetImpl.GetEnumerator: TEnumerator; begin Result := FDictionary.Keys.GetEnumerator; end; -function TThriftHashSetImpl.GetIsReadOnly: Boolean; +function TThriftHashSetImpl.Remove( const item: T): Boolean; begin - Result := FIsReadOnly; + Result := FDictionary.ContainsKey( item); + if Result then FDictionary.Remove( item ); end; -function TThriftHashSetImpl.Remove( const item: TValue): Boolean; -begin - Result := False; - if FDictionary.ContainsKey( item ) then - begin - FDictionary.Remove( item ); - Result := not FDictionary.ContainsKey( item ); - end; -end; - -function TThriftHashSetImpl.ToString : string; -var elm : TValue; +function TThriftHashSetImpl.ToString : string; +var elm : T; sb : TThriftStringBuilder; first : Boolean; begin @@ -323,7 +292,7 @@ function TThriftHashSetImpl.ToString : string; then first := FALSE else sb.Append(', '); - sb.Append( StringUtils.ToString(elm)); + sb.Append( StringUtils.ToString(elm)); end; sb.Append('}'); Result := sb.ToString; From 82fc93e6c36312fc0c016a70163206e4eead21ac Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 24 May 2024 23:36:07 +0200 Subject: [PATCH 067/430] THRIFT-5789 Refactor test suite client implementation Client: Delphi Patch: Jens Geyer --- lib/delphi/test/client.dpr | 10 +- lib/delphi/test/client.dproj | 12 +- lib/delphi/test/server.dpr | 5 +- lib/delphi/test/server.dproj | 5 +- .../test/{ => testsuite}/TestConstants.pas | 48 +++ .../client}/Performance/DataFactory.pas | 0 .../client}/Performance/PerfTests.pas | 0 .../{ => testsuite/client}/TestClient.pas | 313 ++-------------- .../test/testsuite/client/TestLogger.pas | 193 ++++++++++ .../test/testsuite/client/UnitTests.pas | 350 ++++++++++++++++++ .../{ => testsuite/server}/TestServer.pas | 0 .../server}/TestServerEvents.pas | 0 12 files changed, 634 insertions(+), 302 deletions(-) rename lib/delphi/test/{ => testsuite}/TestConstants.pas (85%) rename lib/delphi/test/{ => testsuite/client}/Performance/DataFactory.pas (100%) rename lib/delphi/test/{ => testsuite/client}/Performance/PerfTests.pas (100%) rename lib/delphi/test/{ => testsuite/client}/TestClient.pas (80%) create mode 100644 lib/delphi/test/testsuite/client/TestLogger.pas create mode 100644 lib/delphi/test/testsuite/client/UnitTests.pas rename lib/delphi/test/{ => testsuite/server}/TestServer.pas (100%) rename lib/delphi/test/{ => testsuite/server}/TestServerEvents.pas (100%) diff --git a/lib/delphi/test/client.dpr b/lib/delphi/test/client.dpr index eaeeee0a28d..db62995559e 100644 --- a/lib/delphi/test/client.dpr +++ b/lib/delphi/test/client.dpr @@ -24,9 +24,13 @@ program client; uses SysUtils, - DataFactory in 'Performance\DataFactory.pas', - PerfTests in 'Performance\PerfTests.pas', - TestClient in 'TestClient.pas', + ConsoleHelper in 'ConsoleHelper.pas', + TestConstants in 'testsuite\TestConstants.pas', + TestClient in 'testsuite\client\TestClient.pas', + TestLogger in 'testsuite\client\TestLogger.pas', + UnitTests in 'testsuite\client\UnitTests.pas', + PerfTests in 'testsuite\client\Performance\PerfTests.pas', + DataFactory in 'testsuite\client\Performance\DataFactory.pas', Thrift.Test in 'gen-delphi\Thrift.Test.pas', Thrift in '..\src\Thrift.pas', Thrift.Transport in '..\src\Thrift.Transport.pas', diff --git a/lib/delphi/test/client.dproj b/lib/delphi/test/client.dproj index ae6683d992d..ae31ba050e5 100644 --- a/lib/delphi/test/client.dproj +++ b/lib/delphi/test/client.dproj @@ -50,9 +50,13 @@ MainSource - - - + + + + + + + @@ -125,7 +129,7 @@ - --protocol=compact + --protocol=compact diff --git a/lib/delphi/test/server.dpr b/lib/delphi/test/server.dpr index 79942816980..0cab02f3395 100644 --- a/lib/delphi/test/server.dpr +++ b/lib/delphi/test/server.dpr @@ -23,8 +23,9 @@ program server; uses SysUtils, - TestServer in 'TestServer.pas', - TestServerEvents in 'TestServerEvents.pas', + TestConstants in 'testsuite\TestConstants.pas', + TestServer in 'testsuite\server\TestServer.pas', + TestServerEvents in 'testsuite\server\TestServerEvents.pas', Thrift.Test in 'gen-delphi\Thrift.Test.pas', Thrift in '..\src\Thrift.pas', Thrift.Exception in '..\src\Thrift.Exception.pas', diff --git a/lib/delphi/test/server.dproj b/lib/delphi/test/server.dproj index 8e9b99dd72d..37ef9c9a6ed 100644 --- a/lib/delphi/test/server.dproj +++ b/lib/delphi/test/server.dproj @@ -50,8 +50,9 @@ MainSource - - + + + diff --git a/lib/delphi/test/TestConstants.pas b/lib/delphi/test/testsuite/TestConstants.pas similarity index 85% rename from lib/delphi/test/TestConstants.pas rename to lib/delphi/test/testsuite/TestConstants.pas index 9ac4808c056..e51b60084b9 100644 --- a/lib/delphi/test/TestConstants.pas +++ b/lib/delphi/test/testsuite/TestConstants.pas @@ -55,6 +55,18 @@ interface TLayeredTransports = set of TLayeredTransport; + {$SCOPEDENUMS ON} + TTestSize = ( + Empty, // Edge case: the zero-length empty binary + Normal, // Fairly small array of usual size (256 bytes) + ByteArrayTest, // THRIFT-4454 Large writes/reads may cause range check errors in debug mode + PipeWriteLimit, // THRIFT-4372 Pipe write operations across a network are limited to 65,535 bytes per write. + FifteenMB // quite a bit of data, but still below the default max frame size + ); + {$SCOPEDENUMS OFF} + + + const PROTOCOL_CLASSES : array[TKnownProtocol] of TProtocolImplClass = ( TBinaryProtocolImpl, @@ -151,6 +163,8 @@ interface function BytesToHex( const bytes : TBytes) : string; +function PrepareBinaryData( aRandomDist : Boolean; aSize : TTestSize) : TBytes; + implementation @@ -165,4 +179,38 @@ function BytesToHex( const bytes : TBytes) : string; end; +function PrepareBinaryData( aRandomDist : Boolean; aSize : TTestSize) : TBytes; +var i : Integer; +begin + case aSize of + TTestSize.Empty : SetLength( result, 0); + TTestSize.Normal : SetLength( result, $100); + TTestSize.ByteArrayTest : SetLength( result, SizeOf(TByteArray) + 128); + TTestSize.PipeWriteLimit : SetLength( result, 65535 + 128); + TTestSize.FifteenMB : SetLength( result, 15 * 1024 * 1024); + else + raise EArgumentException.Create('aSize'); + end; + + ASSERT( Low(result) = 0); + if Length(result) = 0 then Exit; + + // linear distribution, unless random is requested + if not aRandomDist then begin + for i := Low(result) to High(result) do begin + result[i] := i mod $100; + end; + Exit; + end; + + // random distribution of all 256 values + FillChar( result[0], Length(result) * SizeOf(result[0]), $0); + for i := Low(result) to High(result) do begin + result[i] := Byte( Random($100)); + end; +end; + + + + end. diff --git a/lib/delphi/test/Performance/DataFactory.pas b/lib/delphi/test/testsuite/client/Performance/DataFactory.pas similarity index 100% rename from lib/delphi/test/Performance/DataFactory.pas rename to lib/delphi/test/testsuite/client/Performance/DataFactory.pas diff --git a/lib/delphi/test/Performance/PerfTests.pas b/lib/delphi/test/testsuite/client/Performance/PerfTests.pas similarity index 100% rename from lib/delphi/test/Performance/PerfTests.pas rename to lib/delphi/test/testsuite/client/Performance/PerfTests.pas diff --git a/lib/delphi/test/TestClient.pas b/lib/delphi/test/testsuite/client/TestClient.pas similarity index 80% rename from lib/delphi/test/TestClient.pas rename to lib/delphi/test/testsuite/client/TestClient.pas index 1b09d3cf450..aca64410c17 100644 --- a/lib/delphi/test/TestClient.pas +++ b/lib/delphi/test/testsuite/client/TestClient.pas @@ -39,8 +39,10 @@ interface DateUtils, Generics.Collections, TestConstants, + TestLogger, ConsoleHelper, PerfTests, + UnitTests, Thrift, Thrift.Protocol.Compact, Thrift.Protocol.JSON, @@ -82,25 +84,6 @@ TTestSetup = record end; TClientThread = class( TThread ) - private type - TTestGroup = ( - test_Unknown, - test_BaseTypes, - test_Structs, - test_Containers, - test_Exceptions - // new values here - ); - TTestGroups = set of TTestGroup; - - TTestSize = ( - Empty, // Edge case: the zero-length empty binary - Normal, // Fairly small array of usual size (256 bytes) - ByteArrayTest, // THRIFT-4454 Large writes/reads may cause range check errors in debug mode - PipeWriteLimit, // THRIFT-4372 Pipe write operations across a network are limited to 65,535 bytes per write. - FifteenMB // quite a bit of data, but still below the default max frame size - ); - strict private FSetup : TTestSetup; FTransport : ITransport; @@ -109,18 +92,7 @@ TClientThread = class( TThread ) FThreadNo : Integer; FConsole : TThreadConsole; - - // test reporting, will be refactored out into separate class later - FTestGroup : string; - FCurrentTest : TTestGroup; - FSuccesses : Integer; - FErrors : TStringList; - FFailed : TTestGroups; - FExecuted : TTestGroups; - procedure StartTestGroup( const aGroup : string; const aTest : TTestGroup); - procedure Expect( aTestResult : Boolean; const aTestInfo : string); - procedure ReportResults; - function CalculateExitCode : Byte; + FLogger : ITestLogger; procedure ClientTest; {$IFDEF SupportsAsync} @@ -131,14 +103,13 @@ TClientThread = class( TThread ) procedure ShutdownProtocolTransportStack; function InitializeHttpTransport( const aTimeoutSetting : Integer; const aConfig : IThriftConfiguration = nil) : IHTTPClient; - procedure JSONProtocolReadWriteTest; - function PrepareBinaryData( aRandomDist : Boolean; aSize : TTestSize) : TBytes; {$IFDEF StressTest} procedure StressTest(const client : TThriftTest.Iface); {$ENDIF} - {$IFDEF Win64} - procedure UseInterlockedExchangeAdd64; - {$ENDIF} + + procedure StartTestGroup( const aGroup : string; const aTest : TClientTestGroup); inline; + procedure Expect( aTestResult : Boolean; const aTestInfo : string); inline; + function CalculateExitCode : Byte; strict protected procedure Execute; override; @@ -174,7 +145,7 @@ implementation EXITCODE_FAILBIT_CONTAINERS = $04; EXITCODE_FAILBIT_EXCEPTIONS = $08; - MAP_FAILURES_TO_EXITCODE_BITS : array[TClientThread.TTestGroup] of Byte = ( + MAP_FAILURES_TO_EXITCODE_BITS : array[TClientTestGroup] of Byte = ( EXITCODE_SUCCESS, // no bits here EXITCODE_FAILBIT_BASETYPES, EXITCODE_FAILBIT_STRUCTS, @@ -1052,260 +1023,26 @@ procedure TClientThread.StressTest(const client : TThriftTest.Iface); {$ENDIF} -function TClientThread.PrepareBinaryData( aRandomDist : Boolean; aSize : TTestSize) : TBytes; -var i : Integer; +procedure TClientThread.StartTestGroup( const aGroup : string; const aTest : TClientTestGroup); begin - case aSize of - Empty : SetLength( result, 0); - Normal : SetLength( result, $100); - ByteArrayTest : SetLength( result, SizeOf(TByteArray) + 128); - PipeWriteLimit : SetLength( result, 65535 + 128); - FifteenMB : SetLength( result, 15 * 1024 * 1024); - else - raise EArgumentException.Create('aSize'); - end; - - ASSERT( Low(result) = 0); - if Length(result) = 0 then Exit; - - // linear distribution, unless random is requested - if not aRandomDist then begin - for i := Low(result) to High(result) do begin - result[i] := i mod $100; - end; - Exit; - end; - - // random distribution of all 256 values - FillChar( result[0], Length(result) * SizeOf(result[0]), $0); - for i := Low(result) to High(result) do begin - result[i] := Byte( Random($100)); - end; -end; - - -{$IFDEF Win64} -procedure TClientThread.UseInterlockedExchangeAdd64; -var a,b : Int64; -begin - a := 1; - b := 2; - Thrift.Utils.InterlockedExchangeAdd64( a,b); - Expect( a = 3, 'InterlockedExchangeAdd64'); -end; -{$ENDIF} - - -procedure TClientThread.JSONProtocolReadWriteTest; -// Tests only then read/write procedures of the JSON protocol -// All tests succeed, if we can read what we wrote before -// Note that passing this test does not imply, that our JSON is really compatible to what -// other clients or servers expect as the real JSON. This is beyond the scope of this test. -var prot : IProtocol; - stm : TStringStream; - list : TThriftList; - config : IThriftConfiguration; - binary, binRead, emptyBinary : TBytes; - i,iErr : Integer; -const - TEST_SHORT = ShortInt( $FE); - TEST_SMALL = SmallInt( $FEDC); - TEST_LONG = LongInt( $FEDCBA98); - TEST_I64 = Int64( $FEDCBA9876543210); - TEST_DOUBLE = -1.234e-56; - DELTA_DOUBLE = TEST_DOUBLE * 1e-14; - TEST_STRING = 'abc-'#$00E4#$00f6#$00fc; // german umlauts (en-us: "funny chars") - // Test THRIFT-2336 and THRIFT-3404 with U+1D11E (G Clef symbol) and 'Русское Название'; - G_CLEF_AND_CYRILLIC_TEXT = #$1d11e' '#$0420#$0443#$0441#$0441#$043a#$043e#$0435' '#$041d#$0430#$0437#$0432#$0430#$043d#$0438#$0435; - G_CLEF_AND_CYRILLIC_JSON = '"\ud834\udd1e \u0420\u0443\u0441\u0441\u043a\u043e\u0435 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435"'; - // test both possible solidus encodings - SOLIDUS_JSON_DATA = '"one/two\/three"'; - SOLIDUS_EXCPECTED = 'one/two/three'; -begin - stm := TStringStream.Create; - try - StartTestGroup( 'JsonProtocolTest', test_Unknown); - - config := TThriftConfigurationImpl.Create; - - // prepare binary data - binary := PrepareBinaryData( FALSE, Normal); - SetLength( emptyBinary, 0); // empty binary data block - - // output setup - prot := TJSONProtocolImpl.Create( - TStreamTransportImpl.Create( - nil, TThriftStreamAdapterDelphi.Create( stm, FALSE), config)); - - // write - Init( list, TType.String_, 9); - prot.WriteListBegin( list); - prot.WriteBool( TRUE); - prot.WriteBool( FALSE); - prot.WriteByte( TEST_SHORT); - prot.WriteI16( TEST_SMALL); - prot.WriteI32( TEST_LONG); - prot.WriteI64( TEST_I64); - prot.WriteDouble( TEST_DOUBLE); - prot.WriteString( TEST_STRING); - prot.WriteBinary( binary); - prot.WriteString( ''); // empty string - prot.WriteBinary( emptyBinary); // empty binary data block - prot.WriteListEnd; - - // input setup - Expect( stm.Position = stm.Size, 'Stream position/length after write'); - stm.Position := 0; - prot := TJSONProtocolImpl.Create( - TStreamTransportImpl.Create( - TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config)); - - // read and compare - list := prot.ReadListBegin; - Expect( list.ElementType = TType.String_, 'list element type'); - Expect( list.Count = 9, 'list element count'); - Expect( prot.ReadBool, 'WriteBool/ReadBool: TRUE'); - Expect( not prot.ReadBool, 'WriteBool/ReadBool: FALSE'); - Expect( prot.ReadByte = TEST_SHORT, 'WriteByte/ReadByte'); - Expect( prot.ReadI16 = TEST_SMALL, 'WriteI16/ReadI16'); - Expect( prot.ReadI32 = TEST_LONG, 'WriteI32/ReadI32'); - Expect( prot.ReadI64 = TEST_I64, 'WriteI64/ReadI64'); - Expect( abs(prot.ReadDouble-TEST_DOUBLE) < abs(DELTA_DOUBLE), 'WriteDouble/ReadDouble'); - Expect( prot.ReadString = TEST_STRING, 'WriteString/ReadString'); - binRead := prot.ReadBinary; - Expect( Length(prot.ReadString) = 0, 'WriteString/ReadString (empty string)'); - Expect( Length(prot.ReadBinary) = 0, 'empty WriteBinary/ReadBinary (empty data block)'); - prot.ReadListEnd; - - // test binary data - Expect( Length(binary) = Length(binRead), 'Binary data length check'); - iErr := -1; - for i := Low(binary) to High(binary) do begin - if binary[i] <> binRead[i] then begin - iErr := i; - Break; - end; - end; - if iErr < 0 - then Expect( TRUE, 'Binary data check ('+IntToStr(Length(binary))+' Bytes)') - else Expect( FALSE, 'Binary data check at offset '+IntToStr(iErr)); - - Expect( stm.Position = stm.Size, 'Stream position after read'); - - - // Solidus can be encoded in two ways. Make sure we can read both - stm.Position := 0; - stm.Size := 0; - stm.WriteString(SOLIDUS_JSON_DATA); - stm.Position := 0; - prot := TJSONProtocolImpl.Create( - TStreamTransportImpl.Create( - TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config)); - Expect( prot.ReadString = SOLIDUS_EXCPECTED, 'Solidus encoding'); - - - // Widechars should work too. Do they? - // After writing, we ensure that we are able to read it back - // We can't assume hex-encoding, since (nearly) any Unicode char is valid JSON - stm.Position := 0; - stm.Size := 0; - prot := TJSONProtocolImpl.Create( - TStreamTransportImpl.Create( - nil, TThriftStreamAdapterDelphi.Create( stm, FALSE), config)); - prot.WriteString( G_CLEF_AND_CYRILLIC_TEXT); - stm.Position := 0; - prot := TJSONProtocolImpl.Create( - TStreamTransportImpl.Create( - TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config)); - Expect( prot.ReadString = G_CLEF_AND_CYRILLIC_TEXT, 'Writing JSON with chars > 8 bit'); - - // Widechars should work with hex-encoding too. Do they? - stm.Position := 0; - stm.Size := 0; - stm.WriteString( G_CLEF_AND_CYRILLIC_JSON); - stm.Position := 0; - prot := TJSONProtocolImpl.Create( - TStreamTransportImpl.Create( - TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config)); - Expect( prot.ReadString = G_CLEF_AND_CYRILLIC_TEXT, 'Reading JSON with chars > 8 bit'); - - - finally - stm.Free; - prot := nil; //-> Release - StartTestGroup( '', test_Unknown); // no more tests here - end; -end; - - -procedure TClientThread.StartTestGroup( const aGroup : string; const aTest : TTestGroup); -begin - FTestGroup := aGroup; - FCurrentTest := aTest; - - Include( FExecuted, aTest); - - if FTestGroup <> '' then begin - Console.WriteLine(''); - Console.WriteLine( aGroup+' tests'); - Console.WriteLine( StringOfChar('-',60)); - end; + FLogger.StartTestGroup( aGroup, aTest); end; procedure TClientThread.Expect( aTestResult : Boolean; const aTestInfo : string); begin - if aTestResult then begin - Inc(FSuccesses); - Console.WriteLine( aTestInfo+': passed'); - end - else begin - FErrors.Add( FTestGroup+': '+aTestInfo); - Include( FFailed, FCurrentTest); - Console.WriteLine( aTestInfo+': *** FAILED ***'); - - // We have a failed test! - // -> issue DebugBreak ONLY if a debugger is attached, - // -> unhandled DebugBreaks would cause Windows to terminate the app otherwise - if IsDebuggerPresent - then {$IFDEF CPUX64} DebugBreak {$ELSE} asm int 3 end {$ENDIF}; - end; -end; - - -procedure TClientThread.ReportResults; -var nTotal : Integer; - sLine : string; -begin - // prevent us from stupid DIV/0 errors - nTotal := FSuccesses + FErrors.Count; - if nTotal = 0 then begin - Console.WriteLine('No results logged'); - Exit; - end; - - Console.WriteLine(''); - Console.WriteLine( StringOfChar('=',60)); - Console.WriteLine( IntToStr(nTotal)+' tests performed'); - Console.WriteLine( IntToStr(FSuccesses)+' tests succeeded ('+IntToStr(round(100*FSuccesses/nTotal))+'%)'); - Console.WriteLine( IntToStr(FErrors.Count)+' tests failed ('+IntToStr(round(100*FErrors.Count/nTotal))+'%)'); - Console.WriteLine( StringOfChar('=',60)); - if FErrors.Count > 0 then begin - Console.WriteLine('FAILED TESTS:'); - for sLine in FErrors do Console.WriteLine('- '+sLine); - Console.WriteLine( StringOfChar('=',60)); - InterlockedIncrement( ExitCode); // return <> 0 on errors - end; - Console.WriteLine(''); + FLogger.Expect( aTestResult, aTestInfo); end; function TClientThread.CalculateExitCode : Byte; -var test : TTestGroup; +var test : TClientTestGroup; + failed, executed : TClientTestGroups; begin result := EXITCODE_SUCCESS; - for test := Low(TTestGroup) to High(TTestGroup) do begin - if (test in FFailed) or not (test in FExecuted) + FLogger.QueryTestStats( failed, executed); + for test := Low(TClientTestGroup) to High(TClientTestGroup) do begin + if (test in failed) or not (test in executed) then result := result or MAP_FAILURES_TO_EXITCODE_BITS[test]; end; end; @@ -1318,12 +1055,7 @@ constructor TClientThread.Create( const aSetup : TTestSetup; const aNumIteration FNumIterations := aNumIteration; FConsole := TThreadConsole.Create( Self, aLogThreadID); - FCurrentTest := test_Unknown; - - // error list: keep correct order, allow for duplicates - FErrors := TStringList.Create; - FErrors.Sorted := FALSE; - FErrors.Duplicates := dupAccept; + FLogger := TTestLoggerImpl.Create; inherited Create( TRUE); end; @@ -1331,7 +1063,7 @@ constructor TClientThread.Create( const aSetup : TTestSetup; const aNumIteration destructor TClientThread.Destroy; begin FreeAndNil( FConsole); - FreeAndNil( FErrors); + FLogger := nil; //-> Release inherited; end; @@ -1341,10 +1073,9 @@ procedure TClientThread.Execute; begin // perform all tests try - {$IFDEF Win64} - UseInterlockedExchangeAdd64; - {$ENDIF} - JSONProtocolReadWriteTest; + // builtin (quick) unit tests on one thread only + if ThreadNo = 0 + then TQuickUnitTests.Execute(FLogger); // must be run in the context of the thread InitializeProtocolTransportStack; @@ -1357,7 +1088,7 @@ procedure TClientThread.Execute; end; // report the outcome - ReportResults; + FLogger.ReportResults; SetReturnValue( CalculateExitCode); finally diff --git a/lib/delphi/test/testsuite/client/TestLogger.pas b/lib/delphi/test/testsuite/client/TestLogger.pas new file mode 100644 index 00000000000..10ddfc74c1a --- /dev/null +++ b/lib/delphi/test/testsuite/client/TestLogger.pas @@ -0,0 +1,193 @@ +(* + * 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. + *) + +unit TestLogger; + +{$I ../src/Thrift.Defines.inc} + +interface + +uses + Classes, Windows, SysUtils, Math, ActiveX, ComObj, + {$IFDEF SupportsAsync} System.Threading, {$ENDIF} + DateUtils, + Generics.Collections, + TestConstants, + ConsoleHelper, + Thrift, + Thrift.Protocol.Compact, + Thrift.Protocol.JSON, + Thrift.Protocol, + Thrift.Transport.Pipes, + Thrift.Transport.WinHTTP, + Thrift.Transport.MsxmlHTTP, + Thrift.Transport, + Thrift.Stream, + Thrift.Test, + Thrift.WinHTTP, + Thrift.Utils, + Thrift.Configuration, + Thrift.Collections; + + +type + TClientTestGroup = ( + test_Unknown, + test_BaseTypes, + test_Structs, + test_Containers, + test_Exceptions + // new values here + ); + TClientTestGroups = set of TClientTestGroup; + + + ITestLogger = interface + ['{26693ED5-1469-48AD-B1F3-04281B053DD4}'] + procedure StartTestGroup( const aGroup : string; const aTest : TClientTestGroup); + procedure Expect( aTestResult : Boolean; const aTestInfo : string); + procedure QueryTestStats( out failed, executed : TClientTestGroups); + procedure ReportResults; + end; + + + // test reporting helper + TTestLoggerImpl = class( TInterfacedObject, ITestLogger) + strict private + FTestGroup : string; + FCurrentTest : TClientTestGroup; + FSuccesses : Integer; + FErrors : TStringList; + FFailed : TClientTestGroups; + FExecuted : TClientTestGroups; + + strict protected + // ITestLogger = interface + procedure StartTestGroup( const aGroup : string; const aTest : TClientTestGroup); + procedure Expect( aTestResult : Boolean; const aTestInfo : string); + procedure QueryTestStats( out failed, executed : TClientTestGroups); + procedure ReportResults; + + public + constructor Create; + destructor Destroy; override; + + end; + + +implementation + + +constructor TTestLoggerImpl.Create; +begin + inherited Create; + FCurrentTest := test_Unknown; + + // error list: keep correct order, allow for duplicates + FErrors := TStringList.Create; + FErrors.Sorted := FALSE; + FErrors.Duplicates := dupAccept; +end; + + +destructor TTestLoggerImpl.Destroy; +begin + try + FreeAndNil( FErrors); + finally + inherited Destroy; + end; +end; + + +procedure TTestLoggerImpl.StartTestGroup( const aGroup : string; const aTest : TClientTestGroup); +begin + FTestGroup := aGroup; + FCurrentTest := aTest; + + Include( FExecuted, aTest); + + if FTestGroup <> '' then begin + Console.WriteLine(''); + Console.WriteLine( aGroup+' tests'); + Console.WriteLine( StringOfChar('-',60)); + end; +end; + + +procedure TTestLoggerImpl.Expect( aTestResult : Boolean; const aTestInfo : string); +begin + if aTestResult then begin + Inc(FSuccesses); + Console.WriteLine( aTestInfo+': passed'); + end + else begin + FErrors.Add( FTestGroup+': '+aTestInfo); + Include( FFailed, FCurrentTest); + Console.WriteLine( aTestInfo+': *** FAILED ***'); + + // We have a failed test! + // -> issue DebugBreak ONLY if a debugger is attached, + // -> unhandled DebugBreaks would cause Windows to terminate the app otherwise + if IsDebuggerPresent + then {$IFDEF CPUX64} DebugBreak {$ELSE} asm int 3 end {$ENDIF}; + end; +end; + + +procedure TTestLoggerImpl.QueryTestStats( out failed, executed : TClientTestGroups); +begin + failed := FFailed; + executed := FExecuted; +end; + + + +procedure TTestLoggerImpl.ReportResults; +var nTotal : Integer; + sLine : string; +begin + // prevent us from stupid DIV/0 errors + nTotal := FSuccesses + FErrors.Count; + if nTotal = 0 then begin + Console.WriteLine('No results logged'); + Exit; + end; + + Console.WriteLine(''); + Console.WriteLine( StringOfChar('=',60)); + Console.WriteLine( IntToStr(nTotal)+' tests performed'); + Console.WriteLine( IntToStr(FSuccesses)+' tests succeeded ('+IntToStr(round(100*FSuccesses/nTotal))+'%)'); + Console.WriteLine( IntToStr(FErrors.Count)+' tests failed ('+IntToStr(round(100*FErrors.Count/nTotal))+'%)'); + Console.WriteLine( StringOfChar('=',60)); + if FErrors.Count > 0 then begin + Console.WriteLine('FAILED TESTS:'); + for sLine in FErrors do Console.WriteLine('- '+sLine); + Console.WriteLine( StringOfChar('=',60)); + InterlockedIncrement( ExitCode); // return <> 0 on errors + end; + Console.WriteLine(''); +end; + + + + + + +end. diff --git a/lib/delphi/test/testsuite/client/UnitTests.pas b/lib/delphi/test/testsuite/client/UnitTests.pas new file mode 100644 index 00000000000..3726c873594 --- /dev/null +++ b/lib/delphi/test/testsuite/client/UnitTests.pas @@ -0,0 +1,350 @@ +(* + * 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. + *) + +unit UnitTests; + +{$I ../src/Thrift.Defines.inc} + +interface + +uses + Classes, Windows, SysUtils, Math, ActiveX, ComObj, + {$IFDEF SupportsAsync} System.Threading, {$ENDIF} + DateUtils, + Generics.Collections, + TestConstants, + TestLogger, + ConsoleHelper, + Thrift, + Thrift.Protocol.Compact, + Thrift.Protocol.JSON, + Thrift.Protocol, + Thrift.Transport.Pipes, + Thrift.Transport.WinHTTP, + Thrift.Transport.MsxmlHTTP, + Thrift.Transport, + Thrift.Stream, + Thrift.Test, + Thrift.WinHTTP, + Thrift.Utils, + Thrift.Configuration, + Thrift.Collections; + +type + TQuickUnitTests = class sealed + strict private + FLogger : ITestLogger; + + strict protected + // Helper + procedure StartTestGroup( const aGroup : string; const aTest : TClientTestGroup); inline; + procedure Expect( aTestResult : Boolean; const aTestInfo : string); inline; + + // Test impl + procedure JSONProtocolReadWriteTest; + procedure HashSetTest; + {$IFDEF Win64} + procedure UseInterlockedExchangeAdd64; + {$ENDIF} + + // main execution part + constructor Create( const logger : ITestLogger); reintroduce; + procedure Execute; overload; + public + destructor Destroy; override; + + class procedure Execute( const logger : ITestLogger); overload; static; + end; + + +implementation + + +constructor TQuickUnitTests.Create( const logger : ITestLogger); +begin + inherited Create; + FLogger := logger; +end; + + +destructor TQuickUnitTests.Destroy; +begin + try + FLogger := nil; //-> Release + finally + inherited Destroy; + end; +end; + + +class procedure TQuickUnitTests.Execute( const logger : ITestLogger); +var instance : TQuickUnitTests; +begin + instance := TQuickUnitTests.Create(logger); + try + instance.Execute; + finally + instance.Free; + end; +end; + + +procedure TQuickUnitTests.Execute; +begin + {$IFDEF Win64} + UseInterlockedExchangeAdd64; + {$ENDIF} + + JSONProtocolReadWriteTest; + HashSetTest; +end; + + +procedure TQuickUnitTests.StartTestGroup( const aGroup : string; const aTest : TClientTestGroup); +begin + FLogger.StartTestGroup( aGroup, aTest); +end; + + +procedure TQuickUnitTests.Expect( aTestResult : Boolean; const aTestInfo : string); +begin + FLogger.Expect( aTestResult, aTestInfo); +end; + + +{$IFDEF Win64} +procedure TQuickUnitTests.UseInterlockedExchangeAdd64; +var a,b : Int64; +begin + a := 1; + b := 2; + Thrift.Utils.InterlockedExchangeAdd64( a,b); + Expect( a = 3, 'InterlockedExchangeAdd64'); +end; +{$ENDIF} + + +procedure TQuickUnitTests.JSONProtocolReadWriteTest; +// Tests only then read/write procedures of the JSON protocol +// All tests succeed, if we can read what we wrote before +// Note that passing this test does not imply, that our JSON is really compatible to what +// other clients or servers expect as the real JSON. This is beyond the scope of this test. +var prot : IProtocol; + stm : TStringStream; + list : TThriftList; + config : IThriftConfiguration; + binary, binRead, emptyBinary : TBytes; + i,iErr : Integer; +const + TEST_SHORT = ShortInt( $FE); + TEST_SMALL = SmallInt( $FEDC); + TEST_LONG = LongInt( $FEDCBA98); + TEST_I64 = Int64( $FEDCBA9876543210); + TEST_DOUBLE = -1.234e-56; + DELTA_DOUBLE = TEST_DOUBLE * 1e-14; + TEST_STRING = 'abc-'#$00E4#$00f6#$00fc; // german umlauts (en-us: "funny chars") + // Test THRIFT-2336 and THRIFT-3404 with U+1D11E (G Clef symbol) and 'Русское Название'; + G_CLEF_AND_CYRILLIC_TEXT = #$1d11e' '#$0420#$0443#$0441#$0441#$043a#$043e#$0435' '#$041d#$0430#$0437#$0432#$0430#$043d#$0438#$0435; + G_CLEF_AND_CYRILLIC_JSON = '"\ud834\udd1e \u0420\u0443\u0441\u0441\u043a\u043e\u0435 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435"'; + // test both possible solidus encodings + SOLIDUS_JSON_DATA = '"one/two\/three"'; + SOLIDUS_EXCPECTED = 'one/two/three'; +begin + stm := TStringStream.Create; + try + FLogger.StartTestGroup( 'JsonProtocolTest', test_Unknown); + + config := TThriftConfigurationImpl.Create; + + // prepare binary data + binary := PrepareBinaryData( FALSE, TTestSize.Normal); + SetLength( emptyBinary, 0); // empty binary data block + + // output setup + prot := TJSONProtocolImpl.Create( + TStreamTransportImpl.Create( + nil, TThriftStreamAdapterDelphi.Create( stm, FALSE), config)); + + // write + Init( list, TType.String_, 9); + prot.WriteListBegin( list); + prot.WriteBool( TRUE); + prot.WriteBool( FALSE); + prot.WriteByte( TEST_SHORT); + prot.WriteI16( TEST_SMALL); + prot.WriteI32( TEST_LONG); + prot.WriteI64( TEST_I64); + prot.WriteDouble( TEST_DOUBLE); + prot.WriteString( TEST_STRING); + prot.WriteBinary( binary); + prot.WriteString( ''); // empty string + prot.WriteBinary( emptyBinary); // empty binary data block + prot.WriteListEnd; + + // input setup + Expect( stm.Position = stm.Size, 'Stream position/length after write'); + stm.Position := 0; + prot := TJSONProtocolImpl.Create( + TStreamTransportImpl.Create( + TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config)); + + // read and compare + list := prot.ReadListBegin; + Expect( list.ElementType = TType.String_, 'list element type'); + Expect( list.Count = 9, 'list element count'); + Expect( prot.ReadBool, 'WriteBool/ReadBool: TRUE'); + Expect( not prot.ReadBool, 'WriteBool/ReadBool: FALSE'); + Expect( prot.ReadByte = TEST_SHORT, 'WriteByte/ReadByte'); + Expect( prot.ReadI16 = TEST_SMALL, 'WriteI16/ReadI16'); + Expect( prot.ReadI32 = TEST_LONG, 'WriteI32/ReadI32'); + Expect( prot.ReadI64 = TEST_I64, 'WriteI64/ReadI64'); + Expect( abs(prot.ReadDouble-TEST_DOUBLE) < abs(DELTA_DOUBLE), 'WriteDouble/ReadDouble'); + Expect( prot.ReadString = TEST_STRING, 'WriteString/ReadString'); + binRead := prot.ReadBinary; + Expect( Length(prot.ReadString) = 0, 'WriteString/ReadString (empty string)'); + Expect( Length(prot.ReadBinary) = 0, 'empty WriteBinary/ReadBinary (empty data block)'); + prot.ReadListEnd; + + // test binary data + Expect( Length(binary) = Length(binRead), 'Binary data length check'); + iErr := -1; + for i := Low(binary) to High(binary) do begin + if binary[i] <> binRead[i] then begin + iErr := i; + Break; + end; + end; + if iErr < 0 + then Expect( TRUE, 'Binary data check ('+IntToStr(Length(binary))+' Bytes)') + else Expect( FALSE, 'Binary data check at offset '+IntToStr(iErr)); + + Expect( stm.Position = stm.Size, 'Stream position after read'); + + + // Solidus can be encoded in two ways. Make sure we can read both + stm.Position := 0; + stm.Size := 0; + stm.WriteString(SOLIDUS_JSON_DATA); + stm.Position := 0; + prot := TJSONProtocolImpl.Create( + TStreamTransportImpl.Create( + TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config)); + Expect( prot.ReadString = SOLIDUS_EXCPECTED, 'Solidus encoding'); + + + // Widechars should work too. Do they? + // After writing, we ensure that we are able to read it back + // We can't assume hex-encoding, since (nearly) any Unicode char is valid JSON + stm.Position := 0; + stm.Size := 0; + prot := TJSONProtocolImpl.Create( + TStreamTransportImpl.Create( + nil, TThriftStreamAdapterDelphi.Create( stm, FALSE), config)); + prot.WriteString( G_CLEF_AND_CYRILLIC_TEXT); + stm.Position := 0; + prot := TJSONProtocolImpl.Create( + TStreamTransportImpl.Create( + TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config)); + FLogger.Expect( prot.ReadString = G_CLEF_AND_CYRILLIC_TEXT, 'Writing JSON with chars > 8 bit'); + + // Widechars should work with hex-encoding too. Do they? + stm.Position := 0; + stm.Size := 0; + stm.WriteString( G_CLEF_AND_CYRILLIC_JSON); + stm.Position := 0; + prot := TJSONProtocolImpl.Create( + TStreamTransportImpl.Create( + TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config)); + FLogger.Expect( prot.ReadString = G_CLEF_AND_CYRILLIC_TEXT, 'Reading JSON with chars > 8 bit'); + + + finally + stm.Free; + prot := nil; //-> Release + FLogger.StartTestGroup( '', test_Unknown); // no more tests here + end; +end; + + +procedure TQuickUnitTests.HashSetTest; +var container : IThriftHashSet; + testdata : array of Integer; + i : Integer; +const + TEST_COUNT = 4096; +begin + StartTestGroup( 'IThriftHashSet implementation', test_Containers); + + // prepare test data + SetLength( testdata, 5); + testdata[0] := -2; + testdata[1] := 0; + testdata[2] := 42; + testdata[3] := MaxInt; + testdata[4] := Low(Integer); + + // first insert + container := TThriftHashSetImpl.Create; + for i in testdata do begin + Expect( container.Add( i), 'add first '+IntToStr(i)); + Expect( container.Contains( i), 'contains '+IntToStr(i)); + end; + Expect( container.Count = Length(testdata), 'container size'); + + // insert again + for i in testdata do begin + Expect( not container.Add( i), 'add second '+IntToStr(i)); + Expect( container.Contains( i), 'contains '+IntToStr(i)); + end; + Expect( container.Count = Length(testdata), 'container size'); + + // remove + for i in testdata do begin + Expect( container.Remove( i), 'first remove '+IntToStr(i)); + Expect( not container.Contains( i), 'not contains '+IntToStr(i)); + end; + Expect( container.Count = 0, 'container size'); + + // remove again + for i in testdata do begin + Expect( not container.Remove( i), 'second remove '+IntToStr(i)); + Expect( not container.Contains( i), 'not contains '+IntToStr(i)); + end; + Expect( container.Count = 0, 'container size'); + + // append and clear + for i := 0 to TEST_COUNT-1 do begin + container.Add(-i); + container.Add(+i); + end; + Expect( container.Count = 2*TEST_COUNT-1, 'container size check'); + Expect( not container.Contains( -TEST_COUNT), 'element not contained'); + Expect( not container.Contains( TEST_COUNT), 'element not contained'); + container.Clear; + Expect( container.Count = 0, 'count=0 after clear'); +end; + + + + + + + + +end. diff --git a/lib/delphi/test/TestServer.pas b/lib/delphi/test/testsuite/server/TestServer.pas similarity index 100% rename from lib/delphi/test/TestServer.pas rename to lib/delphi/test/testsuite/server/TestServer.pas diff --git a/lib/delphi/test/TestServerEvents.pas b/lib/delphi/test/testsuite/server/TestServerEvents.pas similarity index 100% rename from lib/delphi/test/TestServerEvents.pas rename to lib/delphi/test/testsuite/server/TestServerEvents.pas From 9c0bdcb5197f1ebc5b404313f2ee7edd865a5a47 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sat, 25 May 2024 08:58:48 +0200 Subject: [PATCH 068/430] THRIFT-5788 Refactor and streamline hash set implementation Client: delphi Patch: Jens Geyer Follow-up: fix memory leak --- lib/delphi/src/Thrift.Collections.pas | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/delphi/src/Thrift.Collections.pas b/lib/delphi/src/Thrift.Collections.pas index c0fe3231946..0500d4936a2 100644 --- a/lib/delphi/src/Thrift.Collections.pas +++ b/lib/delphi/src/Thrift.Collections.pas @@ -224,6 +224,7 @@ TThriftHashSetImpl = class( TInterfacedObject, IHashSet, IThriftHashSet< public constructor Create( const aCapacity: Integer = 0); overload; constructor Create( const aCapacity: Integer; const aComparer : IEqualityComparer); overload; + destructor Destroy; override; function ToString : string; override; end; @@ -263,6 +264,14 @@ constructor TThriftHashSetImpl.Create( const aCapacity: Integer; const aCompa FDictionary := TDictionary.Create( aCapacity, aComparer); end; + +destructor TThriftHashSetImpl.Destroy; +begin + FDictionary.Free; + inherited Destroy; +end; + + function TThriftHashSetImpl.GetCount: Integer; begin Result := FDictionary.Count; From 9673a68f93715d0efb7a91d32005cc78a477398e Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Thu, 16 May 2024 17:16:22 -0700 Subject: [PATCH 069/430] THRIFT-5786: Full deprecation support in go Client: go This should got most of them. Also fixed an indentation bug from 4930ca. --- .../cpp/src/thrift/generate/t_go_generator.cc | 61 +++++++++++++++++-- .../cpp/src/thrift/generate/t_go_generator.h | 2 + 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc index c135d64edc2..65574dd0a40 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc @@ -768,9 +768,11 @@ void t_go_generator::generate_typedef(t_typedef* ttypedef) { return; } + generate_deprecation_comment(f_types_, ttypedef->annotations_); f_types_ << "type " << new_type_name << " " << base_type << '\n' << '\n'; // Generate a convenience function that converts an instance of a type // (which may be a constant) into a pointer to an instance of a type. + generate_deprecation_comment(f_types_, ttypedef->annotations_); f_types_ << "func " << new_type_name << "Ptr(v " << new_type_name << ") *" << new_type_name << " { return &v }" << '\n' << '\n'; } @@ -785,13 +787,15 @@ void t_go_generator::generate_enum(t_enum* tenum) { std::ostringstream to_string_mapping, from_string_mapping; std::string tenum_name(publicize(tenum->get_name())); generate_go_docstring(f_types_, tenum); - f_types_ << '\n' << "type " << tenum_name << " int64" << '\n' << "const (" << '\n'; + generate_deprecation_comment(f_types_, tenum->annotations_); + f_types_ << "type " << tenum_name << " int64" << '\n' << "const (" << '\n'; to_string_mapping << indent() << "func (p " << tenum_name << ") String() string {" << '\n'; indent_up(); to_string_mapping << indent() << "switch p {" << '\n'; indent_down(); + generate_deprecation_comment(from_string_mapping, tenum->annotations_); from_string_mapping << indent() << "func " << tenum_name << "FromString(s string) (" << tenum_name << ", error) {" << '\n'; indent_up(); @@ -808,6 +812,7 @@ void t_go_generator::generate_enum(t_enum* tenum) { string iter_std_name(escape_string((*c_iter)->get_name())); string iter_name((*c_iter)->get_name()); + generate_deprecation_comment(f_types_, (*c_iter)->annotations_); f_types_ << indent() << tenum_name << "_" << iter_name << ' ' << tenum_name << " = " << value << '\n'; // Dictionaries to/from string names of enums @@ -841,6 +846,7 @@ void t_go_generator::generate_enum(t_enum* tenum) { // Generate a convenience function that converts an instance of an enum // (which may be a constant) into a pointer to an instance of that enum // type. + generate_deprecation_comment(f_types_, tenum->annotations_); f_types_ << "func " << tenum_name << "Ptr(v " << tenum_name << ") *" << tenum_name << " { return &v }" << '\n' << '\n'; @@ -889,7 +895,7 @@ void t_go_generator::generate_enum(t_enum* tenum) { f_types_ << indent() << "}" << '\n'; f_types_ << indent() << "return int64(*p), nil" << '\n'; indent_down(); - f_types_ << "}" << '\n'; + f_types_ << "}" << '\n' << '\n'; } @@ -1187,7 +1193,7 @@ void t_go_generator::generate_go_struct(t_struct* tstruct, bool is_exception) { go_validator_generator(this).generate_struct_validator(f_types_, tstruct); f_types_ << indent() << "return nil" << '\n'; indent_down(); - f_types_ << "}" << '\n'; + f_types_ << "}" << '\n' << '\n'; } void t_go_generator::get_publicized_name_and_def_value(t_field* tfield, @@ -1235,6 +1241,7 @@ void t_go_generator::generate_go_struct_definition(ostream& out, std::string tstruct_name(publicize(tstruct->get_name(), is_args || is_result)); generate_go_docstring(out, tstruct); + generate_deprecation_comment(out, tstruct->annotations_); out << indent() << "type " << tstruct_name << " struct {" << '\n'; /* Here we generate the structure specification for the fastbinary codec. @@ -1314,6 +1321,7 @@ void t_go_generator::generate_go_struct_definition(ostream& out, // Trailing whitespace gotag.resize(gotag.size()-1); + generate_deprecation_comment(out, (*m_iter)->annotations_); indent(out) << publicize((*m_iter)->get_name()) << " " << goType << " `thrift:\"" << escape_string((*m_iter)->get_name()) << "," << sorted_keys_pos; if ((*m_iter)->get_req() == t_field::T_REQUIRED) { @@ -1325,6 +1333,7 @@ void t_go_generator::generate_go_struct_definition(ostream& out, } } else { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + generate_deprecation_comment(out, (*m_iter)->annotations_); // This fills in default values, as opposed to nulls out << indent() << publicize((*m_iter)->get_name()) << " " << type_to_go_type((*m_iter)->get_type()) << '\n'; @@ -1333,6 +1342,7 @@ void t_go_generator::generate_go_struct_definition(ostream& out, indent_down(); out << indent() << "}" << '\n' << '\n'; + generate_deprecation_comment(out, tstruct->annotations_); out << indent() << "func New" << tstruct_name << "() *" << tstruct_name << " {" << '\n'; indent_up(); out << indent() << "return &"; @@ -1348,6 +1358,7 @@ void t_go_generator::generate_go_struct_definition(ostream& out, string goType = type_to_go_type_with_opt(fieldType, false); string def_var_name = tstruct_name + "_" + publicized_name + "_DEFAULT"; if ((*m_iter)->get_req() == t_field::T_OPTIONAL || is_pointer_field(*m_iter)) { + generate_deprecation_comment(out, (*m_iter)->annotations_); out << indent() << "var " << def_var_name << " " << goType; if (def_value != nullptr) { out << " = " << render_const_value(fieldType, def_value, (*m_iter)->get_name()); @@ -1366,6 +1377,7 @@ void t_go_generator::generate_go_struct_definition(ostream& out, if (is_pointer_field(*m_iter)) { string goOptType = type_to_go_type_with_opt(fieldType, true); string maybepointer = goOptType != goType ? "*" : ""; + generate_deprecation_comment(out, (*m_iter)->annotations_); out << indent() << "func (p *" << tstruct_name << ") Get" << publicized_name << "() " << goType << " {" << '\n'; indent_up(); @@ -1376,15 +1388,16 @@ void t_go_generator::generate_go_struct_definition(ostream& out, out << indent() << "}" << '\n'; out << indent() << "return " << maybepointer << "p." << publicized_name << '\n'; indent_down(); - out << indent() << "}" << '\n'; + out << indent() << "}" << '\n' << '\n'; } else { out << '\n'; + generate_deprecation_comment(out, (*m_iter)->annotations_); out << indent() << "func (p *" << tstruct_name << ") Get" << publicized_name << "() " << goType << " {" << '\n'; indent_up(); out << indent() << "return p." << publicized_name << '\n'; indent_down(); - out << indent() << "}" << '\n'; + out << indent() << "}" << '\n' << '\n'; } } @@ -1468,6 +1481,7 @@ void t_go_generator::generate_isset_helpers(ostream& out, for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { const string field_name(publicize(escape_string((*f_iter)->get_name()))); if ((*f_iter)->get_req() == t_field::T_OPTIONAL || is_pointer_field(*f_iter)) { + generate_deprecation_comment(out, (*f_iter)->annotations_); out << indent() << "func (p *" << tstruct_name << ") IsSet" << field_name << "() bool {" << '\n'; indent_up(); @@ -1981,6 +1995,7 @@ void t_go_generator::generate_service_interface(t_service* tservice) { indent_down(); } + generate_deprecation_comment(f_types_, tservice->annotations_); f_types_ << indent() << "type " << interfaceName << " interface {" << extends_if; indent_up(); generate_go_docstring(f_types_, tservice); @@ -1992,6 +2007,7 @@ void t_go_generator::generate_service_interface(t_service* tservice) { for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_go_docstring(f_types_, (*f_iter)); + generate_deprecation_comment(f_types_, (*f_iter)->annotations_); f_types_ << indent() << function_signature_if(*f_iter, "", true) << '\n'; } } @@ -2030,6 +2046,7 @@ void t_go_generator::generate_service_client(t_service* tservice) { extends_field = extends_client.substr(extends_client.find(".") + 1); generate_go_docstring(f_types_, tservice); + generate_deprecation_comment(f_types_, tservice->annotations_); f_types_ << indent() << "type " << serviceName << "Client struct {" << '\n'; indent_up(); @@ -2044,6 +2061,7 @@ void t_go_generator::generate_service_client(t_service* tservice) { f_types_ << indent() << "}" << '\n' << '\n'; // Legacy constructor function + generate_deprecation_comment(f_types_, tservice->annotations_); f_types_ << indent() << "func New" << serviceName << "ClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *" << serviceName << "Client {" << '\n'; @@ -2063,6 +2081,7 @@ void t_go_generator::generate_service_client(t_service* tservice) { indent_down(); f_types_ << indent() << "}" << '\n' << '\n'; // Legacy constructor function with custom input & output protocols + generate_deprecation_comment(f_types_, tservice->annotations_); f_types_ << indent() << "func New" << serviceName << "ClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *" @@ -2085,6 +2104,7 @@ void t_go_generator::generate_service_client(t_service* tservice) { f_types_ << indent() << "}" << '\n' << '\n'; // Constructor function + generate_deprecation_comment(f_types_, tservice->annotations_); f_types_ << indent() << "func New" << serviceName << "Client(c thrift.TClient) *" << serviceName << "Client {" << '\n'; indent_up(); @@ -2133,6 +2153,7 @@ void t_go_generator::generate_service_client(t_service* tservice) { string funname = publicize((*f_iter)->get_name()); // Open function generate_go_docstring(f_types_, (*f_iter)); + generate_deprecation_comment(f_types_, (*f_iter)->annotations_); f_types_ << indent() << "func (p *" << serviceName << "Client) " << function_signature_if(*f_iter, "", true) << " {" << '\n'; indent_up(); @@ -2475,6 +2496,7 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "case \"simplejson\":" << '\n'; indent_up(); f_remote << indent() << "protocolFactory = thrift.NewTSimpleJSONProtocolFactoryConf(cfg)" << '\n'; + indent_down(); f_remote << indent() << "case \"json\":" << '\n'; indent_up(); f_remote << indent() << "protocolFactory = thrift.NewTJSONProtocolFactory()" << '\n'; @@ -2831,6 +2853,7 @@ void t_go_generator::generate_service_server(t_service* tservice) { string self(tmp("self")); if (extends_processor.empty()) { + generate_deprecation_comment(f_types_, tservice->annotations_); f_types_ << indent() << "type " << serviceName << "Processor struct {" << '\n'; indent_up(); f_types_ << indent() << "processorMap map[string]thrift.TProcessorFunction" << '\n'; @@ -2858,6 +2881,7 @@ void t_go_generator::generate_service_server(t_service* tservice) { f_types_ << indent() << "return p.processorMap" << '\n'; indent_down(); f_types_ << indent() << "}" << '\n' << '\n'; + generate_deprecation_comment(f_types_, tservice->annotations_); f_types_ << indent() << "func New" << serviceName << "Processor(handler " << serviceName << ") *" << serviceName << "Processor {" << '\n' << '\n'; indent_up(); @@ -3905,6 +3929,7 @@ void t_go_generator::generate_go_docstring(ostream& out, ss << '\n'; } } + ss << '\n'; } if (has_doc) { @@ -4286,6 +4311,32 @@ void t_go_generator::parse_go_tags(map* tags, const string in) { } } +void t_go_generator::generate_deprecation_comment(ostream& out, const map>& annotations) { + auto iter = annotations.find("deprecated"); + if (annotations.end() != iter) { + out << indent() << "// Deprecated: "; + + bool first = true; + for (auto str_iter = iter->second.begin(); str_iter != iter->second.end(); ++str_iter) { + if (*str_iter == "1") { + // Empty annotations will generate "1", skip those. + continue; + } + if (first) { + first = false; + } else { + out << "; "; + } + out << *str_iter; + } + if (first) { + // All deprecation annotations are empty, put a generic reason here + out << "(no reason given)"; + } + out << '\n'; + } +} + bool format_go_output(const string& file_path) { // formatting via gofmt deactivated due to THRIFT-3893 diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.h b/compiler/cpp/src/thrift/generate/t_go_generator.h index 1efa32daa33..d84b18686f1 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.h +++ b/compiler/cpp/src/thrift/generate/t_go_generator.h @@ -266,6 +266,8 @@ class t_go_generator : public t_generator { std::string type_to_go_key_type(t_type* ttype); std::string type_to_spec_args(t_type* ttype); + void generate_deprecation_comment(std::ostream& os, const std::map>& annotations); + void indent_up() { t_generator::indent_up(); } void indent_down() { t_generator::indent_down(); } std::string indent() { return t_generator::indent(); } From 405fc72a60ca24102cd04e1a46d6ab0ddad5919f Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 4 Jun 2024 22:21:39 +0200 Subject: [PATCH 070/430] fix: TProtocol::skip fix parameter type Client: php Patch: Ilya Urvachev & Volodymyr Panivko This closes #2983 --- lib/php/lib/Protocol/TProtocol.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/php/lib/Protocol/TProtocol.php b/lib/php/lib/Protocol/TProtocol.php index f7b581f7bef..0de2cf5d42a 100644 --- a/lib/php/lib/Protocol/TProtocol.php +++ b/lib/php/lib/Protocol/TProtocol.php @@ -181,7 +181,7 @@ abstract public function readString(&$str); * The skip function is a utility to parse over unrecognized date without * causing corruption. * - * @param TType $type What type is it + * @param int $type What type is it (defined in TType::class) */ public function skip($type) { From 5c580072dadb43c52c3e7a32ea12c78228de3ef1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 06:57:34 +0000 Subject: [PATCH 071/430] Bump org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 in /lib/kotlin Bumps [org.jetbrains.kotlinx:kotlinx-coroutines-jdk8](https://github.com/Kotlin/kotlinx.coroutines) from 1.8.0 to 1.8.1. - [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases) - [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md) - [Commits](https://github.com/Kotlin/kotlinx.coroutines/compare/1.8.0...1.8.1) --- updated-dependencies: - dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lib/kotlin/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/kotlin/build.gradle.kts b/lib/kotlin/build.gradle.kts index 94d39b9bdf0..6b1c7c98618 100644 --- a/lib/kotlin/build.gradle.kts +++ b/lib/kotlin/build.gradle.kts @@ -29,7 +29,7 @@ repositories { dependencies { implementation(platform("org.jetbrains.kotlin:kotlin-bom")) implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.8.0") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.8.1") implementation("org.apache.thrift:libthrift:INCLUDED") testImplementation(kotlin("test")) } From 2bbaaa8714d729187d1542f225fe1027ecffac6c Mon Sep 17 00:00:00 2001 From: Alkis Evlogimenos Date: Mon, 27 May 2024 16:16:02 +0000 Subject: [PATCH 072/430] Update compact-protocol docs This updates the compact protocol documentation to simplify the explanation of Zigzag and ULEB128 encoding, along with links to wikipedia. In addition it uses varing instead of var int since the former is more common. --- doc/specs/thrift-compact-protocol.md | 72 +++++++++++++--------------- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/doc/specs/thrift-compact-protocol.md b/doc/specs/thrift-compact-protocol.md index a31a2d329c0..95145b769fe 100644 --- a/doc/specs/thrift-compact-protocol.md +++ b/doc/specs/thrift-compact-protocol.md @@ -48,43 +48,38 @@ For background on Thrift see the [Thrift whitepaper (pdf)](https://thrift.apache ### Integer encoding -The _compact protocol_ uses multiple encodings for ints: the _zigzag int_, and the _var int_. +The _compact protocol_ uses [ZigZag](https://en.wikipedia.org/wiki/Variable-length_quantity#Zigzag_encoding)'ed +varint (aka [ULEB128](https://en.wikipedia.org/wiki/LEB128)) encoding. -Values of type `int32` and `int64` are first transformed to a *zigzag int*. A zigzag int folds positive and negative -numbers into the positive number space. When we read 0, 1, 2, 3, 4 or 5 from the wire, this is translated to 0, -1, 1, --2 or 2 respectively. Here are the (Scala) formulas to convert from int32/int64 to a zigzag int and back: +Values of type `int8` are encoded as one byte, rest are converted to `int64`, Zigzag'ed then encoded as varint. +Zigzag encoding maps signed integers to another domain, one where the sign bit is encoded in the least significant +bit (LSB). For example 0 maps to 0, -1 to 1, 1 to 2, -2 to 3, etc. Hence the term zigzag. Mapping the sign bit to +the LSB is important for compactness when the absolute value of the value is small, as ULEB encoding is more +efficient for small values. Here are the (Scala) formulas to convert from `int64` to a zigzag `int64` and back: ```scala -def intToZigZag(n: Int): Int = (n << 1) ^ (n >> 31) -def zigzagToInt(n: Int): Int = (n >>> 1) ^ - (n & 1) -def longToZigZag(n: Long): Long = (n << 1) ^ (n >> 63) -def zigzagToLong(n: Long): Long = (n >>> 1) ^ - (n & 1) +def ToZigzag(n: Long): Long = (n << 1) ^ (n >> 63) +def FromZigzag(n: Long): Long = (n >>> 1) ^ - (n & 1) ``` -The zigzag int is then encoded as a *var int*, also known as *Unsigned LEB128*. Var ints take 1 to 5 bytes (int32) or -1 to 10 bytes (int64). The process consists in taking a Big Endian unsigned integer, left-padding the bit-string to -make it a multiple of 7 bits, splitting it into 7-bit groups, prefixing the most-significant 7-bit group with the 0 -bit, prefixing the remaining 7-bit groups with the 1 bit and encoding the resulting bit-string in Little Endian. +A ULEB128 is encoded 7-bits at a time, starting from the LSB. Each 7-bits are encoded as 8-bits with the top bit set +if this is not the last byte, unset otherwise. For example, the integer 50399 is encoded as follows: ``` -50399 = 1100 0100 1101 1111 (Big Endian representation) - = 00000 1100 0100 1101 1111 (Left-padding) - = 0000011 0001001 1011111 (7-bit groups) - = 00000011 10001001 11011111 (Most-significant bit prefixes) - = 11011111 10001001 00000011 (Little Endian representation) - = 0xDF 0x89 0x03 +50399 = 11000100 11011111 (LSB) + = 0000011 0001001 1011111 (7-bit groups) + = 00000011 10001001 11011111 (add continuation bits) + = 0x03 0x89 0xDF (hex) +→ 0xDF 0x89 0x03 (write to ram LSB first) ``` -Var ints are sometimes used directly inside the compact protocol to represent positive numbers. - -To encode an `int16` as zigzag int, it is first converted to an `int32` and then encoded as such. The type `int8` simply -uses a single byte as in the binary protocol. +Varints are sometimes used directly inside the compact protocol to represent positive numbers. ### Enum encoding -The generated code encodes `Enum`s by taking the ordinal value and then encoding that as an int32. +The generated code encodes `Enum`s by taking the ordinal value and then encoding that as an `int32`. ### Binary encoding @@ -99,36 +94,33 @@ Binary protocol, binary data, 1+ bytes: Where: -* `byte length` is the length of the byte array, using var int encoding (must be >= 0). +* `byte length` is the length of the byte array, using varint encoding (must be >= 0). * `bytes` are the bytes of the byte array. ### String encoding -*String*s are first encoded to UTF-8, and then send as binary. They do not -include a NUL delimiter. +*String*s are first encoded to UTF-8, and then send as binary. They do not include a NUL delimiter. ### Double encoding -Values of type `double` are first converted to an int64 according to the IEEE 754 floating-point "double format" bit -layout. Most run-times provide a library to make this conversion. But while the binary protocol encodes the int64 -in 8 bytes in big endian order, the compact protocol encodes it in little endian order - this is due to an early -implementation bug that finally became the de-facto standard. +Values of type `double` are first converted to an `int64` according to the IEEE 754 floating-point "double format" +bit layout. Most run-times provide a library to make this conversion. But while the binary protocol encodes the +`int64` in 8 bytes in big endian order, the compact protocol encodes it in little endian order - this is due to an +early implementation bug that finally became the de-facto standard. ### Boolean encoding Booleans are encoded differently depending on whether it is a field value (in a struct) or an element value (in a set, -list or map). Field values are encoded directly in the field header. Element values of type `bool` are sent as an int8; -true as `1` and false as `0`. +list or map). Field values are encoded directly in the field header. Element values of type `bool` are sent as an +`int8`; true as `1` and false as `0`. ### Universal unique identifier encoding -Values of `uuid` type are expected as 16-byte binary in big endian (or "network") order. Byte order conversion -might be necessary on certain platforms, e.g. Windows holds GUIDs in a complex record-like structure whose -memory layout differs. +Values of `uuid` type are expected as 16-byte binary in big endian order. Byte order conversion might be necessary on +certain platforms, e.g. Windows holds GUIDs in a complex record-like structure whose memory layout differs. *Note*: Since the length is fixed, no `byte length` prefix is necessary and the field is always 16 bytes long. - ## Message A `Message` on the wire looks as follows: @@ -145,8 +137,8 @@ Where: * `pppppppp` is the protocol id, fixed to `1000 0010`, 0x82. * `mmm` is the message type, an unsigned 3 bit integer. * `vvvvv` is the version, an unsigned 5 bit integer, fixed to `00001`. -* `seq id` is the sequence id, a signed 32 bit integer encoded as a var int. -* `name length` is the byte length of the name field, a signed 32 bit integer encoded as a var int (must be >= 0). +* `seq id` is the sequence id, a signed 32 bit integer encoded as a varint. +* `name length` is the byte length of the name field, a signed 32 bit integer encoded as a varint (must be >= 0). * `name` is the method name to invoke, a UTF-8 encoded string. Message types are encoded with the following values: @@ -204,7 +196,7 @@ Where: * `dddd` is the field id delta, an unsigned 4 bits integer, strictly positive. * `tttt` is field-type id, an unsigned 4 bit integer. -* `field id` the field id, a signed 16 bit integer encoded as zigzag int. +* `field id` the field id, a varint (int16). Max field id is 32767. * `field-value` the encoded field value. The field id delta can be computed by `current-field-id - previous-field-id`, or just `current-field-id` if this is the @@ -250,7 +242,7 @@ Where: * `ssss` is the size, 4 bit unsigned int, values `0` - `14` * `tttt` is the element-type, a 4 bit unsigned int -* `size` is the size, a var int (int32), positive values `15` or higher +* `size` is the size, a varint (int32), positive values `15` or higher * `elements` are the encoded elements The short form should be used when the length is in the range 0 - 14 (inclusive). From 173714b0a9a310c41e2e1e6b79f14b74de38c5fc Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 11 Jun 2024 22:15:17 +0200 Subject: [PATCH 073/430] FIX: features documentation --- LANGUAGES.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/LANGUAGES.md b/LANGUAGES.md index 4952ade158b..b0aaa7c14eb 100644 --- a/LANGUAGES.md +++ b/LANGUAGES.md @@ -164,7 +164,7 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr 0.7.0 Yes 1.211.22 - +Yes YesYesYes YesYesYesYes YesYesYesYes @@ -176,7 +176,7 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr 0.9.3 Yes 4.1.54.2.5 - +Yes YesYes YesYes YesYesYesYes @@ -344,7 +344,7 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr 0.12.0 Yes 5.7 - +Yes YesYesYesYes YesYes YesYesYes From b709b0bc09e424ac71b5389bca606c1161a8d8fd Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Thu, 13 Jun 2024 10:13:25 -0700 Subject: [PATCH 074/430] go: Fix indentation in compiler This fixes a small case I missed in 4930caca. Before: func NewFoo() *Foo { return &Foo{ DefDef: 10, DefOpt: 11, } } After: func NewFoo() *Foo { return &Foo{ DefDef: 10, DefOpt: 11, } } --- compiler/cpp/src/thrift/generate/t_go_generator.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc index 65574dd0a40..a42c71ad5e6 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc @@ -1209,19 +1209,25 @@ void t_go_generator::generate_go_struct_initializer(ostream& out, t_struct* tstruct, bool is_args_or_result) { out << publicize(type_name(tstruct), is_args_or_result) << "{"; + indent_up(); const vector& members = tstruct->get_members(); + bool empty = true; for (auto member : members) { bool pointer_field = is_pointer_field(member); string publicized_name; t_const_value* def_value; get_publicized_name_and_def_value(member, &publicized_name, &def_value); if (!pointer_field && def_value != nullptr && !omit_initialization(member)) { + empty = false; out << '\n' << indent() << publicized_name << ": " - << render_field_initial_value(member, member->get_name(), pointer_field) << "," - << '\n'; + << render_field_initial_value(member, member->get_name(), pointer_field) << ","; } } + indent_down(); + if (!empty) { + out << '\n' << indent(); + } out << "}" << '\n'; } From aeae628b49e397e5885fd221a282680979af9033 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Mon, 10 Jun 2024 11:39:23 -0700 Subject: [PATCH 075/430] go: Improve efficiency with zlib in THeaderTransport When enabled zlib in THeaderTransport we observed very high cpu overhead, use a pool for zlib writers to improve efficiency. --- lib/go/thrift/header_transport.go | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/go/thrift/header_transport.go b/lib/go/thrift/header_transport.go index d81fb29d31f..8148796c7e7 100644 --- a/lib/go/thrift/header_transport.go +++ b/lib/go/thrift/header_transport.go @@ -211,6 +211,25 @@ func (tw *TransformWriter) Close() error { return nil } +var zlibDefaultLevelWriterPool = newPool( + func() *zlib.Writer { + return zlib.NewWriter(nil) + }, + nil, +) + +type zlibPoolCloser struct { + writer *zlib.Writer +} + +func (z *zlibPoolCloser) Close() error { + defer func() { + z.writer.Reset(nil) + zlibDefaultLevelWriterPool.put(&z.writer) + }() + return z.writer.Close() +} + // AddTransform adds a transform. func (tw *TransformWriter) AddTransform(id THeaderTransformID) error { switch id { @@ -222,9 +241,12 @@ func (tw *TransformWriter) AddTransform(id THeaderTransformID) error { case TransformNone: // no-op case TransformZlib: - writeCloser := zlib.NewWriter(tw.Writer) + writeCloser := zlibDefaultLevelWriterPool.get() + writeCloser.Reset(tw.Writer) tw.Writer = writeCloser - tw.closers = append(tw.closers, writeCloser) + tw.closers = append(tw.closers, &zlibPoolCloser{ + writer: writeCloser, + }) } return nil } From 6944912b578e5ab2721af3ea2d0fdbab2951343d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 16 Jun 2024 09:53:07 +0000 Subject: [PATCH 076/430] Bump braces from 3.0.2 to 3.0.3 in /lib/js Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] --- lib/js/package-lock.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/js/package-lock.json b/lib/js/package-lock.json index 88026612efb..4b283fc3acb 100644 --- a/lib/js/package-lock.json +++ b/lib/js/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "thrift", - "version": "0.20.0", + "version": "0.21.0", "license": "Apache-2.0", "devDependencies": { "browserify": "~16.5", @@ -235,12 +235,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1225,9 +1225,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" From 4b90909ddd51e6ff59c493a0f9a92de7fa9f5af2 Mon Sep 17 00:00:00 2001 From: CJCombrink Date: Sat, 27 Apr 2024 19:51:39 +0200 Subject: [PATCH 077/430] THRIFT-5773 Strong UUID wrapper for C++ Client: cpp/CMakeLists.txt Patch: Carel Combrink This closes #2958 --- LANGUAGES.md | 2 +- .../src/thrift/generate/t_cpp_generator.cc | 7 +- lib/c_glib/test/CMakeLists.txt | 2 +- lib/c_glib/test/Makefile.am | 2 +- lib/c_glib/test/testthrifttestclient.cpp | 5 + lib/c_glib/test/testthrifttestzlibclient.cpp | 8 +- lib/cpp/CMakeLists.txt | 2 +- lib/cpp/Makefile.am | 3 +- lib/cpp/README.md | 26 +++ lib/cpp/libthrift.vcxproj | 3 +- lib/cpp/libthrift.vcxproj.filters | 5 +- .../{protocol/TUuidUtils.cpp => TUuid.cpp} | 43 ++-- lib/cpp/src/thrift/TUuid.h | 171 ++++++++++++++++ lib/cpp/src/thrift/protocol/TBinaryProtocol.h | 4 +- .../src/thrift/protocol/TBinaryProtocol.tcc | 18 +- .../src/thrift/protocol/TDebugProtocol.cpp | 14 +- lib/cpp/src/thrift/protocol/TDebugProtocol.h | 2 +- lib/cpp/src/thrift/protocol/TJSONProtocol.cpp | 18 +- lib/cpp/src/thrift/protocol/TJSONProtocol.h | 4 +- lib/cpp/src/thrift/protocol/TProtocol.h | 13 +- .../src/thrift/protocol/TProtocolDecorator.h | 4 +- lib/cpp/src/thrift/protocol/TUuidUtils.hpp | 45 ----- .../src/thrift/protocol/TVirtualProtocol.h | 8 +- lib/cpp/test/Benchmark.cpp | 2 +- lib/cpp/test/CMakeLists.txt | 20 ++ lib/cpp/test/DebugProtoTest.cpp | 6 +- lib/cpp/test/JSONProtoTest.cpp | 4 +- lib/cpp/test/Makefile.am | 33 +++- lib/cpp/test/SpecializationTest.cpp | 2 +- lib/cpp/test/TUuidTest.cpp | 186 ++++++++++++++++++ lib/cpp/test/TUuidTestBoost.cpp | 65 ++++++ lib/cpp/test/TUuidTestBoostNoDirective.cpp | 82 ++++++++ lib/cpp/test/ToStringTest.cpp | 4 +- test/cpp/src/TestClient.cpp | 12 +- test/cpp/src/TestServer.cpp | 8 +- 35 files changed, 677 insertions(+), 156 deletions(-) rename lib/cpp/src/thrift/{protocol/TUuidUtils.cpp => TUuid.cpp} (59%) create mode 100644 lib/cpp/src/thrift/TUuid.h delete mode 100644 lib/cpp/src/thrift/protocol/TUuidUtils.hpp create mode 100644 lib/cpp/test/TUuidTest.cpp create mode 100644 lib/cpp/test/TUuidTestBoost.cpp create mode 100644 lib/cpp/test/TUuidTestBoostNoDirective.cpp diff --git a/LANGUAGES.md b/LANGUAGES.md index b0aaa7c14eb..ccb44436af0 100644 --- a/LANGUAGES.md +++ b/LANGUAGES.md @@ -80,7 +80,7 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr 0.2.0 YesYes C++11 - +Yes YesYesYesYesYesYes YesYesYesYes YesYesYesYes diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc index dc74a92aa05..69842689296 100644 --- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc @@ -4572,8 +4572,7 @@ string t_cpp_generator::base_type_name(t_base_type::t_base tbase) { case t_base_type::TYPE_DOUBLE: return "double"; case t_base_type::TYPE_UUID: - // TODO: discuss possibility of a class TUuid; - return "std::string"; + return "apache::thrift::TUuid"; default: throw "compiler error: no C++ base type name for base type " + t_base_type::t_base_name(tbase); } @@ -4614,9 +4613,7 @@ string t_cpp_generator::declare_field(t_field* tfield, switch (tbase) { case t_base_type::TYPE_VOID: case t_base_type::TYPE_STRING: - break; case t_base_type::TYPE_UUID: - result += " = std::string(\"00000000-0000-0000-0000-000000000000\")"; break; case t_base_type::TYPE_BOOL: result += " = false"; @@ -4784,10 +4781,10 @@ bool t_cpp_generator::is_struct_storage_not_throwing(t_struct* tstruct) const { case t_base_type::TYPE_I32: case t_base_type::TYPE_I64: case t_base_type::TYPE_DOUBLE: + case t_base_type::TYPE_UUID: continue; case t_base_type::TYPE_VOID: case t_base_type::TYPE_STRING: - case t_base_type::TYPE_UUID: default: return false; } diff --git a/lib/c_glib/test/CMakeLists.txt b/lib/c_glib/test/CMakeLists.txt index 4d3092fb8a1..4f60473b25c 100644 --- a/lib/c_glib/test/CMakeLists.txt +++ b/lib/c_glib/test/CMakeLists.txt @@ -231,7 +231,7 @@ add_custom_command(OUTPUT gen-cpp/ThriftTest.h gen-cpp/ThriftTest_constants.h gen-cpp/ThriftTest_types.h - COMMAND ${THRIFT_COMPILER} --gen cpp ${PROJECT_SOURCE_DIR}/test/v0.16/ThriftTest.thrift + COMMAND ${THRIFT_COMPILER} --gen cpp ${PROJECT_SOURCE_DIR}/test/ThriftTest.thrift ) # TODO: Add memory checks using ctest_memcheck or similar diff --git a/lib/c_glib/test/Makefile.am b/lib/c_glib/test/Makefile.am index c7c67ab4c73..0a5f220ac91 100644 --- a/lib/c_glib/test/Makefile.am +++ b/lib/c_glib/test/Makefile.am @@ -335,7 +335,7 @@ gen-c_glib/t_test_optional_required_test_types.c gen-c_glib/t_test_optional_requ gen-c_glib/t_test_second_service.c gen-c_glib/t_test_thrift_test.c gen-c_glib/t_test_thrift_test_types.c gen-c_glib/t_test_second_service.h gen-c_glib/t_test_thrift_test.h gen-c_glib/t_test_thrift_test_types.h: ../../../test/v0.16/ThriftTest.thrift $(THRIFT) $(THRIFT) --gen c_glib $< -gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_constants.cpp gen-cpp/ThriftTest_types.cpp: ../../../test/v0.16/ThriftTest.thrift $(THRIFT) +gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_constants.cpp gen-cpp/ThriftTest_types.cpp: ../../../test/ThriftTest.thrift $(THRIFT) $(THRIFT) --gen cpp $< TESTS = \ diff --git a/lib/c_glib/test/testthrifttestclient.cpp b/lib/c_glib/test/testthrifttestclient.cpp index 5e0c89471d4..77cd24a8f22 100644 --- a/lib/c_glib/test/testthrifttestclient.cpp +++ b/lib/c_glib/test/testthrifttestclient.cpp @@ -112,6 +112,11 @@ class TestHandler : public ThriftTestIf { out = thing; } + std::string testUuid(const std::string thing) override { + cout << "[C -> C++] testUuid(\"" << std::hex << thing << "\")" << '\n'; + return thing; + } + void testStruct(Xtruct& out, const Xtruct &thing) override { cout << "[C -> C++] testStruct({\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "})" << '\n'; out = thing; diff --git a/lib/c_glib/test/testthrifttestzlibclient.cpp b/lib/c_glib/test/testthrifttestzlibclient.cpp index 307fd4f5f01..7c0f24a5ed0 100644 --- a/lib/c_glib/test/testthrifttestzlibclient.cpp +++ b/lib/c_glib/test/testthrifttestzlibclient.cpp @@ -107,6 +107,11 @@ class TestHandler : public ThriftTestIf { out = thing; } + std::string testUuid(const std::string thing) override { + cout << "[C -> C++] testUuid(\"" << std::hex << thing << "\")" << '\n'; + return thing; + } + void testStruct(Xtruct& out, const Xtruct &thing) override { cout << "[C -> C++] testStruct({\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "})" << '\n'; out = thing; @@ -190,7 +195,8 @@ class TestHandler : public ThriftTestIf { UserId testTypedef(const UserId thing) override { cout << "[C -> C++] testTypedef(" << thing << ")" << '\n'; - return thing; } + return thing; + } void testMapMap(map > &mapmap, const int32_t hello) override { cout << "[C -> C++] testMapMap(" << hello << ")" << '\n'; diff --git a/lib/cpp/CMakeLists.txt b/lib/cpp/CMakeLists.txt index c2f15dd5728..5980734f380 100644 --- a/lib/cpp/CMakeLists.txt +++ b/lib/cpp/CMakeLists.txt @@ -31,6 +31,7 @@ endif() set(thriftcpp_SOURCES src/thrift/TApplicationException.cpp src/thrift/TOutput.cpp + src/thrift/TUuid.cpp src/thrift/async/TAsyncChannel.cpp src/thrift/async/TAsyncProtocolProcessor.cpp src/thrift/async/TConcurrentClientSyncInfo.h @@ -43,7 +44,6 @@ set(thriftcpp_SOURCES src/thrift/protocol/TJSONProtocol.cpp src/thrift/protocol/TMultiplexedProtocol.cpp src/thrift/protocol/TProtocol.cpp - src/thrift/protocol/TUuidUtils.cpp src/thrift/transport/TTransportException.cpp src/thrift/transport/TFDTransport.cpp src/thrift/transport/TSimpleFileTransport.cpp diff --git a/lib/cpp/Makefile.am b/lib/cpp/Makefile.am index 12b8d82498d..3d7beab68ae 100644 --- a/lib/cpp/Makefile.am +++ b/lib/cpp/Makefile.am @@ -57,6 +57,7 @@ AM_CPPFLAGS = $(BOOST_CPPFLAGS) $(OPENSSL_INCLUDES) -I$(srcdir)/src -D__STDC_FOR libthrift_la_SOURCES = src/thrift/TApplicationException.cpp \ src/thrift/TOutput.cpp \ + src/thrift/TUuid.cpp \ src/thrift/VirtualProfiling.cpp \ src/thrift/async/TAsyncChannel.cpp \ src/thrift/async/TAsyncProtocolProcessor.cpp \ @@ -69,7 +70,6 @@ libthrift_la_SOURCES = src/thrift/TApplicationException.cpp \ src/thrift/protocol/TBase64Utils.cpp \ src/thrift/protocol/TMultiplexedProtocol.cpp \ src/thrift/protocol/TProtocol.cpp \ - src/thrift/protocol/TUuidUtils.cpp \ src/thrift/transport/TTransportException.cpp \ src/thrift/transport/TFDTransport.cpp \ src/thrift/transport/TFileTransport.cpp \ @@ -137,6 +137,7 @@ include_thrift_HEADERS = \ src/thrift/thrift-config.h \ src/thrift/thrift_export.h \ src/thrift/TDispatchProcessor.h \ + src/thrift/TUuid.h \ src/thrift/Thrift.h \ src/thrift/TOutput.h \ src/thrift/TProcessor.h \ diff --git a/lib/cpp/README.md b/lib/cpp/README.md index 8074484f197..74983aeb1ff 100644 --- a/lib/cpp/README.md +++ b/lib/cpp/README.md @@ -232,6 +232,32 @@ OpenSSL's RAND_poll() when OpenSSL library is first initialized. The PRNG seed is key to the application security. This method should be overridden if it's not strong enough for you. +# Thrift UUID + +The `uuid` `BaseType` is implemented in C++ by the `apache::thrift::TUuid` class. This class +is a strong wrapper class around an internal buffer of 16 bytes. + +The `apache::thrift::TUuid` supports construction from different UUID string representations. +Some examples of supported string formats are: + +* `"hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh"` +* `"{hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh}"` +* `"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"` +* `"{hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh}"` + +## `TUuid` and `boost::uuids::uuid` + +Internally the TUuid class is implemented using the `boost::uuids::uuid` library. As a result the TUuid +can seamlessly interoperate with the boost UUID type since the underlying data structure is the same. + +For convenience, when boost is already used by a project the `THRIFT_TUUID_SUPPORT_BOOST_UUID` preprocessor +directive can be set when including the thrift library to enable construction of a `TUuid` from a +`boost::uuids::uuid`. By default this is an implicit constructor that can be changed to be explicit +by defining the `THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT` preprocessor directive. + +The thrift library does not need to be compiled differently when this constructor is needed. The preprocessor +directives can be set on the project that uses the thrift library. + # Deprecations ## 0.12.0 diff --git a/lib/cpp/libthrift.vcxproj b/lib/cpp/libthrift.vcxproj index 1b413f8ae8e..7fcccfe99ee 100644 --- a/lib/cpp/libthrift.vcxproj +++ b/lib/cpp/libthrift.vcxproj @@ -49,7 +49,6 @@ - @@ -58,6 +57,7 @@ + @@ -97,6 +97,7 @@ + diff --git a/lib/cpp/libthrift.vcxproj.filters b/lib/cpp/libthrift.vcxproj.filters index fb94f608730..4b2ba3b2782 100644 --- a/lib/cpp/libthrift.vcxproj.filters +++ b/lib/cpp/libthrift.vcxproj.filters @@ -4,6 +4,7 @@ transport + @@ -30,9 +31,6 @@ protocol - - protocol - transport @@ -109,6 +107,7 @@ protocol + diff --git a/lib/cpp/src/thrift/protocol/TUuidUtils.cpp b/lib/cpp/src/thrift/TUuid.cpp similarity index 59% rename from lib/cpp/src/thrift/protocol/TUuidUtils.cpp rename to lib/cpp/src/thrift/TUuid.cpp index e1eab22cb11..a0c45f9de6f 100644 --- a/lib/cpp/src/thrift/protocol/TUuidUtils.cpp +++ b/lib/cpp/src/thrift/TUuid.cpp @@ -17,7 +17,7 @@ * under the License. */ -#include +#include #include #include @@ -25,32 +25,37 @@ namespace apache { namespace thrift { -namespace protocol { - -bool uuid_encode(const std::string& in, std::string& out) { - static const boost::uuids::string_generator gen; - static const std::string empty_uuid(boost::uuids::uuid::static_size(), '\0'); - out = empty_uuid; - if (in.empty()) { - return true; + +namespace { +static const boost::uuids::string_generator gen; +} + +TUuid::TUuid(const std::string& str) noexcept { + std::fill(this->begin(), this->end(), 0); + if (str.empty()) { + return ; } + try { - const boost::uuids::uuid uuid{gen(in)}; - std::copy(uuid.begin(), uuid.end(), out.begin()); - return true; + const boost::uuids::uuid uuid{gen(str)}; + std::copy(uuid.begin(), uuid.end(), this->begin()); } catch (const std::runtime_error&) { // Invalid string most probably - return false; } } -void uuid_decode(const std::string& in, std::string& out) { - boost::uuids::uuid uuid{}; - const size_t to_copy = std::min(in.size(), uuid.size()); - std::copy(in.begin(), in.begin() + to_copy, uuid.begin()); - out = boost::uuids::to_string(uuid); +bool TUuid::is_nil() const noexcept { + boost::uuids::uuid uuid_tmp{}; + std::copy(this->begin(), this->end(), std::begin(uuid_tmp)); + return uuid_tmp.is_nil(); } +std::string to_string(const TUuid& in) { + boost::uuids::uuid uuid_tmp{}; + std::copy(std::begin(in), std::end(in), std::begin(uuid_tmp)); + return boost::uuids::to_string(uuid_tmp); } + + } -} // apache::thrift::protocol +} // apache::thrift \ No newline at end of file diff --git a/lib/cpp/src/thrift/TUuid.h b/lib/cpp/src/thrift/TUuid.h new file mode 100644 index 00000000000..bcf0160bcdb --- /dev/null +++ b/lib/cpp/src/thrift/TUuid.h @@ -0,0 +1,171 @@ +/* + * 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 _THRIFT_TUUID_H_ +#define _THRIFT_TUUID_H_ 1 + +#include + +#ifdef THRIFT_TUUID_SUPPORT_BOOST_UUID +#include +#endif // THRIFT_TUUID_SUPPORT_BOOST_UUID + +#include + +namespace apache { +namespace thrift { + +/** + * Thrift wrapper class for a UUID type. + * + * The UUID is stored as a 16 byte buffer. + * This class stores the UUID in network order when assigned from a string. + */ +class TUuid { +public: + typedef uint8_t value_type; + typedef uint8_t* iterator; + typedef uint8_t const* const_iterator; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + + TUuid() = default; + TUuid(const TUuid& other) = default; + TUuid(TUuid&& other) = default; + TUuid& operator=(const TUuid&) = default; + TUuid& operator=(TUuid&&) = default; + ~TUuid() = default; + + /** + * Construct the object from a 16 byte buffer. + */ + explicit TUuid(const uint8_t (&data)[16]) noexcept + { + std::copy(std::begin(data), std::end(data), std::begin(this->data_)); + } + + /** + * Construct the object from the specified string. + * + * Supported string formats are: + * - "hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh" + * - "{hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh}" + * - "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh" + * - "{hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh}" + * + * If the string is invalid, the object will be set to a + * nil (empty) UUID. + */ + explicit TUuid(const std::string& str) noexcept; + +#ifdef THRIFT_TUUID_SUPPORT_BOOST_UUID + /** + * Construct the TUuid from a boost::uuids::uuid. + * + * This constructor will only be available if the THRIFT_TUUID_SUPPORT_BOOST_UUID + * compiler directive is set when this file is included. + * + * This constructor is by default implicit. It can be made explicit by defining the + * THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT compiler directive. + */ + #ifdef THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT + explicit + #endif // THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT + TUuid(const boost::uuids::uuid& buuid) noexcept + { + std::copy(std::begin(buuid.data), std::end(buuid.data), std::begin(this->data_)); + } +#endif // THRIFT_TUUID_SUPPORT_BOOST_UUID + + /** + * Check if the UUID is nil. + */ + bool is_nil() const noexcept; + + /** + * Compare two TUuid objects for equality. + */ + inline bool operator==(const TUuid& other) const; + + /** + * Compare two TUuid objects for inequality. + */ + inline bool operator!=(const TUuid& other) const; + + iterator begin() noexcept { return data_; } + const_iterator begin() const noexcept { return data_; } + iterator end() noexcept { return data_ + size(); } + const_iterator end() const noexcept { return data_ + size(); } + size_type size() const noexcept { return 16; } + inline const_iterator data() const { return data_; } + inline iterator data() { return data_; } + + void swap(TUuid& other) noexcept { std::swap(data_, other.data_); } + +private: + /** + * The UUID data. + */ + uint8_t data_[16] = {}; +}; + +/** + * Get the String representation of a TUUID. + * + * The format returned is: + * - "hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh" + */ +std::string to_string(const TUuid& uuid) noexcept(false); + +/** + * Swap two TUuid objects + */ +inline void swap(TUuid& lhs, TUuid& rhs) noexcept { + lhs.swap(rhs); +} + +/** + * TUuid equality comparison operator implementation + */ +inline bool TUuid::operator==(const TUuid& other) const { + // Compare using temporary strings. + // Can't use strcmp() since we expect embeded zeros + // Perhaps the reason we should use std::array instead + return std::string(this->begin(), this->end()) == std::string(other.begin(), other.end()); +} + +/** + * TUuid inequality comparison operator implementation + */ +inline bool TUuid::operator!=(const TUuid& other) const { + return !(*this == other); +} + +/** + * TUuid ostream stream operator implementation + */ +inline std::ostream& operator<<(std::ostream& out, const TUuid& obj) { + out << to_string(obj); + return out; +} + +} // namespace thrift +} // namespace apache + +#endif // #ifndef _THRIFT_TUUID_H_ diff --git a/lib/cpp/src/thrift/protocol/TBinaryProtocol.h b/lib/cpp/src/thrift/protocol/TBinaryProtocol.h index 24e51f75f4d..cba6e69485d 100644 --- a/lib/cpp/src/thrift/protocol/TBinaryProtocol.h +++ b/lib/cpp/src/thrift/protocol/TBinaryProtocol.h @@ -119,7 +119,7 @@ class TBinaryProtocolT : public TVirtualProtocol -#include #include #include @@ -195,16 +194,9 @@ uint32_t TBinaryProtocolT::writeBinary(const std::string } template -uint32_t TBinaryProtocolT::writeUUID(const std::string& str) { - std::string out; - const bool encoded = uuid_encode(str, out); - if(!encoded) - throw TProtocolException(TProtocolException::INVALID_DATA); - // This should not happen, but check for now - if(out.size() != 16) - throw TProtocolException(TProtocolException::UNKNOWN); +uint32_t TBinaryProtocolT::writeUUID(const TUuid& uuid) { // TODO: Consider endian swapping, see lib/delphi/src/Thrift.Utils.pas:377 - this->trans_->write((uint8_t*)out.data(), 16); + this->trans_->write(uuid.data(), uuid.size()); return 16; } @@ -444,10 +436,8 @@ uint32_t TBinaryProtocolT::readBinary(std::string& str) } template -uint32_t TBinaryProtocolT::readUUID(std::string& str) { - std::string in; - readStringBody(in, 16); - uuid_decode(in, str); +uint32_t TBinaryProtocolT::readUUID(TUuid& uuid) { + this->trans_->readAll(uuid.begin(), uuid.size()); return 16; } diff --git a/lib/cpp/src/thrift/protocol/TDebugProtocol.cpp b/lib/cpp/src/thrift/protocol/TDebugProtocol.cpp index 0a2eaeda035..6e88313db64 100644 --- a/lib/cpp/src/thrift/protocol/TDebugProtocol.cpp +++ b/lib/cpp/src/thrift/protocol/TDebugProtocol.cpp @@ -18,7 +18,6 @@ */ #include -#include #include #include @@ -388,19 +387,12 @@ uint32_t TDebugProtocol::writeBinary(const string& str) { return TDebugProtocol::writeString(str); } -uint32_t TDebugProtocol::writeUUID(const string& str) { - std::string out_raw; - uuid_encode(str, out_raw); - - std::string out_encoded; - uuid_decode(out_raw, out_encoded); - +uint32_t TDebugProtocol::writeUUID(const TUuid& uuid) { size_t size = writePlain("{\n"); indentUp(); - size += writeIndented("[in ] = \"" + str + "\",\n"); size += writeIndented("[raw] = "); - size += writeString(out_raw); - size += writeIndented("[enc] = \"" + out_encoded + "\"\n"); + size += writeString(std::string(std::begin(uuid), std::end(uuid))); + size += writeIndented("[enc] = \"" + to_string(uuid) + "\"\n"); indentDown(); size += writeIndented("}\n"); return size; diff --git a/lib/cpp/src/thrift/protocol/TDebugProtocol.h b/lib/cpp/src/thrift/protocol/TDebugProtocol.h index af89cc5679d..02662f1ab15 100644 --- a/lib/cpp/src/thrift/protocol/TDebugProtocol.h +++ b/lib/cpp/src/thrift/protocol/TDebugProtocol.h @@ -110,7 +110,7 @@ class TDebugProtocol : public TVirtualProtocol { uint32_t writeBinary(const std::string& str); - uint32_t writeUUID(const std::string& str); + uint32_t writeUUID(const TUuid& uuid); private: void indentUp(); diff --git a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp index 0899f00eefa..3805869a936 100644 --- a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp +++ b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp @@ -18,7 +18,6 @@ */ #include -#include #include @@ -717,14 +716,8 @@ uint32_t TJSONProtocol::writeBinary(const std::string& str) { return writeJSONBase64(str); } -uint32_t TJSONProtocol::writeUUID(const std::string& str) { - std::string out_raw; - uuid_encode(str, out_raw); - - std::string out_encoded; - uuid_decode(out_raw, out_encoded); - - return writeJSONString(out_encoded); +uint32_t TJSONProtocol::writeUUID(const TUuid& uuid) { + return writeJSONString(to_string(uuid)); } /** @@ -1123,8 +1116,11 @@ uint32_t TJSONProtocol::readBinary(std::string& str) { return readJSONBase64(str); } -uint32_t TJSONProtocol::readUUID(std::string& str) { - return readJSONString(str); +uint32_t TJSONProtocol::readUUID(TUuid& uuid) { + std::string uuid_str; + const uint32_t result = readJSONString(uuid_str); + uuid = TUuid{uuid_str}; + return result; } // Return the minimum number of bytes a type will consume on the wire diff --git a/lib/cpp/src/thrift/protocol/TJSONProtocol.h b/lib/cpp/src/thrift/protocol/TJSONProtocol.h index 069a9905f53..09eb6eab1bf 100644 --- a/lib/cpp/src/thrift/protocol/TJSONProtocol.h +++ b/lib/cpp/src/thrift/protocol/TJSONProtocol.h @@ -198,7 +198,7 @@ class TJSONProtocol : public TVirtualProtocol { uint32_t writeBinary(const std::string& str); - uint32_t writeUUID(const std::string& str); + uint32_t writeUUID(const TUuid& uuid); /** * Reading functions @@ -247,7 +247,7 @@ class TJSONProtocol : public TVirtualProtocol { uint32_t readBinary(std::string& str); - uint32_t readUUID(std::string& str); + uint32_t readUUID(TUuid& uuid); int getMinSerializedSize(TType type) override; diff --git a/lib/cpp/src/thrift/protocol/TProtocol.h b/lib/cpp/src/thrift/protocol/TProtocol.h index d29df1c8d32..035b7454d0c 100644 --- a/lib/cpp/src/thrift/protocol/TProtocol.h +++ b/lib/cpp/src/thrift/protocol/TProtocol.h @@ -49,6 +49,7 @@ #include #include #include +#include #include @@ -275,7 +276,7 @@ class TProtocol { virtual uint32_t writeBinary_virt(const std::string& str) = 0; - virtual uint32_t writeUUID_virt(const std::string& str) = 0; + virtual uint32_t writeUUID_virt(const TUuid& uuid) = 0; uint32_t writeMessageBegin(const std::string& name, const TMessageType messageType, @@ -384,9 +385,9 @@ class TProtocol { return writeBinary_virt(str); } - uint32_t writeUUID(const std::string& str) { + uint32_t writeUUID(const TUuid& uuid) { T_VIRTUAL_CALL(); - return writeUUID_virt(str); + return writeUUID_virt(uuid); } /** @@ -437,7 +438,7 @@ class TProtocol { virtual uint32_t readBinary_virt(std::string& str) = 0; - virtual uint32_t readUUID_virt(std::string& str) = 0; + virtual uint32_t readUUID_virt(TUuid& uuid) = 0; uint32_t readMessageBegin(std::string& name, TMessageType& messageType, int32_t& seqid) { T_VIRTUAL_CALL(); @@ -539,9 +540,9 @@ class TProtocol { return readBinary_virt(str); } - uint32_t readUUID(std::string& str) { + uint32_t readUUID(TUuid& uuid) { T_VIRTUAL_CALL(); - return readUUID_virt(str); + return readUUID_virt(uuid); } /* diff --git a/lib/cpp/src/thrift/protocol/TProtocolDecorator.h b/lib/cpp/src/thrift/protocol/TProtocolDecorator.h index 9eb1566ab75..88fbbdeb1c2 100644 --- a/lib/cpp/src/thrift/protocol/TProtocolDecorator.h +++ b/lib/cpp/src/thrift/protocol/TProtocolDecorator.h @@ -92,7 +92,7 @@ class TProtocolDecorator : public TProtocol { uint32_t writeDouble_virt(const double dub) override { return protocol->writeDouble(dub); } uint32_t writeString_virt(const std::string& str) override { return protocol->writeString(str); } uint32_t writeBinary_virt(const std::string& str) override { return protocol->writeBinary(str); } - uint32_t writeUUID_virt(const std::string& str) override { return protocol->writeUUID(str); } + uint32_t writeUUID_virt(const TUuid& uuid) override { return protocol->writeUUID(uuid); } uint32_t readMessageBegin_virt(std::string& name, TMessageType& messageType, @@ -141,7 +141,7 @@ class TProtocolDecorator : public TProtocol { uint32_t readString_virt(std::string& str) override { return protocol->readString(str); } uint32_t readBinary_virt(std::string& str) override { return protocol->readBinary(str); } - uint32_t readUUID_virt(std::string& str) override { return protocol->readUUID(str); } + uint32_t readUUID_virt(TUuid& uuid) override { return protocol->readUUID(uuid); } private: shared_ptr protocol; diff --git a/lib/cpp/src/thrift/protocol/TUuidUtils.hpp b/lib/cpp/src/thrift/protocol/TUuidUtils.hpp deleted file mode 100644 index 583147ffd38..00000000000 --- a/lib/cpp/src/thrift/protocol/TUuidUtils.hpp +++ /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. - */ - -#ifndef _THRIFT_PROTOCOL_TUUIDUTILS_H_ -#define _THRIFT_PROTOCOL_TUUIDUTILS_H_ - -#include - -namespace apache { -namespace thrift { -namespace protocol { - -// Encode canonical UUID string to a 16 char representation -// Supported formats for in: -// - "hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh" -// - "{hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh}" -// - "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh" -// - "{hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh}" -// Returns false if the string was invalid and the value was not encoded. -bool uuid_encode(const std::string& in, std::string& out); - -// Decode 16 char UUID buffer to 36 characted string -void uuid_decode(const std::string& in, std::string& out); - -} -} -} // apache::thrift::protocol - -#endif // #define _THRIFT_PROTOCOL_TUUIDUTILS_H_ diff --git a/lib/cpp/src/thrift/protocol/TVirtualProtocol.h b/lib/cpp/src/thrift/protocol/TVirtualProtocol.h index 4698081d241..8789e473c73 100644 --- a/lib/cpp/src/thrift/protocol/TVirtualProtocol.h +++ b/lib/cpp/src/thrift/protocol/TVirtualProtocol.h @@ -393,8 +393,8 @@ class TVirtualProtocol : public Super_ { return static_cast(this)->writeBinary(str); } - uint32_t writeUUID_virt(const std::string& str) override { - return static_cast(this)->writeUUID(str); + uint32_t writeUUID_virt(const TUuid& uuid) override { + return static_cast(this)->writeUUID(uuid); } /** @@ -475,8 +475,8 @@ class TVirtualProtocol : public Super_ { return static_cast(this)->readBinary(str); } - uint32_t readUUID_virt(std::string& str) override { - return static_cast(this)->readUUID(str); + uint32_t readUUID_virt(TUuid& uuid) override { + return static_cast(this)->readUUID(uuid); } uint32_t skip_virt(TType type) override { return static_cast(this)->skip(type); } diff --git a/lib/cpp/test/Benchmark.cpp b/lib/cpp/test/Benchmark.cpp index ba8c3452919..22ec86c54a6 100644 --- a/lib/cpp/test/Benchmark.cpp +++ b/lib/cpp/test/Benchmark.cpp @@ -65,7 +65,7 @@ int main() { ooe.some_characters = "JSON THIS! \"\1"; ooe.zomg_unicode = "\xd7\n\a\t"; ooe.base64 = "\1\2\3\255"; - ooe.rfc4122_uuid = "{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"; + ooe.rfc4122_uuid = apache::thrift::TUuid{"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"}; int num = 100000; std::shared_ptr buf(new TMemoryBuffer(num*1000)); diff --git a/lib/cpp/test/CMakeLists.txt b/lib/cpp/test/CMakeLists.txt index 87ed1094cb4..5ad8d74a845 100644 --- a/lib/cpp/test/CMakeLists.txt +++ b/lib/cpp/test/CMakeLists.txt @@ -82,6 +82,7 @@ set(UnitTest_SOURCES TServerSocketTest.cpp TServerTransportTest.cpp ThrifttReadCheckTests.cpp + TUuidTest.cpp ) add_executable(UnitTests ${UnitTest_SOURCES}) @@ -94,6 +95,25 @@ if(MSVC) set_property( TARGET UnitTests APPEND_STRING PROPERTY COMPILE_FLAGS /wd4503 ) endif() +# Test the THRIFT_TUUID_SUPPORT_BOOST_UUID compiler directive globally set on the target +add_executable(UnitTestsUuid + UnitTestMain.cpp + TUuidTestBoost.cpp +) +target_link_libraries(UnitTestsUuid testgencpp ${Boost_LIBRARIES}) +target_link_libraries(UnitTestsUuid thrift) +target_compile_definitions(UnitTestsUuid PUBLIC THRIFT_TUUID_SUPPORT_BOOST_UUID) +add_test(NAME UnitTestsUuid COMMAND UnitTestsUuid) + +# Test not setting the THRIFT_TUUID_SUPPORT_BOOST_UUID compiler directive as with the test above. +# The test does set the directive before including the thrift header to test the behaviour +add_executable(UnitTestsUuidNoDirective + UnitTestMain.cpp + TUuidTestBoostNoDirective.cpp +) +target_link_libraries(UnitTestsUuidNoDirective testgencpp ${Boost_LIBRARIES}) +target_link_libraries(UnitTestsUuidNoDirective thrift) +add_test(NAME UnitTestsUuidNoDirective COMMAND UnitTestsUuidNoDirective) set( TInterruptTest_SOURCES TSocketInterruptTest.cpp diff --git a/lib/cpp/test/DebugProtoTest.cpp b/lib/cpp/test/DebugProtoTest.cpp index cc4e5ff9558..44eeef768d6 100644 --- a/lib/cpp/test/DebugProtoTest.cpp +++ b/lib/cpp/test/DebugProtoTest.cpp @@ -75,7 +75,6 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_1) { " [2] = 3,\n" " },\n" " 15: rfc4122_uuid (uuid) = {\n" - " [in ] = \"\",\n" " [raw] = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\",\n" " [enc] = \"00000000-0000-0000-0000-000000000000\"\n" " }\n" @@ -103,7 +102,7 @@ void testCaseSetup_2() { "\xb0\xcf\x81\xe2\x84\x8e\x20\xce\x91\x74\x74" "\xce\xb1\xe2\x85\xbd\xce\xba\xc7\x83\xe2\x80" "\xbc"; - n->my_ooe.rfc4122_uuid = "{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"; + n->my_ooe.rfc4122_uuid = apache::thrift::TUuid{"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"}; n->my_bonk.type = 31337; n->my_bonk.message = "I am a bonk... xor!"; } @@ -148,7 +147,6 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_2) { " [2] = 3,\n" " },\n" " 15: rfc4122_uuid (uuid) = {\n" - " [in ] = \"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}\",\n" " [raw] = \"^*\\xb1\\x88\\x17&Nu\\xa0O\\x1e\\xd9\\xa6\\xa8\\x9cL\",\n" " [enc] = \"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c\"\n" " }\n" @@ -240,7 +238,6 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_3) { " [2] = 3,\n" " },\n" " 15: rfc4122_uuid (uuid) = {\n" - " [in ] = \"\",\n" " [raw] = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\",\n" " [enc] = \"00000000-0000-0000-0000-000000000000\"\n" " }\n" @@ -276,7 +273,6 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_3) { " [2] = 3,\n" " },\n" " 15: rfc4122_uuid (uuid) = {\n" - " [in ] = \"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}\",\n" " [raw] = \"^*\\xb1\\x88\\x17&Nu\\xa0O\\x1e\\xd9\\xa6\\xa8\\x9cL\",\n" " [enc] = \"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c\"\n" " }\n" diff --git a/lib/cpp/test/JSONProtoTest.cpp b/lib/cpp/test/JSONProtoTest.cpp index fedf99e4821..b96638e7ad9 100644 --- a/lib/cpp/test/JSONProtoTest.cpp +++ b/lib/cpp/test/JSONProtoTest.cpp @@ -48,7 +48,7 @@ void testCaseSetup_1() { ooe->some_characters = "JSON THIS! \"\1"; ooe->zomg_unicode = "\xd7\n\a\t"; ooe->base64 = "\1\2\3\255"; - ooe->rfc4122_uuid = "00000000-0000-0000-0000-000000000000"; + ooe->rfc4122_uuid = apache::thrift::TUuid{"00000000-0000-0000-0000-000000000000"}; } BOOST_AUTO_TEST_CASE(test_json_proto_1) { @@ -85,7 +85,7 @@ void testCaseSetup_2() { "\xb0\xcf\x81\xe2\x84\x8e\x20\xce\x91\x74\x74" "\xce\xb1\xe2\x85\xbd\xce\xba\xc7\x83\xe2\x80" "\xbc"; - n->my_ooe.rfc4122_uuid = "5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"; + n->my_ooe.rfc4122_uuid = apache::thrift::TUuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}; n->my_bonk.type = 31337; n->my_bonk.message = "I am a bonk... xor!"; } diff --git a/lib/cpp/test/Makefile.am b/lib/cpp/test/Makefile.am index a7440392f85..adb923a10b7 100644 --- a/lib/cpp/test/Makefile.am +++ b/lib/cpp/test/Makefile.am @@ -83,6 +83,8 @@ Benchmark_LDADD = libtestgencpp.la check_PROGRAMS = \ UnitTests \ + UnitTestsUuid \ + UnitTestsUuidNoDirective \ TFDTransportTest \ TPipedTransportTest \ DebugProtoTest \ @@ -131,7 +133,8 @@ UnitTests_SOURCES = \ TServerSocketTest.cpp \ TServerTransportTest.cpp \ TTransportCheckThrow.h \ - ThrifttReadCheckTests.cpp + ThrifttReadCheckTests.cpp \ + TUuidTest.cpp UnitTests_LDADD = \ libtestgencpp.la \ @@ -139,6 +142,30 @@ UnitTests_LDADD = \ $(BOOST_SYSTEM_LDADD) \ $(BOOST_THREAD_LDADD) +UnitTestsUuid_SOURCES = \ + UnitTestMain.cpp \ + TUuidTestBoost.cpp + +UnitTestsUuid_LDADD = \ + libtestgencpp.la \ + $(BOOST_TEST_LDADD) \ + $(BOOST_SYSTEM_LDADD) \ + $(BOOST_THREAD_LDADD) + +UnitTestsUuid_CPPFLAGS = \ + $(AM_CPPFLAGS) \ + -DTHRIFT_TUUID_SUPPORT_BOOST_UUID + +UnitTestsUuidNoDirective_SOURCES = \ + UnitTestMain.cpp \ + TUuidTestBoostNoDirective.cpp + +UnitTestsUuidNoDirective_LDADD = \ + libtestgencpp.la \ + $(BOOST_TEST_LDADD) \ + $(BOOST_SYSTEM_LDADD) \ + $(BOOST_THREAD_LDADD) + TInterruptTest_SOURCES = \ TSocketInterruptTest.cpp \ TSSLSocketInterruptTest.cpp @@ -386,7 +413,7 @@ OpenSSLManualInitTest_LDADD = \ gen-cpp/AnnotationTest_constants.cpp gen-cpp/AnnotationTest_constants.h gen-cpp/AnnotationTest_types.cpp gen-cpp/AnnotationTest_types.h: $(top_srcdir)/test/AnnotationTest.thrift $(THRIFT) --gen cpp $< -gen-cpp/DebugProtoTest_types.cpp gen-cpp/DebugProtoTest_types.h gen-cpp/EmptyService.cpp gen-cpp/EmptyService.h: $(top_srcdir)/test/v0.16/DebugProtoTest.thrift +gen-cpp/DebugProtoTest_types.cpp gen-cpp/DebugProtoTest_types.h gen-cpp/EmptyService.cpp gen-cpp/EmptyService.h: $(top_srcdir)/test/DebugProtoTest.thrift $(THRIFT) --gen cpp $< gen-cpp/DoubleConstantsTest_constants.cpp gen-cpp/DoubleConstantsTest_constants.h: $(top_srcdir)/test/DoubleConstantsTest.thrift @@ -408,7 +435,7 @@ gen-cpp/Recursive_types.cpp gen-cpp/Recursive_types.h: $(top_srcdir)/test/Recurs gen-cpp/Service.cpp gen-cpp/StressTest_types.cpp: $(top_srcdir)/test/StressTest.thrift $(THRIFT) --gen cpp $< -gen-cpp/SecondService.cpp gen-cpp/ThriftTest_constants.cpp gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_types.cpp gen-cpp/ThriftTest_types.h: $(top_srcdir)/test/v0.16/ThriftTest.thrift +gen-cpp/SecondService.cpp gen-cpp/ThriftTest_constants.cpp gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_types.cpp gen-cpp/ThriftTest_types.h: $(top_srcdir)/test/ThriftTest.thrift $(THRIFT) --gen cpp $< gen-cpp/OneWayService.cpp gen-cpp/OneWayTest_types.h gen-cpp/OneWayService.h: OneWayTest.thrift diff --git a/lib/cpp/test/SpecializationTest.cpp b/lib/cpp/test/SpecializationTest.cpp index 097611284a7..7256c202998 100644 --- a/lib/cpp/test/SpecializationTest.cpp +++ b/lib/cpp/test/SpecializationTest.cpp @@ -26,7 +26,7 @@ BOOST_AUTO_TEST_CASE(test_specialization_1) { ooe.some_characters = "JSON THIS! \"\1"; ooe.zomg_unicode = "\xd7\n\a\t"; ooe.base64 = "\1\2\3\255"; - ooe.rfc4122_uuid = "00000000-0000-0000-0000-000000000000"; + ooe.rfc4122_uuid = apache::thrift::TUuid{"00000000-0000-0000-0000-000000000000"}; Nesting n; n.my_ooe = ooe; diff --git a/lib/cpp/test/TUuidTest.cpp b/lib/cpp/test/TUuidTest.cpp new file mode 100644 index 00000000000..4a521cf50f9 --- /dev/null +++ b/lib/cpp/test/TUuidTest.cpp @@ -0,0 +1,186 @@ +/* + * 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 +#include +#include +#include + +#include + +using apache::thrift::TUuid; + +BOOST_AUTO_TEST_SUITE(TUuidTest) + +BOOST_AUTO_TEST_CASE(construction) { + BOOST_TEST(TUuid().is_nil()); +} + +BOOST_AUTO_TEST_CASE(construction_string_valid) { + const std::string expected_1{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}; + + BOOST_TEST(to_string(TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c")) == expected_1); + BOOST_TEST(to_string(TUuid("{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}")) == expected_1); + BOOST_TEST(to_string(TUuid("{5e2ab18817264e75a04f1ed9a6a89c4c}")) == expected_1); + BOOST_TEST(to_string(TUuid("5e2ab18817264e75a04f1ed9a6a89c4c")) == expected_1); +} + +BOOST_AUTO_TEST_CASE(construction_string_invalid) { + // This test also ensures that the constructor does not throw + const std::string expected{"00000000-0000-0000-0000-000000000000"}; + + BOOST_TEST(to_string(TUuid("5e2ab188-1726-4e75-a04f")) == expected); + BOOST_TEST(to_string(TUuid("{}")) == expected); + BOOST_TEST(to_string(TUuid("{5e2ab18817264e75a04f1ed9a6a89c4c")) == expected); + BOOST_TEST(to_string(TUuid("5e2ab18817264e75a04f1ed9a689c4c")) == expected); +} + +BOOST_AUTO_TEST_CASE(compare) { + BOOST_TEST(TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c") + == TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c")); + BOOST_TEST(TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c") + != TUuid("00000000-1726-4e75-a04f-1ed9a6a89c4c")); + BOOST_TEST(TUuid("{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}") + == TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c")); + + // This comparison is expected to fail if strcmp is used + TUuid uuid_1{}; + TUuid uuid_2{}; + uuid_2.data()[15] = 0x64; + BOOST_TEST(uuid_1 != uuid_2); +} + +BOOST_AUTO_TEST_CASE(assign_valid) { + TUuid uuid_1{}; + BOOST_TEST(uuid_1.is_nil()); + uuid_1 = TUuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}; + BOOST_TEST(!uuid_1.is_nil()); + + BOOST_TEST(uuid_1 == TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c")); + + uuid_1 = TUuid{"{12345678-1726-4e75-a04f-1ed9a6a89c4c}"}; + BOOST_TEST(uuid_1 != TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c")); + BOOST_TEST(uuid_1 == TUuid("{12345678-1726-4e75-a04f-1ed9a6a89c4c}")); +} + +BOOST_AUTO_TEST_CASE(assign_invalid) { + TUuid uuid_1{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}; + BOOST_TEST(!uuid_1.is_nil()); + + BOOST_CHECK_NO_THROW(uuid_1 = TUuid{"123"}); + BOOST_TEST(uuid_1.is_nil()); + BOOST_TEST(to_string(uuid_1) == std::string{"00000000-0000-0000-0000-000000000000"}); +} + +BOOST_AUTO_TEST_CASE(swap) { + TUuid uuid_1{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}; + TUuid uuid_2{}; + BOOST_TEST(!uuid_1.is_nil()); + BOOST_TEST(uuid_2.is_nil()); + + using std::swap; + swap(uuid_1, uuid_2); + + BOOST_TEST(uuid_1.is_nil()); + BOOST_TEST(!uuid_2.is_nil()); + + BOOST_TEST(to_string(uuid_1) == std::string{"00000000-0000-0000-0000-000000000000"}); + BOOST_TEST(to_string(uuid_2) == std::string{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}); +} + +BOOST_AUTO_TEST_CASE(begin_end) { + TUuid uuid_1{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}; + BOOST_TEST(std::distance(std::begin(uuid_1), std::end(uuid_1)) == uuid_1.size()); +} + +BOOST_AUTO_TEST_CASE(into_boost_uuid) { + TUuid uuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}; + boost::uuids::uuid boost_uuid{}; + BOOST_TEST(boost_uuid.is_nil()); + std::copy(std::begin(uuid), std::end(uuid), boost_uuid.begin()); + BOOST_TEST(!boost_uuid.is_nil()); + BOOST_TEST(boost::uuids::to_string(boost_uuid) == "5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"); + BOOST_TEST(boost::uuids::to_string(boost_uuid) == to_string(uuid)); +} + +BOOST_AUTO_TEST_CASE(from_boost_uuid) { + static boost::uuids::string_generator gen; + boost::uuids::uuid boost_uuid{gen("1f610073-db33-4d21-adf2-75460d4955cc")}; + BOOST_TEST(!boost_uuid.is_nil()); + TUuid uuid; + BOOST_TEST(uuid.is_nil()); + + std::copy(std::begin(boost_uuid), std::end(boost_uuid), uuid.begin()); + BOOST_TEST(!uuid.is_nil()); + + BOOST_TEST(to_string(boost_uuid) == to_string(uuid)); +} + +BOOST_AUTO_TEST_CASE(test_byte_order_variant) { + TUuid uuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}; + boost::uuids::uuid boost_uuid{}; + BOOST_TEST(boost_uuid.is_nil()); + std::copy(std::begin(uuid), std::end(uuid), boost_uuid.begin()); + BOOST_TEST(!boost_uuid.is_nil()); + BOOST_TEST(boost_uuid.variant() == boost::uuids::uuid::variant_rfc_4122); +} + +BOOST_AUTO_TEST_CASE(test_byte_order_verify_network) { + const TUuid uuid{"{00112233-4455-6677-8899-aabbccddeeff}"}; + + for (uint8_t idx = 0; idx < uuid.size(); ++idx) { + const uint8_t expected = idx * 0x11; + BOOST_TEST(*(std::begin(uuid) + idx) == expected); + } + + const uint8_t test[16] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; + + TUuid new_uuid; + std::copy(std::begin(test), std::end(test), std::begin(new_uuid)); + + BOOST_TEST(!new_uuid.is_nil()); + BOOST_TEST(to_string(new_uuid) == std::string{"00112233-4455-6677-8899-aabbccddeeff"}); + + BOOST_TEST(new_uuid == uuid); +} + +BOOST_AUTO_TEST_CASE(test_character_buffer) { + + const uint8_t test[16] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; + + const TUuid uuid{test}; + + BOOST_TEST(to_string(uuid) == std::string{"00112233-4455-6677-8899-aabbccddeeff"}); +} + +BOOST_AUTO_TEST_CASE(test_boost_buffer) { + + static boost::uuids::string_generator gen; + boost::uuids::uuid boost_uuid{gen("1f610073-db33-4d21-adf2-75460d4955cc")}; + BOOST_TEST(!boost_uuid.is_nil()); + + const TUuid uuid{boost_uuid.data}; + + BOOST_TEST(to_string(boost_uuid) == to_string(uuid)); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/lib/cpp/test/TUuidTestBoost.cpp b/lib/cpp/test/TUuidTestBoost.cpp new file mode 100644 index 00000000000..81c35596e32 --- /dev/null +++ b/lib/cpp/test/TUuidTestBoost.cpp @@ -0,0 +1,65 @@ +/* + * 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 +#include +#include +#include + +#include + +using apache::thrift::TUuid; + +BOOST_AUTO_TEST_SUITE(TUuidBoostTest) + +BOOST_AUTO_TEST_CASE(compiler_directive) { + // Test if the macro is set as expected + #ifdef THRIFT_TUUID_SUPPORT_BOOST_UUID + BOOST_TEST(true); + #else + BOOST_TEST(false, "The 'THRIFT_TUUID_SUPPORT_BOOST_UUID' preprocessor directive must be set for these tests"); + #endif // THRIFT_TUUID_SUPPORT_BOOST_UUID +} + +BOOST_AUTO_TEST_CASE(from_boost_uuid_constructor) { + static boost::uuids::string_generator gen; + boost::uuids::uuid boost_uuid{gen("1f610073-db33-4d21-adf2-75460d4955cc")}; + BOOST_TEST(!boost_uuid.is_nil()); + const TUuid uuid{boost_uuid}; + BOOST_TEST(!uuid.is_nil()); + + BOOST_TEST(to_string(boost_uuid) == to_string(uuid)); + BOOST_TEST(to_string(uuid) == std::string{"1f610073-db33-4d21-adf2-75460d4955cc"}); +} + +BOOST_AUTO_TEST_CASE(from_boost_uuid_assignment) { + static boost::uuids::string_generator gen; + boost::uuids::uuid boost_uuid{gen("5cb719a4-cd15-4476-8bcc-f1834b2527ee")}; + BOOST_TEST(!boost_uuid.is_nil()); + TUuid uuid{}; + BOOST_TEST(uuid.is_nil()); + + uuid = boost_uuid; + + BOOST_TEST(to_string(boost_uuid) == to_string(uuid)); + BOOST_TEST(to_string(uuid) == std::string{"5cb719a4-cd15-4476-8bcc-f1834b2527ee"}); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/lib/cpp/test/TUuidTestBoostNoDirective.cpp b/lib/cpp/test/TUuidTestBoostNoDirective.cpp new file mode 100644 index 00000000000..8af9c3572eb --- /dev/null +++ b/lib/cpp/test/TUuidTestBoostNoDirective.cpp @@ -0,0 +1,82 @@ +/* + * 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 + +BOOST_AUTO_TEST_SUITE(TUuidBoostTestNoDirective) + +BOOST_AUTO_TEST_CASE(compiler_directive_not_set) { + // Test if the macro is set as expected + #ifdef THRIFT_TUUID_SUPPORT_BOOST_UUID + BOOST_TEST(false, "The 'THRIFT_TUUID_SUPPORT_BOOST_UUID' preprocessor must NOT be set for these tests"); + #else + BOOST_TEST(true); + #endif // THRIFT_TUUID_SUPPORT_BOOST_UUID +} +BOOST_AUTO_TEST_SUITE_END() + +// This inclusion order is unconventional: This test specifcially tests that +// the THRIFT_TUUID_SUPPORT_BOOST_UUID directive can be set before including the header +// to enable boost::uuid support without causing linking or other errors with +// the compiled thrift library. + +#define THRIFT_TUUID_SUPPORT_BOOST_UUID +#define THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT + +#include +#include + +#include +using apache::thrift::TUuid; + +BOOST_AUTO_TEST_SUITE(TUuidBoostTestNoDirective) + +BOOST_AUTO_TEST_CASE(compiler_directive_set) { + // Test if the macro is set as expected + #ifdef THRIFT_TUUID_SUPPORT_BOOST_UUID + BOOST_TEST(true); + #else + BOOST_TEST(false, "The 'THRIFT_TUUID_SUPPORT_BOOST_UUID' preprocessor must now be set for these tests"); + #endif // THRIFT_TUUID_SUPPORT_BOOST_UUID +} + +BOOST_AUTO_TEST_CASE(from_boost_uuid_constructor) { + static boost::uuids::string_generator gen; + boost::uuids::uuid boost_uuid{gen("5cb719a4-cd15-4476-8bcc-f1834b2527ee")}; + BOOST_TEST(!boost_uuid.is_nil()); + const TUuid uuid{boost_uuid}; + BOOST_TEST(!uuid.is_nil()); + + BOOST_TEST(to_string(boost_uuid) == to_string(uuid)); + BOOST_TEST(to_string(uuid) == std::string{"5cb719a4-cd15-4476-8bcc-f1834b2527ee"}); +} + +BOOST_AUTO_TEST_CASE(from_boost_uuid_assignment) { + static boost::uuids::string_generator gen; + boost::uuids::uuid boost_uuid{gen("1f610073-db33-4d21-adf2-75460d4955cc")}; + BOOST_TEST(!boost_uuid.is_nil()); + TUuid uuid{}; + BOOST_TEST(uuid.is_nil()); + + uuid = TUuid{boost_uuid}; + + BOOST_TEST(to_string(boost_uuid) == to_string(uuid)); + BOOST_TEST(to_string(uuid) == std::string{"1f610073-db33-4d21-adf2-75460d4955cc"}); +} +BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file diff --git a/lib/cpp/test/ToStringTest.cpp b/lib/cpp/test/ToStringTest.cpp index 68c82ad4be1..cb792df67b7 100644 --- a/lib/cpp/test/ToStringTest.cpp +++ b/lib/cpp/test/ToStringTest.cpp @@ -162,11 +162,11 @@ BOOST_AUTO_TEST_CASE(generated_nested_list_object_to_string) { BOOST_AUTO_TEST_CASE(generated_uuid_to_string) { thrift::test::CrazyNesting l; - l.uuid_field = "{4b686716-5f20-4deb-8ce0-9eaf379e8a3d}"; + l.uuid_field = apache::thrift::TUuid{"{4b686716-5f20-4deb-8ce0-9eaf379e8a3d}"}; BOOST_CHECK_EQUAL(to_string(l), "CrazyNesting(string_field=, set_field=, list_field=[], binary_field=, " - "uuid_field={4b686716-5f20-4deb-8ce0-9eaf379e8a3d})"); + "uuid_field=4b686716-5f20-4deb-8ce0-9eaf379e8a3d)"); } BOOST_AUTO_TEST_SUITE_END() diff --git a/test/cpp/src/TestClient.cpp b/test/cpp/src/TestClient.cpp index c15281a6a09..6bda29431ef 100644 --- a/test/cpp/src/TestClient.cpp +++ b/test/cpp/src/TestClient.cpp @@ -653,12 +653,12 @@ int main(int argc, char** argv) { /** * UUID TEST */ - const std::string expected_uuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}; - UUID_TEST(testUuid, std::string{"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"}, expected_uuid); - UUID_TEST(testUuid, std::string{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}, expected_uuid); - UUID_TEST(testUuid, std::string{"5e2ab18817264e75a04f1ed9a6a89c4c"}, expected_uuid); - UUID_TEST(testUuid, std::string{"{5e2ab18817264e75a04f1ed9a6a89c4c}"}, expected_uuid); - UUID_TEST(testUuid, std::string{}, std::string{"00000000-0000-0000-0000-000000000000"}); + const TUuid expected_uuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}; + UUID_TEST(testUuid, TUuid{"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"}, expected_uuid); + UUID_TEST(testUuid, TUuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}, expected_uuid); + UUID_TEST(testUuid, TUuid{"5e2ab18817264e75a04f1ed9a6a89c4c"}, expected_uuid); + UUID_TEST(testUuid, TUuid{"{5e2ab18817264e75a04f1ed9a6a89c4c}"}, expected_uuid); + UUID_TEST(testUuid, TUuid{}, TUuid{"00000000-0000-0000-0000-000000000000"}); /** * STRUCT TEST diff --git a/test/cpp/src/TestServer.cpp b/test/cpp/src/TestServer.cpp index afd293814de..dc6e69f6f0d 100644 --- a/test/cpp/src/TestServer.cpp +++ b/test/cpp/src/TestServer.cpp @@ -132,8 +132,8 @@ class TestHandler : public ThriftTestIf { _return = thing; } - std::string testUuid(const std::string thing) override { - printf("testUuid(\"{%s}\")\n", thing.c_str()); + TUuid testUuid(const TUuid thing) override { + printf("testUuid(\"{%s}\")\n", to_string(thing).c_str()); return thing; } @@ -447,8 +447,8 @@ class TestHandlerAsync : public ThriftTestCobSvIf { cob(res); } - void testUuid(::std::function cob, const std::string thing) override { - std::string res = _delegate->testUuid(thing); + void testUuid(::std::function cob, const TUuid thing) override { + TUuid res = _delegate->testUuid(thing); cob(res); } From ba30b077f41c8a85018bebd1331fe2e26af8c929 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 20:01:43 +0000 Subject: [PATCH 078/430] Bump braces from 3.0.2 to 3.0.3 in /lib/ts Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] --- lib/ts/package-lock.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/ts/package-lock.json b/lib/ts/package-lock.json index 31e0c52d69f..61a3a27d48c 100644 --- a/lib/ts/package-lock.json +++ b/lib/ts/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "thrift", - "version": "0.20.0", + "version": "0.21.0", "license": "Apache-2.0", "dependencies": { "bufferutil": "^4.0.1", @@ -427,12 +427,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1465,9 +1465,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" From 14185fc65c8bde52a3961956ad086c4a653c9901 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 20:01:33 +0000 Subject: [PATCH 079/430] Bump ws from 6.2.2 to 6.2.3 in /lib/ts Bumps [ws](https://github.com/websockets/ws) from 6.2.2 to 6.2.3. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/6.2.2...6.2.3) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] --- lib/ts/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ts/package-lock.json b/lib/ts/package-lock.json index 61a3a27d48c..ee1592ea654 100644 --- a/lib/ts/package-lock.json +++ b/lib/ts/package-lock.json @@ -4951,9 +4951,9 @@ "dev": true }, "node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "dependencies": { "async-limiter": "~1.0.0" From 1252cf3a2f3b1d942c8c4713ed7b2cf35c64e547 Mon Sep 17 00:00:00 2001 From: uv747 Date: Sat, 11 May 2024 11:14:25 +0800 Subject: [PATCH 080/430] optimizing performance issues under large-scale connection --- lib/cpp/src/thrift/server/TNonblockingServer.cpp | 13 +++++-------- lib/cpp/src/thrift/server/TNonblockingServer.h | 3 ++- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/cpp/src/thrift/server/TNonblockingServer.cpp b/lib/cpp/src/thrift/server/TNonblockingServer.cpp index ae92da3afbf..d53535bdadc 100644 --- a/lib/cpp/src/thrift/server/TNonblockingServer.cpp +++ b/lib/cpp/src/thrift/server/TNonblockingServer.cpp @@ -886,8 +886,8 @@ void TNonblockingServer::TConnection::checkIdleBufferMemLimit(size_t readLimit, TNonblockingServer::~TNonblockingServer() { // Close any active connections (moves them to the idle connection stack) - while (activeConnections_.size()) { - activeConnections_.front()->close(); + while (!activeConnections_.empty()) { + (*activeConnections_.begin())->close(); } // Clean up unused TConnection objects in connectionStack_ while (!connectionStack_.empty()) { @@ -931,7 +931,8 @@ TNonblockingServer::TConnection* TNonblockingServer::createConnection(std::share result->setSocket(socket); result->init(ioThread); } - activeConnections_.push_back(result); + + activeConnections_.insert(result); return result; } @@ -941,11 +942,7 @@ TNonblockingServer::TConnection* TNonblockingServer::createConnection(std::share void TNonblockingServer::returnConnection(TConnection* connection) { Guard g(connMutex_); - activeConnections_.erase(std::remove(activeConnections_.begin(), - activeConnections_.end(), - connection), - activeConnections_.end()); - + activeConnections_.erase(connection); if (connectionStackLimit_ && (connectionStack_.size() >= connectionStackLimit_)) { delete connection; --numTConnections_; diff --git a/lib/cpp/src/thrift/server/TNonblockingServer.h b/lib/cpp/src/thrift/server/TNonblockingServer.h index 65e569dcf03..9f813ed055e 100644 --- a/lib/cpp/src/thrift/server/TNonblockingServer.h +++ b/lib/cpp/src/thrift/server/TNonblockingServer.h @@ -36,6 +36,7 @@ #include #include #include +#include #ifdef HAVE_UNISTD_H #include #endif @@ -259,7 +260,7 @@ class TNonblockingServer : public TServer { * which in turn allows their transports, protocols, processors and handlers * to deallocate and clean up correctly. */ - std::vector activeConnections_; + std::unordered_set activeConnections_; /* */ From f13d85afbeba44552cb5e574ba34610a243e4e62 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sat, 29 Jun 2024 00:35:54 +0200 Subject: [PATCH 081/430] =?UTF-8?q?THRIFT-5654=20LNK4042=20and=20LNK2019?= =?UTF-8?q?=20in=20go=5Fvalidator=5Fgenerator.cc=20with=20VS2022=20Patch:?= =?UTF-8?q?=20Ey=C3=BCp=20Volkan=20&=20Jens=20Geyer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compiler/cpp/compiler.vcxproj | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/compiler/cpp/compiler.vcxproj b/compiler/cpp/compiler.vcxproj index 9fbf903a43a..9cc2ccbb786 100644 --- a/compiler/cpp/compiler.vcxproj +++ b/compiler/cpp/compiler.vcxproj @@ -83,6 +83,8 @@ + + @@ -103,23 +105,27 @@ Application true MultiByte + v143 Application true MultiByte + v143 Application false true MultiByte + v143 Application false true MultiByte + v143 @@ -248,4 +254,4 @@ - + \ No newline at end of file From 98a1ba250f4dd904d0d01388259baa147c7e3146 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 22:48:37 +0000 Subject: [PATCH 082/430] Bump ws from 6.2.2 to 6.2.3 in /lib/js Bumps [ws](https://github.com/websockets/ws) from 6.2.2 to 6.2.3. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/6.2.2...6.2.3) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] --- lib/js/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/js/package-lock.json b/lib/js/package-lock.json index 4b283fc3acb..562e38f5259 100644 --- a/lib/js/package-lock.json +++ b/lib/js/package-lock.json @@ -3926,9 +3926,9 @@ "dev": true }, "node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "dependencies": { "async-limiter": "~1.0.0" From 0ed4a1deb441d71d928cf7fc58701ce1da6574dd Mon Sep 17 00:00:00 2001 From: bwangelme Date: Mon, 15 Apr 2024 12:17:40 +0800 Subject: [PATCH 083/430] THRIFT-5777: python fix mismatched timeout exceptions Client: ["python"] --- lib/py/src/transport/TSocket.py | 4 ++-- lib/py/test/test_socket.py | 18 ++++++++++++++++++ lib/py/test/test_sslsocket.py | 5 ++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/py/src/transport/TSocket.py b/lib/py/src/transport/TSocket.py index 50ee67e7665..c8b4287f973 100644 --- a/lib/py/src/transport/TSocket.py +++ b/lib/py/src/transport/TSocket.py @@ -151,6 +151,8 @@ def open(self): def read(self, sz): try: buff = self.handle.recv(sz) + except socket.timeout as e: + raise TTransportException(type=TTransportException.TIMED_OUT, message="read timeout", inner=e) except socket.error as e: if (e.args[0] == errno.ECONNRESET and (sys.platform == 'darwin' or sys.platform.startswith('freebsd'))): @@ -161,8 +163,6 @@ def read(self, sz): self.close() # Trigger the check to raise the END_OF_FILE exception below. buff = '' - elif e.args[0] == errno.ETIMEDOUT: - raise TTransportException(type=TTransportException.TIMED_OUT, message="read timeout", inner=e) else: raise TTransportException(message="unexpected exception", inner=e) if len(buff) == 0: diff --git a/lib/py/test/test_socket.py b/lib/py/test/test_socket.py index b732653a4d2..ab56a6ec3fc 100644 --- a/lib/py/test/test_socket.py +++ b/lib/py/test/test_socket.py @@ -11,6 +11,24 @@ class TSocketTest(unittest.TestCase): + def test_socket_readtimeout_exception(self): + acc = ServerAcceptor(TServerSocket(port=0)) + acc.start() + + sock = TSocket(host="localhost", port=acc.port) + sock.open() + sock.setTimeout(1) + sock.write(b"sleep") + + with self.assertRaises(TTransportException) as ctx: + sock.read(5) + exc = ctx.exception + self.assertEqual(exc.message, "read timeout") + + acc.client.close() # this also blocks until the other thread is done + acc.close() + sock.close() + def test_isOpen_checks_for_readability(self): # https://docs.python.org/3/library/socket.html#notes-on-socket-timeouts # https://docs.python.org/3/library/socket.html#socket.socket.settimeout diff --git a/lib/py/test/test_sslsocket.py b/lib/py/test/test_sslsocket.py index a5ea06ae9e4..2cbf5f8dde2 100644 --- a/lib/py/test/test_sslsocket.py +++ b/lib/py/test/test_sslsocket.py @@ -19,6 +19,7 @@ import inspect import logging +import time import os import platform import ssl @@ -76,7 +77,9 @@ def run(self): try: self._client = self._server.accept() if self._client: - self._client.read(5) # hello + data = self._client.read(5) # hello/sleep + if data == b"sleep": + time.sleep(2) self._client.write(b"there") except Exception: logging.exception('error on server side (%s):' % self.name) From 1405831722ac0e1e1ba100801bf21073a0d17940 Mon Sep 17 00:00:00 2001 From: Charles Coulombe Date: Mon, 15 Apr 2024 20:29:50 -0400 Subject: [PATCH 084/430] Use pip install instead of deprecated python setup.py install command --- lib/py/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/py/Makefile.am b/lib/py/Makefile.am index b76a7dc5dc8..4777ccff8d9 100644 --- a/lib/py/Makefile.am +++ b/lib/py/Makefile.am @@ -45,7 +45,7 @@ all-local: py3-build # Old version (can't put inline because it's not portable). #$(PYTHON) setup.py install --prefix=$(prefix) --root=$(DESTDIR) $(PYTHON_SETUPUTIL_ARGS) install-exec-hook: - $(PYTHON) setup.py install --root=$(DESTDIR) --prefix=$(PY_PREFIX) $(PYTHON_SETUPUTIL_ARGS) + $(PYTHON) -m pip install . --root=$(DESTDIR) --prefix=$(PY_PREFIX) $(PYTHON_SETUPUTIL_ARGS) check-local: all py3-test $(PYTHON) test/thrift_json.py From 259107e0460300a5a546e6f4563034d5e3ecd156 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Wed, 3 Jul 2024 14:25:34 -0700 Subject: [PATCH 085/430] Remove trailing space from compiler generated go code Client: go --- compiler/cpp/src/thrift/generate/t_go_generator.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc index a42c71ad5e6..8ed914009db 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc @@ -822,10 +822,10 @@ void t_go_generator::generate_enum(t_enum* tenum) { if (iter_std_name != escape_string(iter_name)) { from_string_mapping << indent() << "case \"" << iter_std_name << "\", \"" << escape_string(iter_name) << "\": return " << tenum_name << "_" - << iter_name << ", nil " << '\n'; + << iter_name << ", nil" << '\n'; } else { from_string_mapping << indent() << "case \"" << iter_std_name << "\": return " << tenum_name - << "_" << iter_name << ", nil " << '\n'; + << "_" << iter_name << ", nil" << '\n'; } } @@ -2714,7 +2714,7 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << "defer " << mbTrans << ".Close()" << '\n'; f_remote << indent() << "_, " << err1 << " := " << mbTrans << ".WriteString(" << arg << ")" << '\n'; - f_remote << indent() << "if " << err1 << " != nil { " << '\n'; + f_remote << indent() << "if " << err1 << " != nil {" << '\n'; indent_up(); f_remote << indent() << "Usage()" << '\n'; f_remote << indent() << "return" << '\n'; From 86b05bf2294de5202f22033a2713f100c493b067 Mon Sep 17 00:00:00 2001 From: Steve Licking Date: Fri, 31 Dec 2021 10:54:05 -0800 Subject: [PATCH 086/430] THRIFT-5492: Add readEnd to TBufferedTransport client: cpp Patch: Steve Licking --- lib/cpp/src/thrift/transport/TBufferTransports.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/cpp/src/thrift/transport/TBufferTransports.h b/lib/cpp/src/thrift/transport/TBufferTransports.h index f72d8f6bfda..8518800a44f 100644 --- a/lib/cpp/src/thrift/transport/TBufferTransports.h +++ b/lib/cpp/src/thrift/transport/TBufferTransports.h @@ -269,6 +269,11 @@ class TBufferedTransport : public TVirtualTransport Date: Fri, 20 Jan 2023 15:12:25 -0500 Subject: [PATCH 087/430] lib: cpp: mitigate warnings due to non-virtual destructors Commit 042580f53441efe1bc5c80c89351fcb30740659e removed the `virtual` keyword from the declaration of `~TConnectedClient()`. While mostly benign, it does cause a warning in some versions of GCC, which can throw off CI sometimes when building with `-Werror`. Signed-off-by: Chris Friedt --- lib/cpp/src/thrift/TNonCopyable.h | 2 +- lib/cpp/src/thrift/async/TConcurrentClientSyncInfo.h | 4 ++-- lib/cpp/src/thrift/async/TEvhttpServer.h | 2 +- lib/cpp/src/thrift/transport/TFileTransport.h | 2 +- lib/cpp/src/thrift/windows/OverlappedSubmissionThread.h | 4 ++-- lib/cpp/src/thrift/windows/Sync.h | 8 ++++---- lib/cpp/src/thrift/windows/TWinsockSingleton.h | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/cpp/src/thrift/TNonCopyable.h b/lib/cpp/src/thrift/TNonCopyable.h index a60f1f0fb4b..51c94e2a0d5 100644 --- a/lib/cpp/src/thrift/TNonCopyable.h +++ b/lib/cpp/src/thrift/TNonCopyable.h @@ -30,7 +30,7 @@ namespace thrift { class TNonCopyable { protected: TNonCopyable() = default; - ~TNonCopyable() = default; + virtual ~TNonCopyable() = default; TNonCopyable(const TNonCopyable&) = delete; TNonCopyable& operator=(const TNonCopyable&) = delete; diff --git a/lib/cpp/src/thrift/async/TConcurrentClientSyncInfo.h b/lib/cpp/src/thrift/async/TConcurrentClientSyncInfo.h index 0bc5eb565f5..dd9b055e87e 100644 --- a/lib/cpp/src/thrift/async/TConcurrentClientSyncInfo.h +++ b/lib/cpp/src/thrift/async/TConcurrentClientSyncInfo.h @@ -36,7 +36,7 @@ class TConcurrentClientSyncInfo; class TConcurrentSendSentry { public: explicit TConcurrentSendSentry(TConcurrentClientSyncInfo* sync); - ~TConcurrentSendSentry(); + virtual ~TConcurrentSendSentry(); void commit(); @@ -48,7 +48,7 @@ class TConcurrentSendSentry { class TConcurrentRecvSentry { public: TConcurrentRecvSentry(TConcurrentClientSyncInfo* sync, int32_t seqid); - ~TConcurrentRecvSentry(); + virtual ~TConcurrentRecvSentry(); void commit(); diff --git a/lib/cpp/src/thrift/async/TEvhttpServer.h b/lib/cpp/src/thrift/async/TEvhttpServer.h index c5bf3b6eef4..aecfadef2fb 100644 --- a/lib/cpp/src/thrift/async/TEvhttpServer.h +++ b/lib/cpp/src/thrift/async/TEvhttpServer.h @@ -50,7 +50,7 @@ class TEvhttpServer { */ TEvhttpServer(std::shared_ptr processor, int port); - ~TEvhttpServer(); + virtual ~TEvhttpServer(); static void request(struct evhttp_request* req, void* self); int serve(); diff --git a/lib/cpp/src/thrift/transport/TFileTransport.h b/lib/cpp/src/thrift/transport/TFileTransport.h index 608cff18411..902d9061df8 100644 --- a/lib/cpp/src/thrift/transport/TFileTransport.h +++ b/lib/cpp/src/thrift/transport/TFileTransport.h @@ -123,7 +123,7 @@ typedef struct readState { class TFileTransportBuffer { public: TFileTransportBuffer(uint32_t size); - ~TFileTransportBuffer(); + virtual ~TFileTransportBuffer(); bool addEvent(eventInfo* event); eventInfo* getNext(); diff --git a/lib/cpp/src/thrift/windows/OverlappedSubmissionThread.h b/lib/cpp/src/thrift/windows/OverlappedSubmissionThread.h index 057f623b99a..7326a9c0e28 100644 --- a/lib/cpp/src/thrift/windows/OverlappedSubmissionThread.h +++ b/lib/cpp/src/thrift/windows/OverlappedSubmissionThread.h @@ -105,7 +105,7 @@ class TOverlappedSubmissionThread : apache::thrift::TNonCopyable { // thread details private: TOverlappedSubmissionThread(); - ~TOverlappedSubmissionThread(); + virtual ~TOverlappedSubmissionThread(); void run(); static unsigned __stdcall thread_proc(void* addr); @@ -122,7 +122,7 @@ class TAutoOverlapThread : apache::thrift::TNonCopyable { public: TAutoOverlapThread() : p(TOverlappedSubmissionThread::acquire_instance()) {} - ~TAutoOverlapThread() { TOverlappedSubmissionThread::release_instance(); } + virtual ~TAutoOverlapThread() { TOverlappedSubmissionThread::release_instance(); } TOverlappedSubmissionThread* operator->() { return p; } }; } diff --git a/lib/cpp/src/thrift/windows/Sync.h b/lib/cpp/src/thrift/windows/Sync.h index a5b2ac50f0d..89aaead7795 100644 --- a/lib/cpp/src/thrift/windows/Sync.h +++ b/lib/cpp/src/thrift/windows/Sync.h @@ -58,7 +58,7 @@ namespace thrift { struct TCriticalSection : apache::thrift::TNonCopyable { CRITICAL_SECTION cs; TCriticalSection() { InitializeCriticalSection(&cs); } - ~TCriticalSection() { DeleteCriticalSection(&cs); } + virtual ~TCriticalSection() { DeleteCriticalSection(&cs); } }; class TAutoCrit : apache::thrift::TNonCopyable { @@ -67,7 +67,7 @@ class TAutoCrit : apache::thrift::TNonCopyable { public: explicit TAutoCrit(TCriticalSection& cs) : cs_(&cs.cs) { EnterCriticalSection(cs_); } - ~TAutoCrit() { LeaveCriticalSection(cs_); } + virtual ~TAutoCrit() { LeaveCriticalSection(cs_); } }; struct TAutoResetEvent : apache::thrift::TNonCopyable { @@ -80,7 +80,7 @@ struct TAutoResetEvent : apache::thrift::TNonCopyable { throw apache::thrift::concurrency::SystemResourceException("CreateEvent failed"); } } - ~TAutoResetEvent() { CloseHandle(h); } + virtual ~TAutoResetEvent() { CloseHandle(h); } }; struct TManualResetEvent : apache::thrift::TNonCopyable { @@ -93,7 +93,7 @@ struct TManualResetEvent : apache::thrift::TNonCopyable { throw apache::thrift::concurrency::SystemResourceException("CreateEvent failed"); } } - ~TManualResetEvent() { CloseHandle(h); } + virtual ~TManualResetEvent() { CloseHandle(h); } }; struct TAutoHandle : apache::thrift::TNonCopyable { diff --git a/lib/cpp/src/thrift/windows/TWinsockSingleton.h b/lib/cpp/src/thrift/windows/TWinsockSingleton.h index a098d2c7144..a8e517aabb9 100644 --- a/lib/cpp/src/thrift/windows/TWinsockSingleton.h +++ b/lib/cpp/src/thrift/windows/TWinsockSingleton.h @@ -54,7 +54,7 @@ class TWinsockSingleton : private apache::thrift::TNonCopyable { TWinsockSingleton(void); public: - ~TWinsockSingleton(void); + virtual ~TWinsockSingleton(void); public: static void create(void); From 5b9ae5ee35481c8cb0d54318bf06d0672f1b6498 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 18 Jul 2024 03:20:40 +0200 Subject: [PATCH 088/430] THRIFT-5795 namespace not properly escaped Client: netstd Patch: Jens Geyer --- .../src/thrift/generate/t_netstd_generator.cc | 15 +++++++++- ...rift.PublicInterfaces.Compile.Tests.csproj | 1 + .../Thrift5795.thrift | 28 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5795.thrift diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc index aa570ec7f0f..a652e190637 100644 --- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc @@ -314,7 +314,20 @@ void t_netstd_generator::start_netstd_namespace(ostream& out) { if (!namespace_name_.empty()) { - out << "namespace " << namespace_name_ << '\n'; + std::string normalized; + + const char* delim = "."; + char* str = strdup(namespace_name_.c_str()); + char* next = strtok(str, delim); + while( next != NULL) { + if( normalized.length() > 0) { + normalized += "."; + } + normalized += normalize_name(next,false); + next = strtok(NULL, delim); + } + + out << "namespace " << normalized << '\n'; scope_up(out); } } diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj index e96d2fe3ac8..9b771d96e83 100644 --- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj +++ b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj @@ -77,6 +77,7 @@ + diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5795.thrift b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5795.thrift new file mode 100644 index 00000000000..7bad8d76a7b --- /dev/null +++ b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5795.thrift @@ -0,0 +1,28 @@ +/* + * 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. + */ + +// Testcase for THRIFT-5795 namespace not properly escaped + +namespace * Thrift5795.default + + +struct foo { + 1: double bar; +} + From 32b58e5a8bf52f066f02b48917e4a4e44dd3d674 Mon Sep 17 00:00:00 2001 From: Sven Roederer Date: Thu, 18 Jul 2024 15:25:33 +0200 Subject: [PATCH 089/430] CI/appveyor: fix download location for flex-sdk Current build seem to fail on downloading flex-SDK. Use new location according to https://stackoverflow.com/a/21269691/19761878 --- build/appveyor/MSVC-appveyor-full.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/appveyor/MSVC-appveyor-full.bat b/build/appveyor/MSVC-appveyor-full.bat index 49a3f94a0e5..d0f03477183 100644 --- a/build/appveyor/MSVC-appveyor-full.bat +++ b/build/appveyor/MSVC-appveyor-full.bat @@ -137,7 +137,7 @@ pip.exe ^ :: Adobe Flex SDK 4.6 for ActionScript MKDIR "C:\Adobe\Flex\SDK\4.6" || EXIT /B -appveyor DownloadFile http://download.macromedia.com/pub/flex/sdk/flex_sdk_4.6.zip -FileName C:\Adobe\Flex\SDK\4.6\SDK.zip || EXIT /B +appveyor DownloadFile https://fpdownload.adobe.com/pub/flex/sdk/builds/flex4.6/flex_sdk_4.6.0.23201B.zip -FileName C:\Adobe\Flex\SDK\4.6\SDK.zip || EXIT /B CD "C:\Adobe\Flex\SDK\4.6" || EXIT /B 7z x SDK.zip || EXIT /B SETX FLEX_HOME "C:\Adobe\Flex\SDK\4.6" From 3caf963e489a88710484ff3f7adae5f7d2dc5b34 Mon Sep 17 00:00:00 2001 From: Sven Roederer Date: Tue, 16 Jul 2024 14:46:18 +0200 Subject: [PATCH 090/430] Testcase for THRIFT-5794 Client: netstd Patch: Sven Roederer & Jens Geyer This closes #3000 This closes #2999 --- lib/netstd/Makefile.am | 3 +- lib/netstd/README.md | 5 +-- ...rift.PublicInterfaces.Compile.Tests.csproj | 19 ++++++---- .../Thrift5794-net6.thrift | 35 +++++++++++++++++++ .../Thrift5794-net8.thrift | 35 +++++++++++++++++++ .../Thrift5794-netstd.thrift | 35 +++++++++++++++++++ lib/netstd/Thrift.sln | 4 +-- 7 files changed, 124 insertions(+), 12 deletions(-) create mode 100644 lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net6.thrift create mode 100644 lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net8.thrift create mode 100644 lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-netstd.thrift diff --git a/lib/netstd/Makefile.am b/lib/netstd/Makefile.am index ccaef9e4c69..bcfe22e1d9f 100644 --- a/lib/netstd/Makefile.am +++ b/lib/netstd/Makefile.am @@ -17,7 +17,7 @@ # under the License. # -SUBDIRS = . +SUBDIRS = . all-local: $(DOTNETCORE) build -c Release @@ -77,4 +77,3 @@ EXTRA_DIST = \ build.sh \ runtests.cmd \ runtests.sh - diff --git a/lib/netstd/README.md b/lib/netstd/README.md index d554e38543b..912ea011c1d 100644 --- a/lib/netstd/README.md +++ b/lib/netstd/README.md @@ -5,13 +5,14 @@ Thrift client library for Microsoft .NET Standard # Build the library ## How to build on Windows -- Get Thrift IDL compiler executable, add to some folder and add path to this folder into PATH variable +- Get Thrift IDL compiler executable, add to some folder and add path to this folder into PATH variable. +- Alternatively, build from source by using the cmake target "copy-thrift-compiler", which places the binary to a suitable place. - Open the Thrift.sln project with Visual Studio and build. or - Build with scripts ## How to build on Unix/Linux -- Ensure you have .NET Core SDK 3.1 (LTS) installed, or use the [Ubuntu docker image](../../build/docker/README.md) +- Ensure you have a suitable .NET Core SDK installed, or use the [Ubuntu docker image](../../build/docker/README.md) - Follow common automake build practice: `./ bootstrap && ./ configure && make` ## Known issues diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj index 9b771d96e83..79224233bc8 100644 --- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj +++ b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj @@ -7,9 +7,9 @@ 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 @@ -46,19 +46,22 @@ + + + - + - + - + - + @@ -78,6 +81,10 @@ + + + + diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net6.thrift b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net6.thrift new file mode 100644 index 00000000000..7263360703e --- /dev/null +++ b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net6.thrift @@ -0,0 +1,35 @@ +/* + * 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. + */ + +// Testcase for THRIFT-5794 uncompilable code generated w/o net8 option + +namespace * Thrift5794.net6 + +struct foo { + 1: double a; + 2: double b; + 3: double c; +} + +struct bar { + 1: required double a; + 2: required double b; + 3: double c; +} + diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net8.thrift b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net8.thrift new file mode 100644 index 00000000000..f6c5f314127 --- /dev/null +++ b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net8.thrift @@ -0,0 +1,35 @@ +/* + * 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. + */ + +// Testcase for THRIFT-5794 uncompilable code generated w/o net8 option + +namespace * Thrift5794.net8 + +struct foo { + 1: double a; + 2: double b; + 3: double c; +} + +struct bar { + 1: required double a; + 2: required double b; + 3: double c; +} + diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-netstd.thrift b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-netstd.thrift new file mode 100644 index 00000000000..64d962ba705 --- /dev/null +++ b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-netstd.thrift @@ -0,0 +1,35 @@ +/* + * 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. + */ + +// Testcase for THRIFT-5794 uncompilable code generated w/o net8 option + +namespace * Thrift5794.netstd + +struct foo { + 1: double a; + 2: double b; + 3: double c; +} + +struct bar { + 1: required double a; + 2: required double b; + 3: double c; +} + diff --git a/lib/netstd/Thrift.sln b/lib/netstd/Thrift.sln index 58c76ced98e..dd5dba94f7e 100644 --- a/lib/netstd/Thrift.sln +++ b/lib/netstd/Thrift.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29905.134 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34728.123 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{ED5A45B0-07D1-4507-96B7-83FBD3D031CA}" EndProject From 1e54480f5ff859434c5521004883a4098a7f2ea0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 20:01:03 +0000 Subject: [PATCH 091/430] Bump ws from 5.2.3 to 5.2.4 Bumps [ws](https://github.com/websockets/ws) from 5.2.3 to 5.2.4. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/5.2.3...5.2.4) --- updated-dependencies: - dependency-name: ws dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5c3b06dd2f2..8fc75aacbd0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "thrift", - "version": "0.20.0", + "version": "0.21.0", "license": "Apache-2.0", "dependencies": { "browser-or-node": "^1.2.1", @@ -3923,9 +3923,9 @@ } }, "node_modules/ws": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.4.tgz", + "integrity": "sha512-fFCejsuC8f9kOSu9FYaOw8CdO68O3h5v0lg4p74o8JqWpwTf9tniOD+nOB78aWoVSS6WptVUmDrp/KPsMVBWFQ==", "dependencies": { "async-limiter": "~1.0.0" } From 4ea44ac546c9545e134e65502e2467b08caf2bfa Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 19 Jul 2024 00:49:03 +0200 Subject: [PATCH 092/430] THRIFT-5797 HashSet() CTOR takes no argument for net < 5 Client: netstd Patch: Jens Geyer --- .../cpp/src/thrift/generate/t_netstd_generator.cc | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc index a652e190637..01ba442c5d9 100644 --- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc @@ -360,7 +360,7 @@ string t_netstd_generator::netstd_type_usings() const namespaces += "using System.ServiceModel;\n"; namespaces += "using System.Runtime.Serialization;\n"; } - + return namespaces; } @@ -814,7 +814,11 @@ void t_netstd_generator::generate_extensions(ostream& out, map string suffix(""); string tmp_instance = tmp("tmp"); - out << indent() << "var " << tmp_instance << " = new " << iter->first << "(source.Count);" << '\n'; + if( (target_net_version < 5) && iter->second->is_set()) { + out << indent() << "var " << tmp_instance << " = new " << iter->first << "();" << '\n'; + } else { + out << indent() << "var " << tmp_instance << " = new " << iter->first << "(source.Count);" << '\n'; + } if( iter->second->is_map()) { t_map* tmap = static_cast(iter->second); @@ -2864,7 +2868,11 @@ void t_netstd_generator::generate_deserialize_container(ostream& out, t_type* tt out << indent() << "var " << obj << " = await iprot.ReadListBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'; } - out << indent() << prefix << " = new " << type_name(ttype) << "(" << obj << ".Count);" << '\n'; + if( (target_net_version < 5) && ttype->is_set()) { + out << indent() << prefix << " = new " << type_name(ttype) << "();" << '\n'; + } else { + out << indent() << prefix << " = new " << type_name(ttype) << "(" << obj << ".Count);" << '\n'; + } string i = tmp("_i"); out << indent() << "for(int " << i << " = 0; " << i << " < " << obj << ".Count; ++" << i << ")" << '\n' << indent() << "{" << '\n'; From 4ea20aafb5dac0e52cecf2aa376357d2a552be45 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 19 Jul 2024 00:49:03 +0200 Subject: [PATCH 093/430] THRIFT-5796 Indicate target environment via #if check Client: netstd Patch: Jens Geyer --- .../cpp/src/thrift/generate/t_netstd_generator.cc | 14 ++++++++++++++ .../Thrift.PublicInterfaces.Compile.Tests.csproj | 2 ++ tutorial/netstd/Interfaces/Interfaces.csproj | 6 +++--- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc index 01ba442c5d9..be4da42136d 100644 --- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc @@ -202,6 +202,20 @@ void t_netstd_generator::reset_indent() { void t_netstd_generator::pragmas_and_directives(ostream& out) { + if( target_net_version >= 8) { + out << "// targeting net 8" << '\n'; + out << "#if( !NET8_0_OR_GREATER)" << '\n'; + } else if( target_net_version >= 6) { + out << "// targeting net 6" << '\n'; + out << "#if( NET8_0_OR_GREATER || !NET6_0_OR_GREATER)" << '\n'; + } else { + out << "// targeting netstandard 2.x" << '\n'; + out << "#if(! NETSTANDARD2_0_OR_GREATER)" << '\n'; + } + out << "#error Unexpected target platform. See 'thrift --help' for details." << '\n'; + out << "#endif" << '\n'; + out << '\n'; + if( target_net_version >= 6) { out << "// Thrift code generated for net" << target_net_version << '\n'; out << "#nullable enable // requires C# 8.0" << '\n'; diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj index 79224233bc8..7e5f790cdf8 100644 --- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj +++ b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj @@ -82,8 +82,10 @@ + diff --git a/tutorial/netstd/Interfaces/Interfaces.csproj b/tutorial/netstd/Interfaces/Interfaces.csproj index 73a09358ac1..b0de8423016 100644 --- a/tutorial/netstd/Interfaces/Interfaces.csproj +++ b/tutorial/netstd/Interfaces/Interfaces.csproj @@ -41,8 +41,8 @@ - - - + + + From 0f0e11fbcee4f9230fdba6c7020c9f10fd09684a Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 19 Jul 2024 00:44:43 +0200 Subject: [PATCH 094/430] THRIFT-5798 Expand netstd compile tests to fully cover all current target environments Client: netstd Patch: Jens Geyer This closes #3008 --- build/veralign.sh | 6 +- .../src/thrift/generate/t_netstd_generator.cc | 5 +- debian/copyright | 8 +- lib/netstd/Makefile.am | 24 +++-- .../CassandraTest.thrift | 0 .../GlobalSuppressions.cs | 0 .../Impl/Thrift5253/MyService.cs | 2 +- .../Properties/AssemblyInfo.cs | 40 +++++++++ .../Thrift.Compile.net6.csproj | 90 +++++++++++++++++++ .../Impl/Thrift5253/MyService.cs | 70 +++++++++++++++ .../Properties/AssemblyInfo.cs | 40 +++++++++ .../Thrift.Compile.net8.csproj} | 32 +++---- .../Impl/Thrift5253/MyService.cs | 70 +++++++++++++++ .../Properties/AssemblyInfo.cs | 0 .../Thrift.Compile.netstd2.csproj | 83 +++++++++++++++++ .../Thrift5253.thrift | 0 .../Thrift5320.enum.thrift | 0 .../Thrift5320.exception.thrift | 0 .../Thrift5320.struct.thrift | 0 .../Thrift5320.thrift | 0 .../Thrift5382.objs.thrift | 0 .../Thrift5382.thrift | 0 .../Thrift5794.thrift} | 0 .../Thrift5795.thrift | 0 .../name_conflicts.enum.thrift | 0 .../name_conflicts.thrift | 0 .../optional_required_default.thrift | 0 .../Thrift5794-net8.thrift | 35 -------- .../Thrift5794-netstd.thrift | 35 -------- .../Tests/Thrift.Tests/Thrift.Tests.csproj | 2 +- lib/netstd/Thrift.sln | 62 +++++++++---- lib/netstd/Thrift/Thrift.csproj | 4 +- test/netstd/Client/Client.csproj | 2 +- test/netstd/Server/Server.csproj | 2 +- test/netstd/ThriftTest.sln | 60 +++++++++---- tutorial/netstd/Client/Client.csproj | 2 +- 36 files changed, 534 insertions(+), 140 deletions(-) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests}/CassandraTest.thrift (100%) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests}/GlobalSuppressions.cs (100%) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests/Thrift.Compile.net6}/Impl/Thrift5253/MyService.cs (97%) create mode 100644 lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Properties/AssemblyInfo.cs create mode 100644 lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj create mode 100644 lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Impl/Thrift5253/MyService.cs create mode 100644 lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Properties/AssemblyInfo.cs rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj => Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj} (81%) create mode 100644 lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Impl/Thrift5253/MyService.cs rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests/Thrift.Compile.netstd2}/Properties/AssemblyInfo.cs (100%) create mode 100644 lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests}/Thrift5253.thrift (100%) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests}/Thrift5320.enum.thrift (100%) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests}/Thrift5320.exception.thrift (100%) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests}/Thrift5320.struct.thrift (100%) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests}/Thrift5320.thrift (100%) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests}/Thrift5382.objs.thrift (100%) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests}/Thrift5382.thrift (100%) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net6.thrift => Thrift.Compile.Tests/Thrift5794.thrift} (100%) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests}/Thrift5795.thrift (100%) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests}/name_conflicts.enum.thrift (100%) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests}/name_conflicts.thrift (100%) rename lib/netstd/Tests/{Thrift.PublicInterfaces.Compile.Tests => Thrift.Compile.Tests}/optional_required_default.thrift (100%) delete mode 100644 lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net8.thrift delete mode 100644 lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-netstd.thrift diff --git a/build/veralign.sh b/build/veralign.sh index 834bf7e03d3..f59eaf40a0b 100755 --- a/build/veralign.sh +++ b/build/veralign.sh @@ -70,8 +70,10 @@ FILES[lib/js/package.json]=jsonReplace FILES[lib/js/src/thrift.js]=simpleReplace FILES[lib/lua/Thrift.lua]=simpleReplace FILES[lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj]=simpleReplace -FILES[lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj]=simpleReplace -FILES[lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj]=simpleReplace +FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj]=simpleReplace +FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj]=simpleReplace +FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj]=simpleReplace +FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj]=simpleReplace FILES[lib/netstd/Thrift/Properties/AssemblyInfo.cs]=simpleReplace FILES[lib/netstd/Thrift/Thrift.csproj]=simpleReplace FILES[lib/ocaml/_oasis]=simpleReplace diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc index be4da42136d..95c91180f6e 100644 --- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc @@ -372,9 +372,12 @@ string t_netstd_generator::netstd_type_usings() const if (is_wcf_enabled()) { namespaces += "using System.ServiceModel;\n"; + } + if (is_wcf_enabled() || is_serialize_enabled()) + { namespaces += "using System.Runtime.Serialization;\n"; } - + return namespaces; } diff --git a/debian/copyright b/debian/copyright index e39dc742c51..76212b9d12f 100644 --- a/debian/copyright +++ b/debian/copyright @@ -72,8 +72,12 @@ under the Apache 2.0 License: lib/netstd/Thrift/Transport/TTransport.cs lib/netstd/Thrift/Transport/TTransportException.cs lib/netstd/Thrift/Transport/TTransportFactory.cs - lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Properties/AssemblyInfo.cs - lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj + lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Properties/AssemblyInfo.cs + lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj + lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Properties/AssemblyInfo.cs + lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj + lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Properties/AssemblyInfo.cs + lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj lib/rb/lib/thrift.rb lib/st/README.md lib/st/thrift.st diff --git a/lib/netstd/Makefile.am b/lib/netstd/Makefile.am index bcfe22e1d9f..bad1d6962a7 100644 --- a/lib/netstd/Makefile.am +++ b/lib/netstd/Makefile.am @@ -23,7 +23,9 @@ all-local: $(DOTNETCORE) build -c Release check-local: - $(DOTNETCORE) test Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj + $(DOTNETCORE) test Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj + $(DOTNETCORE) test Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj + $(DOTNETCORE) test Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj $(DOTNETCORE) test Tests/Thrift.Tests/Thrift.Tests.csproj $(DOTNETCORE) test Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj @@ -36,8 +38,12 @@ clean-local: $(RM) -r Tests/Thrift.Tests/obj $(RM) -r Tests/Thrift.IntegrationTests/bin $(RM) -r Tests/Thrift.IntegrationTests/obj - $(RM) -r Tests/Thrift.PublicInterfaces.Compile.Tests/bin - $(RM) -r Tests/Thrift.PublicInterfaces.Compile.Tests/obj + $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net8/bin + $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net8/obj + $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net6/bin + $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net6/obj + $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/bin + $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/obj distdir: $(MAKE) $(AM_MAKEFLAGS) distdir-am @@ -48,11 +54,13 @@ EXTRA_DIST = \ Benchmarks/Thrift.Benchmarks \ Tests/Thrift.IntegrationTests/Protocols \ Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj \ - Tests/Thrift.PublicInterfaces.Compile.Tests \ - Tests/Thrift.PublicInterfaces.Compile.Tests/CassandraTest.thrift \ - Tests/Thrift.PublicInterfaces.Compile.Tests/optional_required_default.thrift \ - Tests/Thrift.PublicInterfaces.Compile.Tests/Properties/AssemblyInfo.cs \ - Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj \ + Tests/Thrift.Compile.Tests \ + Tests/Thrift.Compile.Tests/CassandraTest.thrift \ + Tests/Thrift.Compile.Tests/optional_required_default.thrift \ + Tests/Thrift.Compile.Tests/Properties/AssemblyInfo.cs \ + Tests/Thrift.Compile.Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj \ + Tests/Thrift.Compile.Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj \ + Tests/Thrift.Compile.Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj \ Tests/Thrift.Tests/Collections \ Tests/Thrift.Tests/DataModel \ Tests/Thrift.Tests/Protocols \ diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/CassandraTest.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/CassandraTest.thrift similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/CassandraTest.thrift rename to lib/netstd/Tests/Thrift.Compile.Tests/CassandraTest.thrift diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/GlobalSuppressions.cs b/lib/netstd/Tests/Thrift.Compile.Tests/GlobalSuppressions.cs similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/GlobalSuppressions.cs rename to lib/netstd/Tests/Thrift.Compile.Tests/GlobalSuppressions.cs diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Impl/Thrift5253/MyService.cs similarity index 97% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Impl/Thrift5253/MyService.cs index f42337630e1..4a2f40dc126 100644 --- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Impl/Thrift5253/MyService.cs @@ -22,7 +22,7 @@ using System.Threading.Tasks; using Thrift5253; -namespace Thrift.PublicInterfaces.Compile.Tests.Impl.Thrift5253 +namespace Thrift.Compile.net6.Impl.Thrift5253 { class MyServiceImpl : MyService.IAsync { diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Properties/AssemblyInfo.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..1d612f645fb --- /dev/null +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Properties/AssemblyInfo.cs @@ -0,0 +1,40 @@ +// 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. + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("The Apache Software Foundation")] +[assembly: AssemblyProduct("Thrift")] +[assembly: AssemblyCopyright("The Apache Software Foundation")] +[assembly: AssemblyTrademark("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("dbc2c69a-93f1-45f4-8ecf-36ef13fc3482")] \ No newline at end of file diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj new file mode 100644 index 00000000000..bcbed7ef94d --- /dev/null +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj @@ -0,0 +1,90 @@ + + + + + 0.21.0 + Thrift version $(ThriftVersion) + net6.0 + latestMajor + $(ThriftVersion).0 + Thrift.Compile.net6 + Thrift.Compile.net6 + false + false + false + false + enable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Impl/Thrift5253/MyService.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Impl/Thrift5253/MyService.cs new file mode 100644 index 00000000000..f192c7f5298 --- /dev/null +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Impl/Thrift5253/MyService.cs @@ -0,0 +1,70 @@ +// 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. + +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Thrift5253; + +namespace Thrift.Compile.net8.Impl.Thrift5253 +{ + class MyServiceImpl : MyService.IAsync + { + public Task AsyncProcessor_(AsyncProcessor? input, CancellationToken cancellationToken = default) + { + return Task.FromResult(new AsyncProcessor() { Foo = input?.Foo ?? 0 }); + } + + public Task Broken(BrokenArgs? input, CancellationToken cancellationToken = default) + { + return Task.FromResult(new BrokenResult() { Foo = input?.Foo ?? 0 }); + } + + public Task Client_(Client? input, CancellationToken cancellationToken = default) + { + _ = cancellationToken; + return Task.FromResult(new Client() { Foo = input?.Foo ?? 0 }); + } + + public Task IAsync_(IAsync? input, CancellationToken cancellationToken = default) + { + return Task.FromResult(new IAsync() { Foo = input?.Foo ?? 0 }); + } + + public Task InternalStructs_(InternalStructs? input, CancellationToken cancellationToken = default) + { + return Task.FromResult(new InternalStructs() { Foo = input?.Foo ?? 0 }); + } + + public Task TestAsync(CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task TestXsync(CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task Works(WorksArrrgs? input, CancellationToken cancellationToken = default) + { + return Task.FromResult(new WorksRslt() { Foo = input?.Foo ?? 0 }); + } + } +} diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Properties/AssemblyInfo.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..5bd3c6fb603 --- /dev/null +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Properties/AssemblyInfo.cs @@ -0,0 +1,40 @@ +// 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. + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("The Apache Software Foundation")] +[assembly: AssemblyProduct("Thrift")] +[assembly: AssemblyCopyright("The Apache Software Foundation")] +[assembly: AssemblyTrademark("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("1b468b7a-a53b-46de-90da-5f9ad7707ef4")] \ No newline at end of file diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj similarity index 81% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj index 7e5f790cdf8..16b86cee017 100644 --- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj @@ -24,8 +24,8 @@ net8.0 latestMajor $(ThriftVersion).0 - Thrift.PublicInterfaces.Compile.Tests - Thrift.PublicInterfaces.Compile.Tests + Thrift.Compile.net8 + Thrift.Compile.net8 false false false @@ -34,7 +34,7 @@ - + @@ -61,7 +61,7 @@ - + @@ -72,21 +72,17 @@ - - - - - - - - - + + + + + + + + + - - + diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Impl/Thrift5253/MyService.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Impl/Thrift5253/MyService.cs new file mode 100644 index 00000000000..cbdc497c1e4 --- /dev/null +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Impl/Thrift5253/MyService.cs @@ -0,0 +1,70 @@ +// 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. + +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Thrift5253; + +namespace Thrift.Compile.netstd2.Impl.Thrift5253 +{ + class MyServiceImpl : MyService.IAsync + { + public Task AsyncProcessor_(AsyncProcessor input, CancellationToken cancellationToken = default) + { + return Task.FromResult(new AsyncProcessor() { Foo = input?.Foo ?? 0 }); + } + + public Task Broken(BrokenArgs input, CancellationToken cancellationToken = default) + { + return Task.FromResult(new BrokenResult() { Foo = input?.Foo ?? 0 }); + } + + public Task Client_(Client input, CancellationToken cancellationToken = default) + { + _ = cancellationToken; + return Task.FromResult(new Client() { Foo = input?.Foo ?? 0 }); + } + + public Task IAsync_(IAsync input, CancellationToken cancellationToken = default) + { + return Task.FromResult(new IAsync() { Foo = input?.Foo ?? 0 }); + } + + public Task InternalStructs_(InternalStructs input, CancellationToken cancellationToken = default) + { + return Task.FromResult(new InternalStructs() { Foo = input?.Foo ?? 0 }); + } + + public Task TestAsync(CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task TestXsync(CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task Works(WorksArrrgs input, CancellationToken cancellationToken = default) + { + return Task.FromResult(new WorksRslt() { Foo = input?.Foo ?? 0 }); + } + } +} diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Properties/AssemblyInfo.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Properties/AssemblyInfo.cs similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Properties/AssemblyInfo.cs rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Properties/AssemblyInfo.cs diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj new file mode 100644 index 00000000000..cc2b5e499be --- /dev/null +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj @@ -0,0 +1,83 @@ + + + + + 0.21.0 + Thrift version $(ThriftVersion) + netstandard2.0 + latestMajor + $(ThriftVersion).0 + Thrift.Compile.netstd2 + Thrift.Compile.netstd2 + false + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5253.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5253.thrift similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5253.thrift rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5253.thrift diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.enum.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.enum.thrift similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.enum.thrift rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.enum.thrift diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.exception.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.exception.thrift similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.exception.thrift rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.exception.thrift diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.struct.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.struct.thrift similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.struct.thrift rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.struct.thrift diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.thrift similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.thrift rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.thrift diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5382.objs.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5382.objs.thrift similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5382.objs.thrift rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5382.objs.thrift diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5382.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5382.thrift similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5382.thrift rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5382.thrift diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net6.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5794.thrift similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net6.thrift rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5794.thrift diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5795.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5795.thrift similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5795.thrift rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5795.thrift diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/name_conflicts.enum.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/name_conflicts.enum.thrift similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/name_conflicts.enum.thrift rename to lib/netstd/Tests/Thrift.Compile.Tests/name_conflicts.enum.thrift diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/name_conflicts.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/name_conflicts.thrift similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/name_conflicts.thrift rename to lib/netstd/Tests/Thrift.Compile.Tests/name_conflicts.thrift diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/optional_required_default.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/optional_required_default.thrift similarity index 100% rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/optional_required_default.thrift rename to lib/netstd/Tests/Thrift.Compile.Tests/optional_required_default.thrift diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net8.thrift b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net8.thrift deleted file mode 100644 index f6c5f314127..00000000000 --- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-net8.thrift +++ /dev/null @@ -1,35 +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. - */ - -// Testcase for THRIFT-5794 uncompilable code generated w/o net8 option - -namespace * Thrift5794.net8 - -struct foo { - 1: double a; - 2: double b; - 3: double c; -} - -struct bar { - 1: required double a; - 2: required double b; - 3: double c; -} - diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-netstd.thrift b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-netstd.thrift deleted file mode 100644 index 64d962ba705..00000000000 --- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5794-netstd.thrift +++ /dev/null @@ -1,35 +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. - */ - -// Testcase for THRIFT-5794 uncompilable code generated w/o net8 option - -namespace * Thrift5794.netstd - -struct foo { - 1: double a; - 2: double b; - 3: double c; -} - -struct bar { - 1: required double a; - 2: required double b; - 3: double c; -} - diff --git a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj index 0a9cff0c94c..089064b2b4f 100644 --- a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj +++ b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj @@ -35,7 +35,7 @@ - + diff --git a/lib/netstd/Thrift.sln b/lib/netstd/Thrift.sln index dd5dba94f7e..dbd4b675031 100644 --- a/lib/netstd/Thrift.sln +++ b/lib/netstd/Thrift.sln @@ -10,11 +10,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.IntegrationTests", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Tests", "Tests\Thrift.Tests\Thrift.Tests.csproj", "{0790D388-1A3C-4423-8CF2-C97074A8B68B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.PublicInterfaces.Compile.Tests", "Tests\Thrift.PublicInterfaces.Compile.Tests\Thrift.PublicInterfaces.Compile.Tests.csproj", "{A6AE021D-61CB-4D84-A103-0B663C62AE2C}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmarks", "Benchmarks", "{BF7B896B-8BB6-447C-84F8-26871882A14A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Thrift.Benchmarks", "Benchmarks\Thrift.Benchmarks\Thrift.Benchmarks.csproj", "{D0559DFF-6632-446C-9EFC-C750DA20B1D9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Benchmarks", "Benchmarks\Thrift.Benchmarks\Thrift.Benchmarks.csproj", "{D0559DFF-6632-446C-9EFC-C750DA20B1D9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.net6", "Tests\Thrift.Compile.Tests\Thrift.Compile.net6\Thrift.Compile.net6.csproj", "{2AFCF575-381C-46CA-8006-D5762365F0E3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.netstd2", "Tests\Thrift.Compile.Tests\Thrift.Compile.netstd2\Thrift.Compile.netstd2.csproj", "{58F72FB9-09F5-4D0F-B0B4-36605670BF72}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.net8", "Tests\Thrift.Compile.Tests\Thrift.Compile.net8\Thrift.Compile.net8.csproj", "{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -62,18 +66,6 @@ Global {0790D388-1A3C-4423-8CF2-C97074A8B68B}.Release|x64.Build.0 = Release|Any CPU {0790D388-1A3C-4423-8CF2-C97074A8B68B}.Release|x86.ActiveCfg = Release|Any CPU {0790D388-1A3C-4423-8CF2-C97074A8B68B}.Release|x86.Build.0 = Release|Any CPU - {A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Debug|x64.ActiveCfg = Debug|Any CPU - {A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Debug|x64.Build.0 = Debug|Any CPU - {A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Debug|x86.ActiveCfg = Debug|Any CPU - {A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Debug|x86.Build.0 = Debug|Any CPU - {A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Release|Any CPU.Build.0 = Release|Any CPU - {A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Release|x64.ActiveCfg = Release|Any CPU - {A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Release|x64.Build.0 = Release|Any CPU - {A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Release|x86.ActiveCfg = Release|Any CPU - {A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Release|x86.Build.0 = Release|Any CPU {D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Debug|Any CPU.Build.0 = Debug|Any CPU {D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -86,6 +78,42 @@ Global {D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Release|x64.Build.0 = Release|Any CPU {D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Release|x86.ActiveCfg = Release|Any CPU {D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Release|x86.Build.0 = Release|Any CPU + {2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|x64.ActiveCfg = Debug|Any CPU + {2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|x64.Build.0 = Debug|Any CPU + {2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|x86.ActiveCfg = Debug|Any CPU + {2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|x86.Build.0 = Debug|Any CPU + {2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|Any CPU.Build.0 = Release|Any CPU + {2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|x64.ActiveCfg = Release|Any CPU + {2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|x64.Build.0 = Release|Any CPU + {2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|x86.ActiveCfg = Release|Any CPU + {2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|x86.Build.0 = Release|Any CPU + {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|x64.ActiveCfg = Debug|Any CPU + {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|x64.Build.0 = Debug|Any CPU + {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|x86.ActiveCfg = Debug|Any CPU + {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|x86.Build.0 = Debug|Any CPU + {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Release|Any CPU.Build.0 = Release|Any CPU + {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Release|x64.ActiveCfg = Release|Any CPU + {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Release|x64.Build.0 = Release|Any CPU + {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Release|x86.ActiveCfg = Release|Any CPU + {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Release|x86.Build.0 = Release|Any CPU + {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Debug|x64.ActiveCfg = Debug|Any CPU + {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Debug|x64.Build.0 = Debug|Any CPU + {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Debug|x86.ActiveCfg = Debug|Any CPU + {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Debug|x86.Build.0 = Debug|Any CPU + {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|Any CPU.Build.0 = Release|Any CPU + {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|x64.ActiveCfg = Release|Any CPU + {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|x64.Build.0 = Release|Any CPU + {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|x86.ActiveCfg = Release|Any CPU + {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -93,8 +121,10 @@ Global GlobalSection(NestedProjects) = preSolution {837F4084-AAD7-45F5-BC96-10E05A669DB4} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA} {0790D388-1A3C-4423-8CF2-C97074A8B68B} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA} - {A6AE021D-61CB-4D84-A103-0B663C62AE2C} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA} {D0559DFF-6632-446C-9EFC-C750DA20B1D9} = {BF7B896B-8BB6-447C-84F8-26871882A14A} + {2AFCF575-381C-46CA-8006-D5762365F0E3} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA} + {58F72FB9-09F5-4D0F-B0B4-36605670BF72} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA} + {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {FD20BC4A-0109-41D8-8C0C-893E784D7EF9} diff --git a/lib/netstd/Thrift/Thrift.csproj b/lib/netstd/Thrift/Thrift.csproj index da0057d8583..587a92e0878 100644 --- a/lib/netstd/Thrift/Thrift.csproj +++ b/lib/netstd/Thrift/Thrift.csproj @@ -62,7 +62,7 @@ - + @@ -89,7 +89,7 @@ - 8.0.4 + 8.0.7 diff --git a/test/netstd/Client/Client.csproj b/test/netstd/Client/Client.csproj index 8a904dde1e4..62b01ddc8c1 100644 --- a/test/netstd/Client/Client.csproj +++ b/test/netstd/Client/Client.csproj @@ -35,7 +35,7 @@ - + diff --git a/test/netstd/Server/Server.csproj b/test/netstd/Server/Server.csproj index 1bf48d9638a..94cd8b1c046 100644 --- a/test/netstd/Server/Server.csproj +++ b/test/netstd/Server/Server.csproj @@ -36,7 +36,7 @@ - + diff --git a/test/netstd/ThriftTest.sln b/test/netstd/ThriftTest.sln index 7e101d9e0e1..d0a3fa8ec5e 100644 --- a/test/netstd/ThriftTest.sln +++ b/test/netstd/ThriftTest.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30104.148 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32112.339 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift", "..\..\lib\netstd\Thrift\Thrift.csproj", "{C20EA2A9-7660-47DE-9A49-D1EF12FB2895}" EndProject @@ -11,12 +11,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server", "Server\Server.csp EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.IntegrationTests", "..\..\lib\netstd\Tests\Thrift.IntegrationTests\Thrift.IntegrationTests.csproj", "{C8148BFF-B943-4474-8D33-A641C6FD3DAB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.PublicInterfaces.Compile.Tests", "..\..\lib\netstd\Tests\Thrift.PublicInterfaces.Compile.Tests\Thrift.PublicInterfaces.Compile.Tests.csproj", "{5D86C1B6-0CDA-4D1D-80A5-240583B21148}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Tests", "..\..\lib\netstd\Tests\Thrift.Tests\Thrift.Tests.csproj", "{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Benchmarks", "..\..\lib\netstd\Benchmarks\Thrift.Benchmarks\Thrift.Benchmarks.csproj", "{66946544-8DE7-45E9-8D0E-93EADA028D44}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.net8", "..\..\lib\netstd\Tests\Thrift.Compile.Tests\Thrift.Compile.net8\Thrift.Compile.net8.csproj", "{05FAA75C-06BE-462F-999F-63823D08C75A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.net6", "..\..\lib\netstd\Tests\Thrift.Compile.Tests\Thrift.Compile.net6\Thrift.Compile.net6.csproj", "{761EB615-D476-4423-888E-7D7665E769B1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.netstd2", "..\..\lib\netstd\Tests\Thrift.Compile.Tests\Thrift.Compile.netstd2\Thrift.Compile.netstd2.csproj", "{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -75,18 +79,6 @@ Global {C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Release|x64.Build.0 = Release|Any CPU {C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Release|x86.ActiveCfg = Release|Any CPU {C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Release|x86.Build.0 = Release|Any CPU - {5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Debug|x64.ActiveCfg = Debug|Any CPU - {5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Debug|x64.Build.0 = Debug|Any CPU - {5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Debug|x86.ActiveCfg = Debug|Any CPU - {5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Debug|x86.Build.0 = Debug|Any CPU - {5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Release|Any CPU.Build.0 = Release|Any CPU - {5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Release|x64.ActiveCfg = Release|Any CPU - {5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Release|x64.Build.0 = Release|Any CPU - {5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Release|x86.ActiveCfg = Release|Any CPU - {5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Release|x86.Build.0 = Release|Any CPU {37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Debug|Any CPU.Build.0 = Debug|Any CPU {37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -111,6 +103,42 @@ Global {66946544-8DE7-45E9-8D0E-93EADA028D44}.Release|x64.Build.0 = Release|Any CPU {66946544-8DE7-45E9-8D0E-93EADA028D44}.Release|x86.ActiveCfg = Release|Any CPU {66946544-8DE7-45E9-8D0E-93EADA028D44}.Release|x86.Build.0 = Release|Any CPU + {05FAA75C-06BE-462F-999F-63823D08C75A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {05FAA75C-06BE-462F-999F-63823D08C75A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05FAA75C-06BE-462F-999F-63823D08C75A}.Debug|x64.ActiveCfg = Debug|Any CPU + {05FAA75C-06BE-462F-999F-63823D08C75A}.Debug|x64.Build.0 = Debug|Any CPU + {05FAA75C-06BE-462F-999F-63823D08C75A}.Debug|x86.ActiveCfg = Debug|Any CPU + {05FAA75C-06BE-462F-999F-63823D08C75A}.Debug|x86.Build.0 = Debug|Any CPU + {05FAA75C-06BE-462F-999F-63823D08C75A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {05FAA75C-06BE-462F-999F-63823D08C75A}.Release|Any CPU.Build.0 = Release|Any CPU + {05FAA75C-06BE-462F-999F-63823D08C75A}.Release|x64.ActiveCfg = Release|Any CPU + {05FAA75C-06BE-462F-999F-63823D08C75A}.Release|x64.Build.0 = Release|Any CPU + {05FAA75C-06BE-462F-999F-63823D08C75A}.Release|x86.ActiveCfg = Release|Any CPU + {05FAA75C-06BE-462F-999F-63823D08C75A}.Release|x86.Build.0 = Release|Any CPU + {761EB615-D476-4423-888E-7D7665E769B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {761EB615-D476-4423-888E-7D7665E769B1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {761EB615-D476-4423-888E-7D7665E769B1}.Debug|x64.ActiveCfg = Debug|Any CPU + {761EB615-D476-4423-888E-7D7665E769B1}.Debug|x64.Build.0 = Debug|Any CPU + {761EB615-D476-4423-888E-7D7665E769B1}.Debug|x86.ActiveCfg = Debug|Any CPU + {761EB615-D476-4423-888E-7D7665E769B1}.Debug|x86.Build.0 = Debug|Any CPU + {761EB615-D476-4423-888E-7D7665E769B1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {761EB615-D476-4423-888E-7D7665E769B1}.Release|Any CPU.Build.0 = Release|Any CPU + {761EB615-D476-4423-888E-7D7665E769B1}.Release|x64.ActiveCfg = Release|Any CPU + {761EB615-D476-4423-888E-7D7665E769B1}.Release|x64.Build.0 = Release|Any CPU + {761EB615-D476-4423-888E-7D7665E769B1}.Release|x86.ActiveCfg = Release|Any CPU + {761EB615-D476-4423-888E-7D7665E769B1}.Release|x86.Build.0 = Release|Any CPU + {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|x64.ActiveCfg = Debug|Any CPU + {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|x64.Build.0 = Debug|Any CPU + {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|x86.ActiveCfg = Debug|Any CPU + {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|x86.Build.0 = Debug|Any CPU + {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|Any CPU.Build.0 = Release|Any CPU + {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|x64.ActiveCfg = Release|Any CPU + {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|x64.Build.0 = Release|Any CPU + {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|x86.ActiveCfg = Release|Any CPU + {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/tutorial/netstd/Client/Client.csproj b/tutorial/netstd/Client/Client.csproj index 399b0e0d096..ebc63acfc2f 100644 --- a/tutorial/netstd/Client/Client.csproj +++ b/tutorial/netstd/Client/Client.csproj @@ -32,7 +32,7 @@ - + From 0bc2cb98d22d87a7af9ec3ccfa41383441a09629 Mon Sep 17 00:00:00 2001 From: Alexander Shadchin Date: Sun, 21 Jul 2024 23:27:26 +0300 Subject: [PATCH 095/430] Switch from `logger.warn` to `logger.warning` --- lib/py/src/transport/TSSLSocket.py | 4 ++-- lib/py/src/transport/TSocket.py | 2 +- lib/py/src/transport/sslcompat.py | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/py/src/transport/TSSLSocket.py b/lib/py/src/transport/TSSLSocket.py index 5b3ae599194..536d2f37a4e 100644 --- a/lib/py/src/transport/TSSLSocket.py +++ b/lib/py/src/transport/TSSLSocket.py @@ -397,8 +397,8 @@ def accept(self): self._validate_callback(client.peercert, addr[0]) client.is_valid = True except Exception: - logger.warn('Failed to validate client certificate address: %s', - addr[0], exc_info=True) + logger.warning('Failed to validate client certificate address: %s', + addr[0], exc_info=True) client.close() plain_client.close() return None diff --git a/lib/py/src/transport/TSocket.py b/lib/py/src/transport/TSocket.py index c8b4287f973..459f04370fe 100644 --- a/lib/py/src/transport/TSocket.py +++ b/lib/py/src/transport/TSocket.py @@ -208,7 +208,7 @@ def setBacklog(self, backlog=None): else: # We cann't update backlog when it is already listening, since the # handle has been created. - logger.warn('You have to set backlog before listen.') + logger.warning('You have to set backlog before listen.') def listen(self): res0 = self._resolveAddr() diff --git a/lib/py/src/transport/sslcompat.py b/lib/py/src/transport/sslcompat.py index ab00cb2a839..60616db8273 100644 --- a/lib/py/src/transport/sslcompat.py +++ b/lib/py/src/transport/sslcompat.py @@ -70,7 +70,7 @@ def _optional_dependencies(): logger.debug('ipaddress module is available') ipaddr = True except ImportError: - logger.warn('ipaddress module is unavailable') + logger.warning('ipaddress module is unavailable') ipaddr = False if sys.hexversion < 0x030500F0: @@ -82,17 +82,17 @@ def _optional_dependencies(): if ver[0] * 10 + ver[1] >= 35: return ipaddr, match else: - logger.warn('backports.ssl_match_hostname module is too old') + logger.warning('backports.ssl_match_hostname module is too old') ipaddr = False except ImportError: - logger.warn('backports.ssl_match_hostname is unavailable') + logger.warning('backports.ssl_match_hostname is unavailable') ipaddr = False try: from ssl import match_hostname logger.debug('ssl.match_hostname is available') match = match_hostname except ImportError: - logger.warn('using legacy validation callback') + logger.warning('using legacy validation callback') match = legacy_validate_callback return ipaddr, match From 18b0de6d658bdf7fe01dbded7a07863d09fb7be6 Mon Sep 17 00:00:00 2001 From: Sven Roederer Date: Sat, 6 Jul 2024 03:59:37 +0200 Subject: [PATCH 096/430] GHA/build: upgrade artifact-actions from v3 to v4 V3 is based on Node.js v16 and will get deprecated. Currently it's just causing a warning. With v4 the artifact-upload action fails as all matrix-jobs use the same name and the default prevents overwriting existing ones. Therefore we use individual artifact names which will also preserve all logs, not just a singe one only. --- .github/workflows/build.yml | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2472029cafa..f126a92094c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -70,7 +70,7 @@ jobs: # only upload while building ubuntu-20.04 - name: Archive built thrift compiler if: matrix.os == 'ubuntu-20.04' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: thrift-compiler path: compiler/cpp/thrift @@ -157,7 +157,7 @@ jobs: run: | ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-go/with-go/') - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: thrift-compiler path: compiler/cpp @@ -181,7 +181,7 @@ jobs: - name: Upload go precross artifacts if: matrix.go == '1.22' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: go-precross if-no-files-found: error @@ -235,7 +235,7 @@ jobs: run: | ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-java/with-java/' | sed 's/without-kotlin/with-kotlin/') - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: thrift-compiler path: compiler/cpp @@ -253,7 +253,7 @@ jobs: run: make -C lib/java install - name: Upload java libthrift artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: libthrift if-no-files-found: error @@ -266,7 +266,7 @@ jobs: run: make -C lib/java precross - name: Upload java precross artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: java-precross if-no-files-found: error @@ -288,7 +288,7 @@ jobs: run: make -C lib/kotlin precross - name: Upload kotlin precross artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: kotlin-precross if-no-files-found: error @@ -310,7 +310,7 @@ jobs: run: | ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-swift/with-swift/') - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: thrift-compiler path: compiler/cpp @@ -324,7 +324,7 @@ jobs: run: make -C test/swift precross - name: Upload swift precross artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: swift-precross if-no-files-found: error @@ -363,7 +363,7 @@ jobs: run: | ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-rs/with-rs/') - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: thrift-compiler path: compiler/cpp @@ -386,7 +386,7 @@ jobs: run: make -C test/rs precross - name: Upload rust precross artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: rs-precross if-no-files-found: error @@ -434,7 +434,7 @@ jobs: run: | ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-py3/with-py3/') - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: thrift-compiler path: compiler/cpp @@ -490,31 +490,31 @@ jobs: sudo apt-get install -y --no-install-recommends openssl ca-certificates - name: Download java precross artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: java-precross path: lib/java/build - name: Download kotlin precross artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: kotlin-precross path: lib/kotlin - name: Download swift precross artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: swift-precross path: test/swift/CrossTests/.build/x86_64-unknown-linux-gnu/debug - name: Download rust precross artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: rs-precross path: test/rs/bin - name: Download go precross artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: go-precross path: test/go/bin @@ -540,10 +540,10 @@ jobs: --client ${{ matrix.client_lang }} - name: Upload log files from failed cross test runs - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: - name: cross-test-log + name: cross-test-log_${{ matrix.server_lang }}-${{ matrix.client_lang }} path: test/log/ retention-days: 3 From 502a46a7374f4dc050a689f970fc06cf66210db0 Mon Sep 17 00:00:00 2001 From: Sven Roederer Date: Sat, 6 Jul 2024 05:56:05 +0200 Subject: [PATCH 097/430] GHA: switch to ubuntu-22.04 as primary image Ubuntu-20.04 will be EoL in 9 months, therefore let's use the next LTS version as default. Images for ubuntu-24.04 are available, so use them also for building the compiler. --- .github/workflows/build.yml | 18 +++++++++--------- .github/workflows/cmake.yml | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f126a92094c..3d83cb9c113 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,7 +41,7 @@ jobs: compiler: strategy: matrix: - os: [ubuntu-20.04, ubuntu-22.04] + os: [ubuntu-20.04, ubuntu-22.04, ubuntu-24.04] fail-fast: false runs-on: ${{ matrix.os }} steps: @@ -67,9 +67,9 @@ jobs: - name: Run thrift version run: /usr/local/bin/thrift -version - # only upload while building ubuntu-20.04 + # only upload while building ubuntu-22.04 - name: Archive built thrift compiler - if: matrix.os == 'ubuntu-20.04' + if: matrix.os == 'ubuntu-22.04' uses: actions/upload-artifact@v4 with: name: thrift-compiler @@ -131,7 +131,7 @@ jobs: lib-go: needs: compiler - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 strategy: matrix: go: @@ -191,7 +191,7 @@ jobs: lib-java-kotlin: needs: compiler - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 env: GRADLE_VERSION: "8.4" steps: @@ -299,7 +299,7 @@ jobs: lib-swift: needs: compiler - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 @@ -335,7 +335,7 @@ jobs: lib-rust: needs: compiler - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 env: TOOLCHAIN_VERSION: 1.65.0 steps: @@ -400,7 +400,7 @@ jobs: lib-python: needs: compiler - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 strategy: matrix: python-version: @@ -463,7 +463,7 @@ jobs: - lib-rust - lib-go - lib-python - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 strategy: matrix: server_lang: ['java', 'kotlin', 'go', 'rs', 'swift'] diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 71748e8fc4d..c4ff747b549 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -14,7 +14,7 @@ permissions: jobs: compiler: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 From 3d02c0f94e858828e9251a57979172ae48d71b9d Mon Sep 17 00:00:00 2001 From: Sven Roederer Date: Sat, 6 Jul 2024 07:36:30 +0200 Subject: [PATCH 098/430] GHA/build: bring lib-php job to same versions of artifact-action and ubuntu-image --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3d83cb9c113..82888497fa7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -78,7 +78,7 @@ jobs: lib-php: needs: compiler - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 strategy: matrix: php-version: [7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2, 8.3] @@ -103,7 +103,7 @@ jobs: run: | ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-php/with-php/' | sed 's/without-php_extension/with-php_extension/' ) - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: thrift-compiler path: compiler/cpp From 438fc822ffc10f85dc7d7a7d05a0f038231f458d Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Thu, 25 Jul 2024 09:56:55 -0700 Subject: [PATCH 099/430] THRIFT-5800: Make non-exist include a failure when -strict is on --- compiler/cpp/src/thrift/main.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/compiler/cpp/src/thrift/main.cc b/compiler/cpp/src/thrift/main.cc index 5177076adf7..56c5811013d 100644 --- a/compiler/cpp/src/thrift/main.cc +++ b/compiler/cpp/src/thrift/main.cc @@ -373,7 +373,12 @@ string include_file(string filename) { } // Uh oh - pwarning(0, "Could not find include file %s\n", filename.c_str()); + if (g_strict >= 192) { + // On strict mode this should be failure instead of warning + failure("Could not find include file %s", filename.c_str()); + } else { + pwarning(0, "Could not find include file %s\n", filename.c_str()); + } return std::string(); } From d4503a1f0e62d38f7a12ba9748744c5490c915c4 Mon Sep 17 00:00:00 2001 From: Marc Jakobi Date: Thu, 25 Jul 2024 10:59:03 +0200 Subject: [PATCH 100/430] THRIFT-4847: CancelledKeyException causes TThreadedSelectorServer to fail --- .../server/AbstractNonblockingServer.java | 30 +++++++++++++++---- .../server/TThreadedSelectorServer.java | 15 +++++++--- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java index 954aaebf1b5..a573f0cdd77 100644 --- a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java +++ b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java @@ -248,7 +248,7 @@ public class FrameBuffer { protected final TNonblockingTransport trans_; // the SelectionKey that corresponds to our transport - protected final SelectionKey selectionKey_; + protected SelectionKey selectionKey_; // the SelectThread that owns the registration of our transport protected final AbstractSelectThread selectThread_; @@ -302,6 +302,14 @@ public FrameBuffer( } } + /** + * Sets the selection key (this is not thread safe). + * @param selectionKey the new key to set. + */ + public void setSelectionKey(SelectionKey selectionKey) { + selectionKey_ = selectionKey; + } + /** * Give this FrameBuffer a chance to read. The selector loop should have received a read event * for this FrameBuffer. @@ -375,7 +383,11 @@ public boolean read() { // modify our selection key directly. if (buffer_.remaining() == 0) { // get rid of the read select interests - selectionKey_.interestOps(0); + if (selectionKey_.isValid()) { + selectionKey_.interestOps(0); + } else { + LOGGER.warn("SelectionKey was invalidated during read"); + } state_ = FrameBufferState.READ_FRAME_COMPLETE; } @@ -415,8 +427,12 @@ public void changeSelectInterests() { switch (state_) { case AWAITING_REGISTER_WRITE: // set the OP_WRITE interest - selectionKey_.interestOps(SelectionKey.OP_WRITE); - state_ = FrameBufferState.WRITING; + if (selectionKey_.isValid()) { + selectionKey_.interestOps(SelectionKey.OP_WRITE); + state_ = FrameBufferState.WRITING; + } else { + LOGGER.warn("SelectionKey was invalidated before write"); + } break; case AWAITING_REGISTER_READ: prepareRead(); @@ -520,7 +536,11 @@ private boolean internalRead() { private void prepareRead() { // we can set our interest directly without using the queue because // we're in the select thread. - selectionKey_.interestOps(SelectionKey.OP_READ); + if (selectionKey_.isValid()) { + selectionKey_.interestOps(SelectionKey.OP_READ); + } else { + LOGGER.warn("SelectionKey was invalidated before read"); + } // get ready for another go-around buffer_ = ByteBuffer.allocate(4); state_ = FrameBufferState.READING_FRAME_SIZE; diff --git a/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java b/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java index 86b8dfd2337..2a95fe176cd 100644 --- a/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java +++ b/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java @@ -626,16 +626,23 @@ private synchronized void rebuildSelector() { LOGGER.error("Create new Selector error.", e); } - for (SelectionKey key : oldSelector.selectedKeys()) { - if (!key.isValid() && key.readyOps() == 0) continue; + for (SelectionKey key : oldSelector.keys()) { + if (!key.isValid() || key.interestOps() == 0 || key.channel().keyFor(newSelector) != null) { + continue; + } SelectableChannel channel = key.channel(); Object attachment = key.attachment(); + int interestOps = key.interestOps(); + SelectionKey newKey; try { if (attachment == null) { - channel.register(newSelector, key.readyOps()); + newKey = channel.register(newSelector, interestOpts); } else { - channel.register(newSelector, key.readyOps(), attachment); + newKey = channel.register(newSelector, interestOpts, attachment); + if (attachment instanceof FrameBuffer) { + ((FrameBuffer) attachment.setSelectionKey(newKey); + } } } catch (ClosedChannelException e) { LOGGER.error("Register new selector key error.", e); From 91565d490e98306ac6797dd6ed4f72c0e8222e78 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Wed, 14 Aug 2024 09:01:15 -0700 Subject: [PATCH 101/430] Update supported go versions Client: go With the release of go 1.23, update supported go versions to 1.22+1.23 according to our go support policy. Also update the code to use the new range loop feature introduced in go 1.22 when appropriate. Also fix a bug in TSSLServerSocket.Addr that it does not return the listener address. --- .github/workflows/build.yml | 4 +- LANGUAGES.md | 4 +- go.mod | 2 +- lib/go/test/fuzz/go.mod | 2 +- lib/go/test/go.mod | 2 +- lib/go/test/tests/equals_test.go | 8 +- .../tests/string_parse_allocation_test.go | 4 +- lib/go/test/tests/validate_test.go | 10 +- lib/go/thrift/binary_protocol_test.go | 2 +- lib/go/thrift/exception.go | 24 ++--- lib/go/thrift/framed_transport_test.go | 6 +- lib/go/thrift/header_transport.go | 4 +- lib/go/thrift/header_transport_test.go | 6 +- lib/go/thrift/json_protocol_test.go | 2 +- lib/go/thrift/lowlevel_benchmarks_test.go | 96 +++++++++---------- lib/go/thrift/protocol.go | 6 +- lib/go/thrift/protocol_test.go | 4 +- lib/go/thrift/serializer_test.go | 2 +- lib/go/thrift/serializer_types_test.go | 6 +- lib/go/thrift/simple_json_protocol.go | 2 +- lib/go/thrift/simple_json_protocol_test.go | 2 +- lib/go/thrift/ssl_server_socket.go | 3 + lib/go/thrift/transport_test.go | 2 +- test/go/go.mod | 2 +- test/go/src/bin/stress/main.go | 18 ++-- test/go/src/bin/testclient/main.go | 18 ++-- test/go/src/bin/testserver/main.go | 2 +- test/go/src/common/client.go | 18 +--- test/go/src/common/clientserver_test.go | 55 ++++++----- test/go/src/common/context_test.go | 11 ++- test/go/src/common/server.go | 42 ++++++-- 31 files changed, 200 insertions(+), 169 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 82888497fa7..39e8b8e55a7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -135,8 +135,8 @@ jobs: strategy: matrix: go: - - '1.21' - '1.22' + - '1.23' fail-fast: false steps: - uses: actions/checkout@v4 @@ -180,7 +180,7 @@ jobs: run: make -C test/go precross - name: Upload go precross artifacts - if: matrix.go == '1.22' + if: matrix.go == '1.23' uses: actions/upload-artifact@v4 with: name: go-precross diff --git a/LANGUAGES.md b/LANGUAGES.md index ccb44436af0..26ee55576fb 100644 --- a/LANGUAGES.md +++ b/LANGUAGES.md @@ -163,9 +163,9 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr Go 0.7.0 Yes -1.211.22 +1.221.23 Yes -YesYesYes +YesYesYesYes YesYesYesYes YesYesYesYes Yes diff --git a/go.mod b/go.mod index b435d78a368..51ef9140131 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module github.com/apache/thrift -go 1.21 +go 1.22.0 diff --git a/lib/go/test/fuzz/go.mod b/lib/go/test/fuzz/go.mod index b7ddd5fcc60..f22b62294f5 100644 --- a/lib/go/test/fuzz/go.mod +++ b/lib/go/test/fuzz/go.mod @@ -1,6 +1,6 @@ module github.com/apache/thrift/lib/go/test/fuzz -go 1.21 +go 1.22.0 require github.com/apache/thrift v0.0.0-00010101000000-000000000000 diff --git a/lib/go/test/go.mod b/lib/go/test/go.mod index 0c032b70fe0..541bffc58ff 100644 --- a/lib/go/test/go.mod +++ b/lib/go/test/go.mod @@ -1,6 +1,6 @@ module github.com/apache/thrift/lib/go/test -go 1.21 +go 1.22.0 require ( github.com/apache/thrift v0.0.0-00010101000000-000000000000 diff --git a/lib/go/test/tests/equals_test.go b/lib/go/test/tests/equals_test.go index b8adc770802..f56d0cb56ec 100644 --- a/lib/go/test/tests/equals_test.go +++ b/lib/go/test/tests/equals_test.go @@ -255,7 +255,7 @@ func genMapFoo() *equalstest.MapEqualsFoo { func genInt64Slice(length int) []int64 { ret := make([]int64, length) - for i := 0; i < length; i++ { + for i := range ret { ret[i] = int64(length - i) } return ret @@ -263,7 +263,7 @@ func genInt64Slice(length int) []int64 { func genStringSlice(length int) []string { ret := make([]string, length) - for i := 0; i < length; i++ { + for i := range ret { ret[i] = strconv.Itoa(length - i) } return ret @@ -271,7 +271,7 @@ func genStringSlice(length int) []string { func genBytesSlice(length int) [][]byte { ret := make([][]byte, length) - for i := 0; i < length; i++ { + for i := range ret { ret[i] = []byte(strconv.Itoa(length - i)) } return ret @@ -279,7 +279,7 @@ func genBytesSlice(length int) [][]byte { func genInt64StringMap(length int) map[int64]string { ret := make(map[int64]string, length) - for i := 0; i < length; i++ { + for i := range length { ret[int64(i)] = strconv.Itoa(i) } return ret diff --git a/lib/go/test/tests/string_parse_allocation_test.go b/lib/go/test/tests/string_parse_allocation_test.go index 12790c4f078..56163b7d070 100644 --- a/lib/go/test/tests/string_parse_allocation_test.go +++ b/lib/go/test/tests/string_parse_allocation_test.go @@ -42,7 +42,7 @@ func BenchmarkSimpleJsonStringParse_Allocations(b *testing.B) { b.StopTimer() numEscapedQuotes := 1000 var sb strings.Builder - for i := 0; i < numEscapedQuotes; i++ { + for range numEscapedQuotes { sb.WriteString(`\"`) } @@ -51,7 +51,7 @@ func BenchmarkSimpleJsonStringParse_Allocations(b *testing.B) { transport := thrift.NewTMemoryBuffer() p := thrift.NewTJSONProtocol(transport) - for i := 0; i < b.N; i++ { + for range b.N { transport.Reset() transport.WriteString(testString) transport.Flush(context.Background()) diff --git a/lib/go/test/tests/validate_test.go b/lib/go/test/tests/validate_test.go index 957a8df03c7..52e059ab9d5 100644 --- a/lib/go/test/tests/validate_test.go +++ b/lib/go/test/tests/validate_test.go @@ -107,7 +107,7 @@ func TestBasicValidator(t *testing.T) { } bt = validatetest.NewBasicTest() bt.Map1 = make(map[string]string) - for i := 0; i < 11; i++ { + for i := range 11 { bt.Map1[strconv.Itoa(i)] = strconv.Itoa(i) } if err := bt.Validate(); err == nil { @@ -149,7 +149,7 @@ func TestBasicValidator(t *testing.T) { t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err) } bt = validatetest.NewBasicTest() - for i := 0; i < 11; i++ { + for range 11 { bt.Set1 = append(bt.Set1, "0") } if err := bt.Validate(); err == nil { @@ -272,7 +272,7 @@ func TestFieldReference(t *testing.T) { frt = validatetest.NewFieldReferenceTest() frt.MaxSize = 8 frt.Map0 = make(map[string]string) - for i := 0; i < 9; i++ { + for i := range 9 { frt.Map0[strconv.Itoa(i)] = strconv.Itoa(i) } if err := frt.Validate(); err == nil { @@ -289,7 +289,7 @@ func TestFieldReference(t *testing.T) { } frt = validatetest.NewFieldReferenceTest() frt.MaxSize = 8 - for i := 0; i < 9; i++ { + for range 9 { frt.List0 = append(frt.List0, "0") } if err := frt.Validate(); err == nil { @@ -306,7 +306,7 @@ func TestFieldReference(t *testing.T) { } frt = validatetest.NewFieldReferenceTest() frt.MaxSize = 8 - for i := 0; i < 9; i++ { + for range 9 { frt.Set0 = append(frt.Set0, "0") } if err := frt.Validate(); err == nil { diff --git a/lib/go/thrift/binary_protocol_test.go b/lib/go/thrift/binary_protocol_test.go index 88bfd26b7ea..67f99238d83 100644 --- a/lib/go/thrift/binary_protocol_test.go +++ b/lib/go/thrift/binary_protocol_test.go @@ -112,7 +112,7 @@ func generateSafeReadBytesBenchmark(askedSize int32, dataSize int) func(b *testi return func(b *testing.B) { data := make([]byte, dataSize) b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { safeReadBytes(askedSize, bytes.NewReader(data)) } } diff --git a/lib/go/thrift/exception.go b/lib/go/thrift/exception.go index e2f1728eac5..5b4cad96faa 100644 --- a/lib/go/thrift/exception.go +++ b/lib/go/thrift/exception.go @@ -121,20 +121,20 @@ var _ TException = wrappedTException{} // // For a endpoint defined in thrift IDL like this: // -// service MyService { -// FooResponse foo(1: FooRequest request) throws ( -// 1: Exception1 error1, -// 2: Exception2 error2, -// ) -// } +// service MyService { +// FooResponse foo(1: FooRequest request) throws ( +// 1: Exception1 error1, +// 2: Exception2 error2, +// ) +// } // // The thrift compiler generated go code for the result TStruct would be like: // -// type MyServiceFooResult struct { -// Success *FooResponse `thrift:"success,0" db:"success" json:"success,omitempty"` -// Error1 *Exception1 `thrift:"error1,1" db:"error1" json:"error1,omitempty"` -// Error2 *Exception2 `thrift:"error2,2" db:"error2" json:"error2,omitempty"` -// } +// type MyServiceFooResult struct { +// Success *FooResponse `thrift:"success,0" db:"success" json:"success,omitempty"` +// Error1 *Exception1 `thrift:"error1,1" db:"error1" json:"error1,omitempty"` +// Error2 *Exception2 `thrift:"error2,2" db:"error2" json:"error2,omitempty"` +// } // // And this function extracts the first non-nil exception out of // *MyServiceFooResult. @@ -144,7 +144,7 @@ func ExtractExceptionFromResult(result TStruct) error { return nil } typ := v.Type() - for i := 0; i < v.NumField(); i++ { + for i := range v.NumField() { if typ.Field(i).Name == "Success" { continue } diff --git a/lib/go/thrift/framed_transport_test.go b/lib/go/thrift/framed_transport_test.go index d23ec595e6f..e5aa4700cde 100644 --- a/lib/go/thrift/framed_transport_test.go +++ b/lib/go/thrift/framed_transport_test.go @@ -42,7 +42,7 @@ func TestTFramedTransportReuseTransport(t *testing.T) { writer := NewTFramedTransport(trans) t.Run("pair", func(t *testing.T) { - for i := 0; i < n; i++ { + for i := range n { // write if _, err := io.Copy(writer, strings.NewReader(content)); err != nil { t.Fatalf("Failed to write on #%d: %v", i, err) @@ -64,7 +64,7 @@ func TestTFramedTransportReuseTransport(t *testing.T) { t.Run("batched", func(t *testing.T) { // write - for i := 0; i < n; i++ { + for i := range n { if _, err := io.Copy(writer, strings.NewReader(content)); err != nil { t.Fatalf("Failed to write on #%d: %v", i, err) } @@ -74,7 +74,7 @@ func TestTFramedTransportReuseTransport(t *testing.T) { } // read - for i := 0; i < n; i++ { + for i := range n { const ( size = len(content) ) diff --git a/lib/go/thrift/header_transport.go b/lib/go/thrift/header_transport.go index 8148796c7e7..d6d64160af3 100644 --- a/lib/go/thrift/header_transport.go +++ b/lib/go/thrift/header_transport.go @@ -494,7 +494,7 @@ func (t *THeaderTransport) parseHeaders(ctx context.Context, frameSize uint32) e ) t.frameReader = reader transformIDs := make([]THeaderTransformID, transformCount) - for i := 0; i < int(transformCount); i++ { + for i := range int(transformCount) { id, err := hp.readVarint32() if err != nil { return err @@ -536,7 +536,7 @@ func (t *THeaderTransport) parseHeaders(ctx context.Context, frameSize uint32) e if err != nil { return err } - for i := 0; i < int(count); i++ { + for range int(count) { key, err := hp.ReadString(ctx) if err != nil { return err diff --git a/lib/go/thrift/header_transport_test.go b/lib/go/thrift/header_transport_test.go index 125a5fd8c36..09a03313299 100644 --- a/lib/go/thrift/header_transport_test.go +++ b/lib/go/thrift/header_transport_test.go @@ -316,7 +316,7 @@ func TestTHeaderTransportReuseTransport(t *testing.T) { writer := NewTHeaderTransport(trans) t.Run("pair", func(t *testing.T) { - for i := 0; i < n; i++ { + for i := range n { // write if _, err := io.Copy(writer, strings.NewReader(content)); err != nil { t.Fatalf("Failed to write on #%d: %v", i, err) @@ -338,7 +338,7 @@ func TestTHeaderTransportReuseTransport(t *testing.T) { t.Run("batched", func(t *testing.T) { // write - for i := 0; i < n; i++ { + for i := range n { if _, err := io.Copy(writer, strings.NewReader(content)); err != nil { t.Fatalf("Failed to write on #%d: %v", i, err) } @@ -348,7 +348,7 @@ func TestTHeaderTransportReuseTransport(t *testing.T) { } // read - for i := 0; i < n; i++ { + for i := range n { const ( size = len(content) ) diff --git a/lib/go/thrift/json_protocol_test.go b/lib/go/thrift/json_protocol_test.go index 39e52d15069..1680532cfbd 100644 --- a/lib/go/thrift/json_protocol_test.go +++ b/lib/go/thrift/json_protocol_test.go @@ -451,7 +451,7 @@ func TestReadJSONProtocolBinary(t *testing.T) { if len(v) != len(value) { t.Fatalf("Bad value for %s value length %v, wrote: %v, received length: %v", thetype, len(value), s, len(v)) } - for i := 0; i < len(v); i++ { + for i := range v { if v[i] != value[i] { t.Fatalf("Bad value for %s at index %d value %v, wrote: %v, received: %v", thetype, i, value[i], s, v[i]) } diff --git a/lib/go/thrift/lowlevel_benchmarks_test.go b/lib/go/thrift/lowlevel_benchmarks_test.go index e1736557b14..b389388aaad 100644 --- a/lib/go/thrift/lowlevel_benchmarks_test.go +++ b/lib/go/thrift/lowlevel_benchmarks_test.go @@ -41,7 +41,7 @@ func BenchmarkBinaryBool_0(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteBool(b, p, trans) } } @@ -52,7 +52,7 @@ func BenchmarkBinaryByte_0(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteByte(b, p, trans) } } @@ -63,7 +63,7 @@ func BenchmarkBinaryI16_0(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI16(b, p, trans) } } @@ -74,7 +74,7 @@ func BenchmarkBinaryI32_0(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI32(b, p, trans) } } @@ -84,7 +84,7 @@ func BenchmarkBinaryI64_0(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI64(b, p, trans) } } @@ -94,7 +94,7 @@ func BenchmarkBinaryDouble_0(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteDouble(b, p, trans) } } @@ -104,7 +104,7 @@ func BenchmarkBinaryString_0(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteString(b, p, trans) } } @@ -114,7 +114,7 @@ func BenchmarkBinaryBinary_0(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteBinary(b, p, trans) } } @@ -125,7 +125,7 @@ func BenchmarkBinaryBool_1(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteBool(b, p, trans) } } @@ -136,7 +136,7 @@ func BenchmarkBinaryByte_1(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteByte(b, p, trans) } } @@ -147,7 +147,7 @@ func BenchmarkBinaryI16_1(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI16(b, p, trans) } } @@ -158,7 +158,7 @@ func BenchmarkBinaryI32_1(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI32(b, p, trans) } } @@ -168,7 +168,7 @@ func BenchmarkBinaryI64_1(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI64(b, p, trans) } } @@ -178,7 +178,7 @@ func BenchmarkBinaryDouble_1(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteDouble(b, p, trans) } } @@ -188,7 +188,7 @@ func BenchmarkBinaryString_1(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteString(b, p, trans) } } @@ -198,7 +198,7 @@ func BenchmarkBinaryBinary_1(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteBinary(b, p, trans) } } @@ -209,7 +209,7 @@ func BenchmarkBinaryBool_2(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteBool(b, p, trans) } } @@ -220,7 +220,7 @@ func BenchmarkBinaryByte_2(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteByte(b, p, trans) } } @@ -231,7 +231,7 @@ func BenchmarkBinaryI16_2(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI16(b, p, trans) } } @@ -242,7 +242,7 @@ func BenchmarkBinaryI32_2(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI32(b, p, trans) } } @@ -252,7 +252,7 @@ func BenchmarkBinaryI64_2(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI64(b, p, trans) } } @@ -262,7 +262,7 @@ func BenchmarkBinaryDouble_2(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteDouble(b, p, trans) } } @@ -272,7 +272,7 @@ func BenchmarkBinaryString_2(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteString(b, p, trans) } } @@ -282,7 +282,7 @@ func BenchmarkBinaryBinary_2(b *testing.B) { b.Fatal(err) } p := binaryProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteBinary(b, p, trans) } } @@ -293,7 +293,7 @@ func BenchmarkCompactBool_0(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteBool(b, p, trans) } } @@ -304,7 +304,7 @@ func BenchmarkCompactByte_0(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteByte(b, p, trans) } } @@ -315,7 +315,7 @@ func BenchmarkCompactI16_0(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI16(b, p, trans) } } @@ -326,7 +326,7 @@ func BenchmarkCompactI32_0(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI32(b, p, trans) } } @@ -336,7 +336,7 @@ func BenchmarkCompactI64_0(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI64(b, p, trans) } } @@ -346,7 +346,7 @@ func BenchmarkCompactDouble0(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteDouble(b, p, trans) } } @@ -356,7 +356,7 @@ func BenchmarkCompactString0(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteString(b, p, trans) } } @@ -366,7 +366,7 @@ func BenchmarkCompactBinary0(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteBinary(b, p, trans) } } @@ -377,7 +377,7 @@ func BenchmarkCompactBool_1(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteBool(b, p, trans) } } @@ -388,7 +388,7 @@ func BenchmarkCompactByte_1(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteByte(b, p, trans) } } @@ -399,7 +399,7 @@ func BenchmarkCompactI16_1(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI16(b, p, trans) } } @@ -410,7 +410,7 @@ func BenchmarkCompactI32_1(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI32(b, p, trans) } } @@ -420,7 +420,7 @@ func BenchmarkCompactI64_1(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI64(b, p, trans) } } @@ -430,7 +430,7 @@ func BenchmarkCompactDouble1(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteDouble(b, p, trans) } } @@ -440,7 +440,7 @@ func BenchmarkCompactString1(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteString(b, p, trans) } } @@ -450,7 +450,7 @@ func BenchmarkCompactBinary1(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteBinary(b, p, trans) } } @@ -461,7 +461,7 @@ func BenchmarkCompactBool_2(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteBool(b, p, trans) } } @@ -472,7 +472,7 @@ func BenchmarkCompactByte_2(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteByte(b, p, trans) } } @@ -483,7 +483,7 @@ func BenchmarkCompactI16_2(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI16(b, p, trans) } } @@ -494,7 +494,7 @@ func BenchmarkCompactI32_2(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI32(b, p, trans) } } @@ -504,7 +504,7 @@ func BenchmarkCompactI64_2(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteI64(b, p, trans) } } @@ -514,7 +514,7 @@ func BenchmarkCompactDouble2(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteDouble(b, p, trans) } } @@ -524,7 +524,7 @@ func BenchmarkCompactString2(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteString(b, p, trans) } } @@ -534,7 +534,7 @@ func BenchmarkCompactBinary2(b *testing.B) { b.Fatal(err) } p := compactProtoF.GetProtocol(trans) - for i := 0; i < b.N; i++ { + for range b.N { ReadWriteBinary(b, p, trans) } } diff --git a/lib/go/thrift/protocol.go b/lib/go/thrift/protocol.go index 2ee14caaad1..68cfe4aaa25 100644 --- a/lib/go/thrift/protocol.go +++ b/lib/go/thrift/protocol.go @@ -146,7 +146,7 @@ func Skip(ctx context.Context, self TProtocol, fieldType TType, maxDepth int) (e if err != nil { return err } - for i := 0; i < size; i++ { + for range size { err := Skip(ctx, self, keyType, maxDepth-1) if err != nil { return err @@ -163,7 +163,7 @@ func Skip(ctx context.Context, self TProtocol, fieldType TType, maxDepth int) (e if err != nil { return err } - for i := 0; i < size; i++ { + for range size { err := Skip(ctx, self, elemType, maxDepth-1) if err != nil { return err @@ -175,7 +175,7 @@ func Skip(ctx context.Context, self TProtocol, fieldType TType, maxDepth int) (e if err != nil { return err } - for i := 0; i < size; i++ { + for range size { err := Skip(ctx, self, elemType, maxDepth-1) if err != nil { return err diff --git a/lib/go/thrift/protocol_test.go b/lib/go/thrift/protocol_test.go index 1093c94a969..4fac8013502 100644 --- a/lib/go/thrift/protocol_test.go +++ b/lib/go/thrift/protocol_test.go @@ -45,7 +45,7 @@ var ( func init() { protocol_bdata = make([]byte, PROTOCOL_BINARY_DATA_SIZE) - for i := 0; i < PROTOCOL_BINARY_DATA_SIZE; i++ { + for i := range PROTOCOL_BINARY_DATA_SIZE { protocol_bdata[i] = byte((i + 'a') % 255) } BOOL_VALUES = []bool{false, true, false, false, true} @@ -531,7 +531,7 @@ func ReadWriteBinary(t testing.TB, p TProtocol, trans TTransport) { if len(v) != len(value) { t.Errorf("%s: %T %T len(v) != len(value)... %d != %d", "ReadWriteBinary", p, trans, len(v), len(value)) } else { - for i := 0; i < len(v); i++ { + for i := range v { if v[i] != value[i] { t.Errorf("%s: %T %T %s != %s", "ReadWriteBinary", p, trans, v, value) } diff --git a/lib/go/thrift/serializer_test.go b/lib/go/thrift/serializer_test.go index 425ce0691bc..19879c582d5 100644 --- a/lib/go/thrift/serializer_test.go +++ b/lib/go/thrift/serializer_test.go @@ -328,7 +328,7 @@ func BenchmarkSerializer(b *testing.B) { b.Run( c.Label, func(b *testing.B) { - for i := 0; i < b.N; i++ { + for range b.N { s := c.Serializer() m := MyTestStruct{} str, _ := s.WriteString(context.Background(), &m) diff --git a/lib/go/thrift/serializer_types_test.go b/lib/go/thrift/serializer_types_test.go index 4d1e992ae42..d96001636f6 100644 --- a/lib/go/thrift/serializer_types_test.go +++ b/lib/go/thrift/serializer_types_test.go @@ -319,7 +319,7 @@ func (p *MyTestStruct) readField9(ctx context.Context, iprot TProtocol) error { } tMap := make(map[string]string, size) p.StringMap = tMap - for i := 0; i < size; i++ { + for range size { var _key0 string if v, err := iprot.ReadString(ctx); err != nil { return PrependError("error reading field 0: ", err) @@ -347,7 +347,7 @@ func (p *MyTestStruct) readField10(ctx context.Context, iprot TProtocol) error { } tSlice := make([]string, 0, size) p.StringList = tSlice - for i := 0; i < size; i++ { + for range size { var _elem2 string if v, err := iprot.ReadString(ctx); err != nil { return PrependError("error reading field 0: ", err) @@ -369,7 +369,7 @@ func (p *MyTestStruct) readField11(ctx context.Context, iprot TProtocol) error { } tSet := make(map[string]struct{}, size) p.StringSet = tSet - for i := 0; i < size; i++ { + for range size { var _elem3 string if v, err := iprot.ReadString(ctx); err != nil { return PrependError("error reading field 0: ", err) diff --git a/lib/go/thrift/simple_json_protocol.go b/lib/go/thrift/simple_json_protocol.go index f7fe68c23d2..ec12991a1d7 100644 --- a/lib/go/thrift/simple_json_protocol.go +++ b/lib/go/thrift/simple_json_protocol.go @@ -1306,7 +1306,7 @@ func (p *TSimpleJSONProtocol) readNumeric() (Numeric, error) { // Safely peeks into the buffer, reading only what is necessary func (p *TSimpleJSONProtocol) safePeekContains(b []byte) bool { - for i := 0; i < len(b); i++ { + for i := range b { a, _ := p.reader.Peek(i + 1) if len(a) < (i+1) || a[i] != b[i] { return false diff --git a/lib/go/thrift/simple_json_protocol_test.go b/lib/go/thrift/simple_json_protocol_test.go index 89753c6148a..002a2310333 100644 --- a/lib/go/thrift/simple_json_protocol_test.go +++ b/lib/go/thrift/simple_json_protocol_test.go @@ -497,7 +497,7 @@ func TestReadSimpleJSONProtocolBinary(t *testing.T) { if len(v) != len(value) { t.Fatalf("Bad value for %s value length %v, wrote: %v, received length: %v", thetype, len(value), s, len(v)) } - for i := 0; i < len(v); i++ { + for i := range v { if v[i] != value[i] { t.Fatalf("Bad value for %s at index %d value %v, wrote: %v, received: %v", thetype, i, value[i], s, v[i]) } diff --git a/lib/go/thrift/ssl_server_socket.go b/lib/go/thrift/ssl_server_socket.go index 907afca326f..3f05ad93db6 100644 --- a/lib/go/thrift/ssl_server_socket.go +++ b/lib/go/thrift/ssl_server_socket.go @@ -93,6 +93,9 @@ func (p *TSSLServerSocket) Open() error { } func (p *TSSLServerSocket) Addr() net.Addr { + if p.listener != nil { + return p.listener.Addr() + } return p.addr } diff --git a/lib/go/thrift/transport_test.go b/lib/go/thrift/transport_test.go index 309cc280507..b6263b8b577 100644 --- a/lib/go/thrift/transport_test.go +++ b/lib/go/thrift/transport_test.go @@ -36,7 +36,7 @@ var ( func init() { transport_bdata = make([]byte, TRANSPORT_BINARY_DATA_SIZE) - for i := 0; i < TRANSPORT_BINARY_DATA_SIZE; i++ { + for i := range TRANSPORT_BINARY_DATA_SIZE { transport_bdata[i] = byte((i + 'a') % 255) } transport_header = map[string]string{"key": "User-Agent", diff --git a/test/go/go.mod b/test/go/go.mod index f69cdb4438e..f1f6f919747 100644 --- a/test/go/go.mod +++ b/test/go/go.mod @@ -1,6 +1,6 @@ module github.com/apache/thrift/test/go -go 1.21 +go 1.22.0 require ( github.com/apache/thrift v0.0.0-00010101000000-000000000000 diff --git a/test/go/src/bin/stress/main.go b/test/go/src/bin/stress/main.go index 3273d1bbe2d..89e87c4a64c 100644 --- a/test/go/src/bin/stress/main.go +++ b/test/go/src/bin/stress/main.go @@ -133,7 +133,7 @@ func main() { if *clients != 0 { ready.Add(*clients + 1) done.Add(*clients) - for i := 0; i < *clients; i++ { + for range *clients { go client(protocolFactory) } ready.Done() @@ -170,45 +170,45 @@ func client(protocolFactory thrift.TProtocolFactory) { ready.Wait() switch callType { case echoVoid: - for i := 0; i < *loop; i++ { + for range *loop { client.EchoVoid(ctx) atomic.AddInt64(&clicounter, 1) } case echoByte: - for i := 0; i < *loop; i++ { + for range *loop { client.EchoByte(ctx, 42) atomic.AddInt64(&clicounter, 1) } case echoI32: - for i := 0; i < *loop; i++ { + for range *loop { client.EchoI32(ctx, 4242) atomic.AddInt64(&clicounter, 1) } case echoI64: - for i := 0; i < *loop; i++ { + for range *loop { client.EchoI64(ctx, 424242) atomic.AddInt64(&clicounter, 1) } case echoString: - for i := 0; i < *loop; i++ { + for range *loop { client.EchoString(ctx, "TestString") atomic.AddInt64(&clicounter, 1) } case echiList: l := []int8{-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8} - for i := 0; i < *loop; i++ { + for range *loop { client.EchoList(ctx, l) atomic.AddInt64(&clicounter, 1) } case echoSet: s := []int8{-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8} - for i := 0; i < *loop; i++ { + for range *loop { client.EchoSet(ctx, s) atomic.AddInt64(&clicounter, 1) } case echoMap: m := map[int8]int8{-10: 10, -9: 9, -8: 8, -7: 7, -6: 6, -5: 5, -4: 4, -3: 3, -2: 2, -1: 1, 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8} - for i := 0; i < *loop; i++ { + for range *loop { client.EchoMap(ctx, m) atomic.AddInt64(&clicounter, 1) } diff --git a/test/go/src/bin/testclient/main.go b/test/go/src/bin/testclient/main.go index 95fcd47cc72..a71223ca602 100644 --- a/test/go/src/bin/testclient/main.go +++ b/test/go/src/bin/testclient/main.go @@ -20,8 +20,10 @@ package main import ( + "bytes" "context" "flag" + "fmt" t "log" "reflect" @@ -41,11 +43,15 @@ var testloops = flag.Int("testloops", 1, "Number of Tests") func main() { flag.Parse() - client, _, err := common.StartClient(*host, *port, *domain_socket, *transport, *protocol, *ssl) + addr := *domain_socket + if addr == "" { + addr = fmt.Sprintf("%s:%d", *host, *port) + } + client, _, err := common.StartClient(addr, *transport, *protocol, *ssl) if err != nil { t.Fatalf("Unable to start client: ", err) } - for i := 0; i < *testloops; i++ { + for range *testloops { callEverything(client) } } @@ -127,17 +133,15 @@ func callEverything(client *thrifttest.ThriftTestClient) { } binout := make([]byte, 256) - for i := 0; i < 256; i++ { + for i := range binout { binout[i] = byte(i) } bin, err := client.TestBinary(defaultCtx, binout) if err != nil { t.Fatalf("TestBinary failed with %v", err) } - for i := 0; i < 256; i++ { - if binout[i] != bin[i] { - t.Fatalf("Unexpected TestBinary() result expected %d, got %d ", binout[i], bin[i]) - } + if !bytes.Equal(binout, bin) { + t.Fatalf("Unexpected TestBinary() result expected % 02x, got % 02x ", binout, bin) } uout := thrift.Tuuid{ diff --git a/test/go/src/bin/testserver/main.go b/test/go/src/bin/testserver/main.go index 60a764fdbc8..652fafa0ba1 100644 --- a/test/go/src/bin/testserver/main.go +++ b/test/go/src/bin/testserver/main.go @@ -41,7 +41,7 @@ var certPath = flag.String("certPath", "keys", "Directory that contains SSL cert func main() { flag.Parse() - processor, serverTransport, transportFactory, protocolFactory, err := common.GetServerParams(*host, *port, *domain_socket, *transport, *protocol, *ssl, *certPath, common.PrintingHandler) + processor, serverTransport, transportFactory, protocolFactory, _, err := common.GetServerParams(*host, *port, *domain_socket, *transport, *protocol, *ssl, *certPath, common.PrintingHandler) if err != nil { log.Fatalf("Unable to process server params: %v", err) diff --git a/test/go/src/common/client.go b/test/go/src/common/client.go index f9dfcaf6bb7..2383b82e6c2 100644 --- a/test/go/src/common/client.go +++ b/test/go/src/common/client.go @@ -37,14 +37,11 @@ func init() { } func StartClient( - host string, - port int64, - domain_socket string, + addr string, transport string, protocol string, ssl bool, ) (client *thrifttest.ThriftTestClient, trans thrift.TTransport, err error) { - hostPort := fmt.Sprintf("%s:%d", host, port) cfg := &thrift.TConfiguration{ TLSConfig: &tls.Config{ InsecureSkipVerify: true, @@ -70,13 +67,9 @@ func StartClient( protocolFactory = thrift.NewTDebugProtocolFactoryWithLogger(protocolFactory, "client:", thrift.StdLogger(nil)) } if ssl { - trans = thrift.NewTSSLSocketConf(hostPort, cfg) + trans = thrift.NewTSSLSocketConf(addr, cfg) } else { - if domain_socket != "" { - trans = thrift.NewTSocketConf(domain_socket, nil) - } else { - trans = thrift.NewTSocketConf(hostPort, nil) - } + trans = thrift.NewTSocketConf(addr, nil) } if err != nil { return nil, nil, err @@ -88,10 +81,9 @@ func StartClient( TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } client := &http.Client{Transport: tr} - trans, err = thrift.NewTHttpClientWithOptions(fmt.Sprintf("https://%s/", hostPort), thrift.THttpClientOptions{Client: client}) - fmt.Println(hostPort) + trans, err = thrift.NewTHttpClientWithOptions(fmt.Sprintf("https://%s/", addr), thrift.THttpClientOptions{Client: client}) } else { - trans, err = thrift.NewTHttpClient(fmt.Sprintf("http://%s/", hostPort)) + trans, err = thrift.NewTHttpClient(fmt.Sprintf("http://%s/", addr)) } case "framed": trans = thrift.NewTFramedTransportConf(trans, cfg) diff --git a/test/go/src/common/clientserver_test.go b/test/go/src/common/clientserver_test.go index a39519d8a56..48203b6739a 100644 --- a/test/go/src/common/clientserver_test.go +++ b/test/go/src/common/clientserver_test.go @@ -22,6 +22,7 @@ package common import ( "context" "errors" + "fmt" "reflect" "sync" "testing" @@ -42,10 +43,10 @@ type test_unit struct { } var units = []test_unit{ - {"127.0.0.1", 9095, "", "", "binary", false}, - {"127.0.0.1", 9091, "", "", "compact", false}, - {"127.0.0.1", 9092, "", "", "binary", true}, - {"127.0.0.1", 9093, "", "", "compact", true}, + {"127.0.0.1", 0, "", "", "binary", false}, + {"127.0.0.1", 0, "", "", "compact", false}, + {"127.0.0.1", 0, "", "", "binary", true}, + {"127.0.0.1", 0, "", "", "compact", true}, } func TestAllConnection(t *testing.T) { @@ -61,29 +62,31 @@ func TestAllConnection(t *testing.T) { } func doUnit(t *testing.T, unit *test_unit) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - handler := NewMockThriftTest(ctrl) - - processor, serverTransport, transportFactory, protocolFactory, err := GetServerParams(unit.host, unit.port, unit.domain_socket, unit.transport, unit.protocol, unit.ssl, "../../../keys", handler) - if err != nil { - t.Errorf("GetServerParams failed: %v", err) - } + t.Run(fmt.Sprintf("%v", *unit), func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + handler := NewMockThriftTest(ctrl) + + processor, serverTransport, transportFactory, protocolFactory, addr, err := GetServerParams(unit.host, unit.port, unit.domain_socket, unit.transport, unit.protocol, unit.ssl, "../../../keys", handler) + if err != nil { + t.Errorf("GetServerParams failed: %v", err) + } - server := thrift.NewTSimpleServer4(processor, serverTransport, transportFactory, protocolFactory) - if err = server.Listen(); err != nil { - t.Errorf("Unable to start server: %v", err) - return - } - go server.Serve() - defer server.Stop() - client, trans, err := StartClient(unit.host, unit.port, unit.domain_socket, unit.transport, unit.protocol, unit.ssl) - if err != nil { - t.Errorf("Unable to start client: %v", err) - return - } - defer trans.Close() - callEverythingWithMock(t, client, handler) + server := thrift.NewTSimpleServer4(processor, serverTransport, transportFactory, protocolFactory) + if err = server.Listen(); err != nil { + t.Errorf("Unable to start server: %v", err) + return + } + go server.Serve() + defer server.Stop() + client, trans, err := StartClient(addr, unit.transport, unit.protocol, unit.ssl) + if err != nil { + t.Errorf("Unable to start client: %v", err) + return + } + defer trans.Close() + callEverythingWithMock(t, client, handler) + }) } var rmapmap = map[int32]map[int32]int32{ diff --git a/test/go/src/common/context_test.go b/test/go/src/common/context_test.go index c6cbad8f68d..0aa217f5862 100644 --- a/test/go/src/common/context_test.go +++ b/test/go/src/common/context_test.go @@ -40,12 +40,17 @@ func (slowHttpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } func TestHttpContextTimeout(t *testing.T) { - unit := test_unit{"127.0.0.1", 9096, "", "http", "binary", false} + const ( + host = "127.0.0.1" + port = 9096 + ) + addr := fmt.Sprintf("%s:%d", host, port) + unit := test_unit{host, port, "", "http", "binary", false} - server := &http.Server{Addr: unit.host + fmt.Sprintf(":%d", unit.port), Handler: slowHttpHandler{}} + server := &http.Server{Addr: addr, Handler: slowHttpHandler{}} go server.ListenAndServe() - client, trans, err := StartClient(unit.host, unit.port, unit.domain_socket, unit.transport, unit.protocol, unit.ssl) + client, trans, err := StartClient(addr, unit.transport, unit.protocol, unit.ssl) if err != nil { t.Errorf("Unable to start client: %v", err) return diff --git a/test/go/src/common/server.go b/test/go/src/common/server.go index f48389d4406..0af2702f04e 100644 --- a/test/go/src/common/server.go +++ b/test/go/src/common/server.go @@ -46,10 +46,10 @@ func GetServerParams( ssl bool, certPath string, handler thrifttest.ThriftTest, -) (thrift.TProcessor, thrift.TServerTransport, thrift.TTransportFactory, thrift.TProtocolFactory, error) { +) (thrift.TProcessor, thrift.TServerTransport, thrift.TTransportFactory, thrift.TProtocolFactory, string /* addr */, error) { var err error - hostPort := fmt.Sprintf("%s:%d", host, port) + hostPort := fmt.Sprintf("%s:0", host) var cfg *thrift.TConfiguration = nil var protocolFactory thrift.TProtocolFactory @@ -65,30 +65,54 @@ func GetServerParams( case "header": protocolFactory = thrift.NewTHeaderProtocolFactoryConf(nil) default: - return nil, nil, nil, nil, fmt.Errorf("invalid protocol specified %s", protocol) + return nil, nil, nil, nil, "", fmt.Errorf("invalid protocol specified %s", protocol) } if debugServerProtocol { protocolFactory = thrift.NewTDebugProtocolFactoryWithLogger(protocolFactory, "server:", thrift.StdLogger(nil)) } var serverTransport thrift.TServerTransport + var addr string if ssl { cfg := new(tls.Config) if cert, err := tls.LoadX509KeyPair(certPath+"/server.crt", certPath+"/server.key"); err != nil { - return nil, nil, nil, nil, err + return nil, nil, nil, nil, "", err } else { cfg.Certificates = append(cfg.Certificates, cert) } - serverTransport, err = thrift.NewTSSLServerSocket(hostPort, cfg) + transport, transportErr := thrift.NewTSSLServerSocket(hostPort, cfg) + if transportErr == nil { + listenErr := transport.Listen() + if listenErr == nil { + serverTransport = transport + addr = transport.Addr().String() + } else { + err = listenErr + } + } else { + err = transportErr + } } else { if domain_socket != "" { serverTransport, err = thrift.NewTServerSocket(domain_socket) + addr = domain_socket } else { - serverTransport, err = thrift.NewTServerSocket(hostPort) + transport, transportErr := thrift.NewTServerSocket(hostPort) + if transportErr == nil { + listenErr := transport.Listen() + if listenErr == nil { + serverTransport = transport + addr = transport.Addr().String() + } else { + err = listenErr + } + } else { + err = transportErr + } } } if err != nil { - return nil, nil, nil, nil, err + return nil, nil, nil, nil, "", err } var transportFactory thrift.TTransportFactory @@ -107,9 +131,9 @@ func GetServerParams( case "": transportFactory = thrift.NewTTransportFactory() default: - return nil, nil, nil, nil, fmt.Errorf("invalid transport specified %s", transport) + return nil, nil, nil, nil, "", fmt.Errorf("invalid transport specified %s", transport) } processor := thrifttest.NewThriftTestProcessor(handler) - return processor, serverTransport, transportFactory, protocolFactory, nil + return processor, serverTransport, transportFactory, protocolFactory, addr, nil } From a44c0c6c3e3f60342d6ee8530f7d887e1424f7a2 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Wed, 14 Aug 2024 14:42:16 -0700 Subject: [PATCH 102/430] Fix failed java build (#3019) Fix Java compilation issues introduced by THRIFT-4847 in d4503a1f0e62d38f7a12ba9748744c5490c915c4 Also fix the failing spotlessCheck --------- Co-authored-by: Mario Emmenlauer Co-authored-by: Christopher Tubbs --- .../org/apache/thrift/server/AbstractNonblockingServer.java | 1 + .../org/apache/thrift/server/TThreadedSelectorServer.java | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java index a573f0cdd77..0388c1104db 100644 --- a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java +++ b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java @@ -304,6 +304,7 @@ public FrameBuffer( /** * Sets the selection key (this is not thread safe). + * * @param selectionKey the new key to set. */ public void setSelectionKey(SelectionKey selectionKey) { diff --git a/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java b/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java index 2a95fe176cd..33b4686ded7 100644 --- a/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java +++ b/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java @@ -637,11 +637,11 @@ private synchronized void rebuildSelector() { SelectionKey newKey; try { if (attachment == null) { - newKey = channel.register(newSelector, interestOpts); + newKey = channel.register(newSelector, interestOps); } else { - newKey = channel.register(newSelector, interestOpts, attachment); + newKey = channel.register(newSelector, interestOps, attachment); if (attachment instanceof FrameBuffer) { - ((FrameBuffer) attachment.setSelectionKey(newKey); + ((FrameBuffer) attachment).setSelectionKey(newKey); } } } catch (ClosedChannelException e) { From 539c9224cf093078400527494e994946d605cd2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 21:07:41 -0400 Subject: [PATCH 103/430] Bump com.ncorti.ktfmt.gradle from 0.12.0 to 0.19.0 in /lib/kotlin (#3015) * Bump com.ncorti.ktfmt.gradle from 0.12.0 to 0.19.0 in /lib/kotlin Bumps com.ncorti.ktfmt.gradle from 0.12.0 to 0.19.0. --- updated-dependencies: - dependency-name: com.ncorti.ktfmt.gradle dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Fix formatting for updated ktfmt --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Christopher Tubbs --- .../org/apache/thrift/test/TestClient.kt | 54 ++++++++----------- .../org/apache/thrift/test/TestHandler.kt | 7 ++- .../org/apache/thrift/test/TestServer.kt | 31 ++++------- lib/kotlin/settings.gradle.kts | 2 +- .../kotlin/org/apache/thrift/MetaDataTest.kt | 3 +- 5 files changed, 38 insertions(+), 59 deletions(-) diff --git a/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt b/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt index c238d0b426e..a9241da5c53 100644 --- a/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt +++ b/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt @@ -114,8 +114,7 @@ class TestClient : CliktCommand() { TransportType.Framed -> TNonblockingSocket(host, port, socketTimeout) else -> throw UnsupportedOperationException( - "only frame transport type is supported for now, got $transportType" - ) + "only frame transport type is supported for now, got $transportType") } private val clientManager = TAsyncClientManager() @@ -273,8 +272,7 @@ class TestClient : CliktCommand() { if (xtructs != null) { for ((string_thing, byte_thing, i32_thing, i64_thing) in xtructs) { print( - "{\"$string_thing\", $byte_thing, $i32_thing, $i64_thing}, " - ) + "{\"$string_thing\", $byte_thing, $i32_thing, $i64_thing}, ") } } print("}") @@ -286,15 +284,13 @@ class TestClient : CliktCommand() { if (whoa.size == 2 && whoa.containsKey(1L) && whoa.containsKey(2L)) { val firstMap = whoa[1L]!! val secondMap = whoa[2L]!! - if ( - firstMap.size == 2 && - firstMap.containsKey(Numberz.TWO) && - firstMap.containsKey(Numberz.THREE) && - secondMap.size == 1 && - secondMap.containsKey(Numberz.SIX) && - insane == firstMap[Numberz.TWO] && - insane == firstMap[Numberz.THREE] - ) { + if (firstMap.size == 2 && + firstMap.containsKey(Numberz.TWO) && + firstMap.containsKey(Numberz.THREE) && + secondMap.size == 1 && + secondMap.containsKey(Numberz.SIX) && + insane == firstMap[Numberz.TWO] && + insane == firstMap[Numberz.THREE]) { val six = secondMap[Numberz.SIX]!! // Cannot use "new Insanity().equals(six)" because as of now, // struct/container @@ -365,11 +361,9 @@ class TestClient : CliktCommand() { private suspend fun multiplexTest(returnCode: Int): Int { var code = returnCode - if ( - protocolType == ProtocolType.Multi || - protocolType == ProtocolType.MultiJson || - protocolType == ProtocolType.MultiCompact - ) { + if (protocolType == ProtocolType.Multi || + protocolType == ProtocolType.MultiJson || + protocolType == ProtocolType.MultiCompact) { val secondClient: SecondServiceClient = createSecondServiceClient() print("secondtestString(\"Test2\")") val s = secondClient.secondtestString("Test2") @@ -529,8 +523,7 @@ private suspend fun ThriftTestClient.structTest(returnCode: Int): Pair { val tNonblockingServerArgs = TNonblockingServer.Args(tNonblockingServerSocket) tNonblockingServerArgs.processor( - if (isMulti) multiplexedProcessor else testProcessor - ) + if (isMulti) multiplexedProcessor else testProcessor) tNonblockingServerArgs.protocolFactory(tProtocolFactory) tNonblockingServerArgs.transportFactory(tTransportFactory) return TNonblockingServer(tNonblockingServerArgs) @@ -277,8 +270,7 @@ private fun getServerEngine( val tThreadedSelectorServerArgs = TThreadedSelectorServer.Args(tNonblockingServerSocket) tThreadedSelectorServerArgs.processor( - if (isMulti) multiplexedProcessor else testProcessor - ) + if (isMulti) multiplexedProcessor else testProcessor) tThreadedSelectorServerArgs.protocolFactory(tProtocolFactory) tThreadedSelectorServerArgs.transportFactory(tTransportFactory) return TThreadedSelectorServer(tThreadedSelectorServerArgs) @@ -305,8 +297,7 @@ private fun getServerEngine( else -> { val tThreadPoolServerArgs = TThreadPoolServer.Args(tServerSocket) tThreadPoolServerArgs.processor( - if (isMulti) multiplexedProcessor else testProcessor - ) + if (isMulti) multiplexedProcessor else testProcessor) tThreadPoolServerArgs.protocolFactory(tProtocolFactory) tThreadPoolServerArgs.transportFactory(tTransportFactory) return TThreadPoolServer(tThreadPoolServerArgs) diff --git a/lib/kotlin/settings.gradle.kts b/lib/kotlin/settings.gradle.kts index 6bbfd7f6723..0f000367b8d 100644 --- a/lib/kotlin/settings.gradle.kts +++ b/lib/kotlin/settings.gradle.kts @@ -19,7 +19,7 @@ pluginManagement { plugins { kotlin("jvm") version "1.9.23" - id("com.ncorti.ktfmt.gradle") version "0.12.0" + id("com.ncorti.ktfmt.gradle") version "0.19.0" } } diff --git a/lib/kotlin/src/test/kotlin/org/apache/thrift/MetaDataTest.kt b/lib/kotlin/src/test/kotlin/org/apache/thrift/MetaDataTest.kt index e066bbe4dce..16dc71e579e 100644 --- a/lib/kotlin/src/test/kotlin/org/apache/thrift/MetaDataTest.kt +++ b/lib/kotlin/src/test/kotlin/org/apache/thrift/MetaDataTest.kt @@ -36,7 +36,6 @@ internal class MetaDataTest { "max" to "100000", "min" to "1", ), - idField.fieldAnnotations - ) + idField.fieldAnnotations) } } From 8a5fa6062137e8d73adcdd7960a539ca58fc7d4c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 21:27:13 -0400 Subject: [PATCH 104/430] Bump jvm from 1.9.23 to 2.0.10 in /lib/kotlin (#3023) Bumps [jvm](https://github.com/JetBrains/kotlin) from 1.9.23 to 2.0.10. - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.23...v2.0.10) --- updated-dependencies: - dependency-name: jvm dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- lib/kotlin/settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/kotlin/settings.gradle.kts b/lib/kotlin/settings.gradle.kts index 0f000367b8d..cb797ee5a76 100644 --- a/lib/kotlin/settings.gradle.kts +++ b/lib/kotlin/settings.gradle.kts @@ -18,7 +18,7 @@ */ pluginManagement { plugins { - kotlin("jvm") version "1.9.23" + kotlin("jvm") version "2.0.10" id("com.ncorti.ktfmt.gradle") version "0.19.0" } } From 3b67982f7acb85586615f6d8a7a725a203a3c132 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 01:07:07 -0400 Subject: [PATCH 105/430] Bump com.bmuschko:gradle-clover-plugin in /lib/kotlin (#2793) Bumps [com.bmuschko:gradle-clover-plugin](https://github.com/bmuschko/gradle-clover-plugin) from 2.2.1 to 3.0.3. - [Release notes](https://github.com/bmuschko/gradle-clover-plugin/releases) - [Changelog](https://github.com/bmuschko/gradle-clover-plugin/blob/master/RELEASE_NOTES.md) - [Commits](https://github.com/bmuschko/gradle-clover-plugin/compare/v2.2.1...3.0.3) --- updated-dependencies: - dependency-name: com.bmuschko:gradle-clover-plugin dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- lib/java/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/java/build.gradle b/lib/java/build.gradle index 67c4af5cb39..0acb8a83166 100644 --- a/lib/java/build.gradle +++ b/lib/java/build.gradle @@ -31,7 +31,7 @@ buildscript { } dependencies { - classpath 'com.bmuschko:gradle-clover-plugin:2.2.1' + classpath 'com.bmuschko:gradle-clover-plugin:3.0.3' } } From e98d6b1547e033219e71e244e3568e93fdba22ce Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Wed, 14 Aug 2024 13:57:52 -0700 Subject: [PATCH 106/430] go: Fix cross test server Client: go This was a bug introduced by 91565d490e98306ac6797dd6ed4f72c0e8222e78 that broke go's cross-test server, but because other CI issues we didn't run cross-test so we didn't notice the issue. --- test/go/src/bin/testserver/main.go | 5 +++- test/go/src/common/server.go | 43 +++++++++++++++++++----------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/test/go/src/bin/testserver/main.go b/test/go/src/bin/testserver/main.go index 652fafa0ba1..0cfb62c9665 100644 --- a/test/go/src/bin/testserver/main.go +++ b/test/go/src/bin/testserver/main.go @@ -59,7 +59,10 @@ func main() { return } } else { - http.ListenAndServe(fmt.Sprintf(":%d", *port), nil) + if err := http.ListenAndServe(fmt.Sprintf(":%d", *port), nil); err != nil { + fmt.Println(err) + return + } } } else { server := thrift.NewTSimpleServer4(processor, serverTransport, transportFactory, protocolFactory) diff --git a/test/go/src/common/server.go b/test/go/src/common/server.go index 0af2702f04e..85429f0a6b5 100644 --- a/test/go/src/common/server.go +++ b/test/go/src/common/server.go @@ -49,7 +49,7 @@ func GetServerParams( ) (thrift.TProcessor, thrift.TServerTransport, thrift.TTransportFactory, thrift.TProtocolFactory, string /* addr */, error) { var err error - hostPort := fmt.Sprintf("%s:0", host) + hostPort := fmt.Sprintf("%s:%d", host, port) var cfg *thrift.TConfiguration = nil var protocolFactory thrift.TProtocolFactory @@ -73,6 +73,15 @@ func GetServerParams( var serverTransport thrift.TServerTransport var addr string + if transport == "http" { + // In cross-test servers, we would call http.ListenAndServe + // again on the host:port, so don't use the listen to fill the + // addr and just generate it here instead. + addr = hostPort + if domain_socket != "" { + addr = domain_socket + } + } if ssl { cfg := new(tls.Config) if cert, err := tls.LoadX509KeyPair(certPath+"/server.crt", certPath+"/server.key"); err != nil { @@ -80,14 +89,16 @@ func GetServerParams( } else { cfg.Certificates = append(cfg.Certificates, cert) } - transport, transportErr := thrift.NewTSSLServerSocket(hostPort, cfg) + serverSocket, transportErr := thrift.NewTSSLServerSocket(hostPort, cfg) if transportErr == nil { - listenErr := transport.Listen() - if listenErr == nil { - serverTransport = transport - addr = transport.Addr().String() - } else { - err = listenErr + if transport != "http" { + listenErr := serverSocket.Listen() + if listenErr == nil { + serverTransport = serverSocket + addr = serverSocket.Addr().String() + } else { + err = listenErr + } } } else { err = transportErr @@ -97,14 +108,16 @@ func GetServerParams( serverTransport, err = thrift.NewTServerSocket(domain_socket) addr = domain_socket } else { - transport, transportErr := thrift.NewTServerSocket(hostPort) + serverSocket, transportErr := thrift.NewTServerSocket(hostPort) if transportErr == nil { - listenErr := transport.Listen() - if listenErr == nil { - serverTransport = transport - addr = transport.Addr().String() - } else { - err = listenErr + if transport != "http" { + listenErr := serverSocket.Listen() + if listenErr == nil { + serverTransport = serverSocket + addr = serverSocket.Addr().String() + } else { + err = listenErr + } } } else { err = transportErr From cf0b803512850904da49f5d133f5559d6679e37b Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Tue, 20 Aug 2024 10:17:09 -0700 Subject: [PATCH 107/430] Fix python build on Github Actions There were some recent changes causing six to be installed on the `make install` step instead of (implicitly) on the `Python setup` step before, and the six installed on `make install` step was not available to the next `make check` step and causing errors. Install six on `Python setup` step explicitly instead. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 39e8b8e55a7..aef5e20fe44 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -422,7 +422,7 @@ jobs: - name: Python setup run: | - python -m pip install --upgrade pip setuptools wheel flake8 tornado twisted zope.interface + python -m pip install --upgrade pip setuptools wheel flake8 six tornado twisted zope.interface python --version pip --version From 55ea8f3c7e62916e46995ea49302270a3d0c611c Mon Sep 17 00:00:00 2001 From: Konstantin Pozdniakov Date: Wed, 16 Feb 2022 16:40:21 +0300 Subject: [PATCH 108/430] Python3 type hints args not optional type hint UUID generator support Remove runtime type check --- .../cpp/src/thrift/generate/t_py_generator.cc | 547 +++++++++++------- 1 file changed, 335 insertions(+), 212 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_py_generator.cc b/compiler/cpp/src/thrift/generate/t_py_generator.cc index d3f23b6c89e..ddca9fe3931 100644 --- a/compiler/cpp/src/thrift/generate/t_py_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_py_generator.cc @@ -17,21 +17,21 @@ * under the License. */ -#include #include #include #include #include +#include #include +#include "thrift/generate/t_generator.h" +#include "thrift/platform.h" +#include "thrift/version.h" +#include +#include #include #include #include -#include -#include -#include "thrift/platform.h" -#include "thrift/version.h" -#include "thrift/generate/t_generator.h" using std::map; using std::ostream; @@ -49,7 +49,7 @@ class t_py_generator : public t_generator { t_py_generator(t_program* program, const std::map& parsed_options, const std::string& option_string) - : t_generator (program) { + : t_generator(program) { update_keywords_for_validation(); std::map::const_iterator iter; @@ -63,6 +63,7 @@ class t_py_generator : public t_generator { gen_twisted_ = false; gen_dynamic_ = false; gen_enum_ = false; + gen_type_hints_ = false; coding_ = ""; gen_dynbaseclass_ = ""; gen_dynbaseclass_exc_ = ""; @@ -70,61 +71,70 @@ class t_py_generator : public t_generator { gen_dynbaseclass_frozen_ = ""; import_dynbase_ = ""; package_prefix_ = ""; - for( iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) { - if( iter->first.compare("enum") == 0) { + for (iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) { + if (iter->first.compare("enum") == 0) { gen_enum_ = true; - } else if( iter->first.compare("new_style") == 0) { - pwarning(0, "new_style is enabled by default, so the option will be removed in the near future.\n"); - } else if( iter->first.compare("old_style") == 0) { + } else if (iter->first.compare("new_style") == 0) { + pwarning( + 0, + "new_style is enabled by default, so the option will be removed in the near future.\n"); + } else if (iter->first.compare("old_style") == 0) { gen_newstyle_ = false; pwarning(0, "old_style is deprecated and may be removed in the future.\n"); - } else if( iter->first.compare("utf8strings") == 0) { - pwarning(0, "utf8strings is enabled by default, so the option will be removed in the near future.\n"); - } else if( iter->first.compare("no_utf8strings") == 0) { + } else if (iter->first.compare("utf8strings") == 0) { + pwarning(0, + "utf8strings is enabled by default, so the option will be removed in the near " + "future.\n"); + } else if (iter->first.compare("no_utf8strings") == 0) { gen_utf8strings_ = false; - } else if( iter->first.compare("slots") == 0) { + } else if (iter->first.compare("slots") == 0) { gen_slots_ = true; - } else if( iter->first.compare("package_prefix") == 0) { + } else if (iter->first.compare("package_prefix") == 0) { package_prefix_ = iter->second; - } else if( iter->first.compare("dynamic") == 0) { + } else if (iter->first.compare("dynamic") == 0) { gen_dynamic_ = true; gen_newstyle_ = false; // dynamic is newstyle - if( gen_dynbaseclass_.empty()) { + if (gen_dynbaseclass_.empty()) { gen_dynbaseclass_ = "TBase"; } - if( gen_dynbaseclass_frozen_.empty()) { + if (gen_dynbaseclass_frozen_.empty()) { gen_dynbaseclass_frozen_ = "TFrozenBase"; } - if( gen_dynbaseclass_exc_.empty()) { + if (gen_dynbaseclass_exc_.empty()) { gen_dynbaseclass_exc_ = "TExceptionBase"; } - if( gen_dynbaseclass_frozen_exc_.empty()) { + if (gen_dynbaseclass_frozen_exc_.empty()) { gen_dynbaseclass_frozen_exc_ = "TFrozenExceptionBase"; } - if( import_dynbase_.empty()) { - import_dynbase_ = "from thrift.protocol.TBase import TBase, TFrozenBase, TExceptionBase, TFrozenExceptionBase, TTransport\n"; + if (import_dynbase_.empty()) { + import_dynbase_ + = "from thrift.protocol.TBase import TBase, TFrozenBase, TExceptionBase, " + "TFrozenExceptionBase, TTransport\n"; } - } else if( iter->first.compare("dynbase") == 0) { + } else if (iter->first.compare("dynbase") == 0) { gen_dynbase_ = true; gen_dynbaseclass_ = (iter->second); - } else if( iter->first.compare("dynfrozen") == 0) { + } else if (iter->first.compare("dynfrozen") == 0) { gen_dynbaseclass_frozen_ = (iter->second); - } else if( iter->first.compare("dynexc") == 0) { + } else if (iter->first.compare("dynexc") == 0) { gen_dynbaseclass_exc_ = (iter->second); - } else if( iter->first.compare("dynfrozenexc") == 0) { + } else if (iter->first.compare("dynfrozenexc") == 0) { gen_dynbaseclass_frozen_exc_ = (iter->second); - } else if( iter->first.compare("dynimport") == 0) { + } else if (iter->first.compare("dynimport") == 0) { gen_dynbase_ = true; import_dynbase_ = (iter->second); - } else if( iter->first.compare("zope.interface") == 0) { + } else if (iter->first.compare("zope.interface") == 0) { gen_zope_interface_ = true; - } else if( iter->first.compare("twisted") == 0) { + } else if (iter->first.compare("twisted") == 0) { gen_twisted_ = true; gen_zope_interface_ = true; - } else if( iter->first.compare("tornado") == 0) { + } else if (iter->first.compare("tornado") == 0) { gen_tornado_ = true; - } else if( iter->first.compare("coding") == 0) { + } else if (iter->first.compare("coding") == 0) { coding_ = iter->second; + } else if (iter->first.compare("type_hints") == 0) { + gen_type_hints_ = true; + gen_enum_ = true; } else { throw "unknown option py:" + iter->first; } @@ -145,9 +155,7 @@ class t_py_generator : public t_generator { } } - std::string indent_str() const override { - return " "; - } + std::string indent_str() const override { return " "; } /** * Init and close methods @@ -200,9 +208,7 @@ class t_py_generator : public t_generator { * Serialization constructs */ - void generate_deserialize_field(std::ostream& out, - t_field* tfield, - std::string prefix = ""); + void generate_deserialize_field(std::ostream& out, t_field* tfield, std::string prefix = ""); void generate_deserialize_struct(std::ostream& out, t_struct* tstruct, std::string prefix = ""); @@ -212,9 +218,7 @@ class t_py_generator : public t_generator { void generate_deserialize_map_element(std::ostream& out, t_map* tmap, std::string prefix = ""); - void generate_deserialize_list_element(std::ostream& out, - t_list* tlist, - std::string prefix = ""); + void generate_deserialize_list_element(std::ostream& out, t_list* tlist, std::string prefix = ""); void generate_serialize_field(std::ostream& out, t_field* tfield, std::string prefix = ""); @@ -252,18 +256,26 @@ class t_py_generator : public t_generator { std::string declare_argument(t_field* tfield); std::string render_field_default_value(t_field* tfield); std::string type_name(t_type* ttype); - std::string function_signature(t_function* tfunction, bool interface = false); + std::string function_signature(t_function* tfunction, + bool interface = false, + bool send_part = false); std::string argument_list(t_struct* tstruct, std::vector* pre = nullptr, std::vector* post = nullptr); std::string type_to_enum(t_type* ttype); std::string type_to_spec_args(t_type* ttype); + std::string type_to_py_type(t_type* type); + std::string member_hint(t_type* type, t_field::e_req req); + std::string arg_hint(t_type* type); + std::string func_hint(t_type* type); static bool is_valid_namespace(const std::string& sub_namespace) { return sub_namespace == "twisted"; } - static std::string get_real_py_module(const t_program* program, bool gen_twisted, std::string package_dir="") { + static std::string get_real_py_module(const t_program* program, + bool gen_twisted, + std::string package_dir = "") { if (gen_twisted) { std::string twisted_module = program->get_namespace("py.twisted"); if (!twisted_module.empty()) { @@ -279,7 +291,8 @@ class t_py_generator : public t_generator { } static bool is_immutable(t_type* ttype) { - std::map>::iterator it = ttype->annotations_.find("python.immutable"); + std::map>::iterator it + = ttype->annotations_.find("python.immutable"); if (it == ttype->annotations_.end()) { // Exceptions are immutable by default. @@ -292,7 +305,6 @@ class t_py_generator : public t_generator { } private: - /** * True if we should generate new-style classes. */ @@ -300,8 +312,8 @@ class t_py_generator : public t_generator { bool gen_enum_; /** - * True if we should generate dynamic style classes. - */ + * True if we should generate dynamic style classes. + */ bool gen_dynamic_; bool gen_dynbase_; @@ -314,6 +326,11 @@ class t_py_generator : public t_generator { bool gen_slots_; + /** + * True if we should generate classes type hints and type checks in write methods. + */ + bool gen_type_hints_; + std::string copy_options_; /** @@ -357,11 +374,13 @@ class t_py_generator : public t_generator { protected: std::set lang_keywords_for_validation() const override { - std::string keywords[] = { "False", "None", "True", "and", "as", "assert", "break", "class", - "continue", "def", "del", "elif", "else", "except", "exec", "finally", "for", "from", - "global", "if", "import", "in", "is", "lambda", "nonlocal", "not", "or", "pass", "print", - "raise", "return", "try", "while", "with", "yield" }; - return std::set(keywords, keywords + sizeof(keywords)/sizeof(keywords[0]) ); + std::string keywords[] + = {"False", "None", "True", "and", "as", "assert", "break", + "class", "continue", "def", "del", "elif", "else", "except", + "exec", "finally", "for", "from", "global", "if", "import", + "in", "is", "lambda", "nonlocal", "not", "or", "pass", + "print", "raise", "return", "try", "while", "with", "yield"}; + return std::set(keywords, keywords + sizeof(keywords) / sizeof(keywords[0])); } }; @@ -424,10 +443,9 @@ void t_py_generator::init_generator() { f_types_ << "all_structs = []" << '\n'; - f_consts_ << - py_autogen_comment() << '\n' << - py_imports() << '\n' << - "from .ttypes import *" << '\n'; + f_consts_ << py_autogen_comment() << '\n' + << py_imports() << '\n' + << "from .ttypes import *" << '\n'; } /** @@ -448,11 +466,11 @@ string t_py_generator::render_includes() { string t_py_generator::py_autogen_comment() { string coding; if (!coding_.empty()) { - coding = "# -*- coding: " + coding_ + " -*-\n"; + coding = "# -*- coding: " + coding_ + " -*-\n"; } - return coding + std::string("#\n") + "# Autogenerated by Thrift Compiler (" + THRIFT_VERSION + ")\n" - + "#\n" + "# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n" + "#\n" - + "# options string: " + copy_options_ + "\n" + "#\n"; + return coding + std::string("#\n") + "# Autogenerated by Thrift Compiler (" + THRIFT_VERSION + + ")\n" + "#\n" + "# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n" + + "#\n" + "# options string: " + copy_options_ + "\n" + "#\n"; } /** @@ -460,13 +478,16 @@ string t_py_generator::py_autogen_comment() { */ string t_py_generator::py_imports() { ostringstream ss; + if (gen_type_hints_) { + ss << "from __future__ import annotations" << '\n' << "import typing" << '\n'; + } + ss << "from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, " "TApplicationException" << '\n' - << "from thrift.protocol.TProtocol import TProtocolException" - << '\n' - << "from thrift.TRecursive import fix_spec" - << '\n'; + << "from thrift.protocol.TProtocol import TProtocolException" << '\n' + << "from thrift.TRecursive import fix_spec" << '\n' + << "from uuid import UUID" << '\n'; if (gen_enum_) { ss << "from enum import IntEnum" << '\n'; } @@ -519,10 +540,8 @@ void t_py_generator::generate_enum(t_enum* tenum) { f_types_ << '\n' << '\n' - << "class " << tenum->get_name() - << (base_class.empty() ? "" : "(" + base_class + ")") - << ":" - << '\n'; + << "class " << tenum->get_name() << (base_class.empty() ? "" : "(" + base_class + ")") + << ":" << '\n'; indent_up(); generate_python_docstring(f_types_, tenum); @@ -597,6 +616,9 @@ string t_py_generator::render_const_value(t_type* type, t_const_value* value) { out << emit_double_as_string(value->get_double()); } break; + case t_base_type::TYPE_UUID: + out << "UUID(\"" << get_escaped_string(value) << "\")"; + break; default: throw "compiler error: no const of base type " + t_base_type::t_base_name(tbase); } @@ -627,7 +649,7 @@ string t_py_generator::render_const_value(t_type* type, t_const_value* value) { throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string(); } indent(out) << render_const_value(g_type_string, v_iter->first) << ": " - << render_const_value(field_type, v_iter->second) << "," << '\n'; + << render_const_value(field_type, v_iter->second) << "," << '\n'; } indent_down(); indent(out) << "})"; @@ -643,7 +665,7 @@ string t_py_generator::render_const_value(t_type* type, t_const_value* value) { map::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { indent(out) << render_const_value(ktype, v_iter->first) << ": " - << render_const_value(vtype, v_iter->second) << "," << '\n'; + << render_const_value(vtype, v_iter->second) << "," << '\n'; } indent_down(); indent(out) << "}"; @@ -697,7 +719,7 @@ string t_py_generator::render_const_value(t_type* type, t_const_value* value) { * definitions are grouped at the end of the file to enable co-recursive structs. */ void t_py_generator::generate_forward_declaration(t_struct* tstruct) { - generate_py_struct(tstruct, tstruct->is_xception()); + generate_py_struct(tstruct, tstruct->is_xception()); } /** @@ -724,7 +746,6 @@ void t_py_generator::generate_py_struct(t_struct* tstruct, bool is_exception) { generate_py_struct_definition(f_types_, tstruct, is_exception); } - /** * Generate the thrift_spec for a struct * For example, @@ -798,7 +819,7 @@ void t_py_generator::generate_py_struct_definition(ostream& out, } else if (gen_dynamic_) { if (is_immutable(tstruct)) { out << "(" << gen_dynbaseclass_frozen_ << ")"; - } else { + } else { out << "(" << gen_dynbaseclass_ << ")"; } } else if (gen_newstyle_) { @@ -871,9 +892,9 @@ void t_py_generator::generate_py_struct_definition(ostream& out, if (is_immutable(tstruct)) { if (gen_enum_ && type->is_enum()) { indent(out) << "super(" << tstruct->get_name() << ", self).__setattr__('" - << (*m_iter)->get_name() << "', " << (*m_iter)->get_name() - << " if hasattr(" << (*m_iter)->get_name() << ", 'value') else " - << type_name(type) << ".__members__.get(" << (*m_iter)->get_name() << "))" << '\n'; + << (*m_iter)->get_name() << "', " << (*m_iter)->get_name() << " if hasattr(" + << (*m_iter)->get_name() << ", 'value') else " << type_name(type) + << ".__members__.get(" << (*m_iter)->get_name() << "))" << '\n'; } else if (gen_newstyle_ || gen_dynamic_) { indent(out) << "super(" << tstruct->get_name() << ", self).__setattr__('" << (*m_iter)->get_name() << "', " << (*m_iter)->get_name() << ")" << '\n'; @@ -882,7 +903,9 @@ void t_py_generator::generate_py_struct_definition(ostream& out, << "'] = " << (*m_iter)->get_name() << '\n'; } } else { - indent(out) << "self." << (*m_iter)->get_name() << " = " << (*m_iter)->get_name() << '\n'; + indent(out) << "self." << (*m_iter)->get_name() + << member_hint((*m_iter)->get_type(), (*m_iter)->get_req()) << " = " + << (*m_iter)->get_name() << '\n'; } } @@ -900,11 +923,10 @@ void t_py_generator::generate_py_struct_definition(ostream& out, // trivial because we know which fields are user-provided, without slots we need to build a // way to know which fields are user-provided. if (gen_slots_ && !gen_dynamic_) { - out << indent() << "if args[0] not in self.__slots__:" << '\n'; - indent_up(); - out << indent() << "super().__setattr__(*args)" << '\n' - << indent() << "return" << '\n'; - indent_down(); + out << indent() << "if args[0] not in self.__slots__:" << '\n'; + indent_up(); + out << indent() << "super().__setattr__(*args)" << '\n' << indent() << "return" << '\n'; + indent_down(); } out << indent() << "raise TypeError(\"can't modify immutable instance\")" << '\n'; indent_down(); @@ -918,11 +940,10 @@ void t_py_generator::generate_py_struct_definition(ostream& out, // trivial because we know which fields are user-provided, without slots we need to build a // way to know which fields are user-provided. if (gen_slots_ && !gen_dynamic_) { - out << indent() << "if args[0] not in self.__slots__:" << '\n'; - indent_up(); - out << indent() << "super().__delattr__(*args)" << '\n' - << indent() << "return" << '\n'; - indent_down(); + out << indent() << "if args[0] not in self.__slots__:" << '\n'; + indent_up(); + out << indent() << "super().__delattr__(*args)" << '\n' << indent() << "return" << '\n'; + indent_down(); } out << indent() << "raise TypeError(\"can't modify immutable instance\")" << '\n'; indent_down(); @@ -956,7 +977,8 @@ void t_py_generator::generate_py_struct_definition(ostream& out, t_type* type = (*m_iter)->get_type(); if (type->is_enum()) { out << indent() << "if name == \"" << (*m_iter)->get_name() << "\":" << '\n' - << indent() << indent_str() << "super().__setattr__(name, value if hasattr(value, 'value') else " + << indent() << indent_str() + << "super().__setattr__(name, value if hasattr(value, 'value') else " << type_name(type) << ".__members__.get(value))" << '\n' << indent() << indent_str() << "return" << '\n'; } @@ -996,8 +1018,10 @@ void t_py_generator::generate_py_struct_definition(ostream& out, // Equality and inequality methods that compare by value out << indent() << "def __eq__(self, other):" << '\n'; indent_up(); - out << indent() << "return isinstance(other, self.__class__) and " - "self.__dict__ == other.__dict__" << '\n'; + out << indent() + << "return isinstance(other, self.__class__) and " + "self.__dict__ == other.__dict__" + << '\n'; indent_down(); out << '\n'; @@ -1081,7 +1105,7 @@ void t_py_generator::generate_py_struct_reader(ostream& out, t_struct* tstruct) result << "None"; } indent(out) << result.str() << '\n'; - } + } } // Loop over reading in fields @@ -1153,13 +1177,12 @@ void t_py_generator::generate_py_struct_writer(ostream& out, t_struct* tstruct) indent(out) << "def write(self, oprot):" << '\n'; indent_up(); - + indent(out) << "self.validate()" << '\n'; indent(out) << "if oprot._fast_encode is not None and self.thrift_spec is not None:" << '\n'; indent_up(); - indent(out) - << "oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))" - << '\n'; + indent(out) << "oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))" + << '\n'; indent(out) << "return" << '\n'; indent_down(); @@ -1183,8 +1206,8 @@ void t_py_generator::generate_py_struct_writer(ostream& out, t_struct* tstruct) } // Write the struct map - out << indent() << "oprot.writeFieldStop()" << '\n' << indent() << "oprot.writeStructEnd()" - << '\n'; + out << indent() << "oprot.writeFieldStop()" << '\n' + << indent() << "oprot.writeStructEnd()" << '\n'; out << '\n'; @@ -1228,8 +1251,9 @@ void t_py_generator::generate_service(t_service* tservice) { if (tservice->get_extends() != nullptr) { f_service_ << "import " - << get_real_py_module(tservice->get_extends()->get_program(), gen_twisted_, package_prefix_) << "." - << tservice->get_extends()->get_name() << '\n'; + << get_real_py_module(tservice->get_extends()->get_program(), gen_twisted_, + package_prefix_) + << "." << tservice->get_extends()->get_name() << '\n'; } f_service_ << "import logging" << '\n' @@ -1259,8 +1283,7 @@ void t_py_generator::generate_service(t_service* tservice) { generate_service_remote(tservice); // Close service file - f_service_ << "fix_spec(all_structs)" << '\n' - << "del all_structs" << '\n'; + f_service_ << "fix_spec(all_structs)" << '\n' << "del all_structs" << '\n'; f_service_.close(); } @@ -1419,8 +1442,8 @@ void t_py_generator::generate_service_client(t_service* tservice) { } } else { if (gen_twisted_) { - f_service_ << indent() << extends - << ".Client.__init__(self, transport, oprot_factory)" << '\n'; + f_service_ << indent() << extends << ".Client.__init__(self, transport, oprot_factory)" + << '\n'; } else if (gen_tornado_) { f_service_ << indent() << extends << ".Client.__init__(self, transport, iprot_factory, oprot_factory)" << '\n'; @@ -1431,9 +1454,9 @@ void t_py_generator::generate_service_client(t_service* tservice) { indent_down(); if (gen_tornado_ && extends.empty()) { - f_service_ << '\n' << - indent() << "@gen.engine" << '\n' << - indent() << "def _start_receiving(self):" << '\n'; + f_service_ << '\n' + << indent() << "@gen.engine" << '\n' + << indent() << "def _start_receiving(self):" << '\n'; indent_up(); indent(f_service_) << "while True:" << '\n'; indent_up(); @@ -1530,9 +1553,10 @@ void t_py_generator::generate_service_client(t_service* tservice) { indent(f_service_) << "d.addCallbacks(" << '\n'; indent_up(); - f_service_ << indent() << "callback=self.cb_send_" << funname << "," << '\n' << indent() - << "callbackArgs=(seqid,)," << '\n' << indent() << "errback=self.eb_send_" - << funname << "," << '\n' << indent() << "errbackArgs=(seqid,))" << '\n'; + f_service_ << indent() << "callback=self.cb_send_" << funname << "," << '\n' + << indent() << "callbackArgs=(seqid,)," << '\n' + << indent() << "errback=self.eb_send_" << funname << "," << '\n' + << indent() << "errbackArgs=(seqid,))" << '\n'; indent_down(); indent(f_service_) << "return d" << '\n'; @@ -1543,8 +1567,9 @@ void t_py_generator::generate_service_client(t_service* tservice) { indent_up(); if ((*f_iter)->is_oneway()) { // if one-way, fire the deferred & remove it from _reqs - f_service_ << indent() << "d = self._reqs.pop(seqid)" << '\n' << indent() - << "d.callback(None)" << '\n' << indent() << "return d" << '\n'; + f_service_ << indent() << "d = self._reqs.pop(seqid)" << '\n' + << indent() << "d.callback(None)" << '\n' + << indent() << "return d" << '\n'; } else { f_service_ << indent() << "return self._reqs[seqid]" << '\n'; } @@ -1554,13 +1579,14 @@ void t_py_generator::generate_service_client(t_service* tservice) { // add an errback to fail the request if the call to send_<> raised an exception indent(f_service_) << "def eb_send_" << funname << "(self, f, seqid):" << '\n'; indent_up(); - f_service_ << indent() << "d = self._reqs.pop(seqid)" << '\n' << indent() << "d.errback(f)" - << '\n' << indent() << "return d" << '\n'; + f_service_ << indent() << "d = self._reqs.pop(seqid)" << '\n' + << indent() << "d.errback(f)" << '\n' + << indent() << "return d" << '\n'; indent_down(); } f_service_ << '\n'; - indent(f_service_) << "def send_" << function_signature(*f_iter, false) << ":" << '\n'; + indent(f_service_) << "def send_" << function_signature(*f_iter, false, true) << ":" << '\n'; indent_up(); std::string argsname = (*f_iter)->get_name() + "_args"; @@ -1585,12 +1611,13 @@ void t_py_generator::generate_service_client(t_service* tservice) { // Write to the stream if (gen_twisted_ || gen_tornado_) { - f_service_ << indent() << "args.write(oprot)" << '\n' << indent() << "oprot.writeMessageEnd()" - << '\n' << indent() << "oprot.trans.flush()" << '\n'; + f_service_ << indent() << "args.write(oprot)" << '\n' + << indent() << "oprot.writeMessageEnd()" << '\n' + << indent() << "oprot.trans.flush()" << '\n'; } else { - f_service_ << indent() << "args.write(self._oprot)" << '\n' << indent() - << "self._oprot.writeMessageEnd()" << '\n' << indent() - << "self._oprot.trans.flush()" << '\n'; + f_service_ << indent() << "args.write(self._oprot)" << '\n' + << indent() << "self._oprot.writeMessageEnd()" << '\n' + << indent() << "self._oprot.trans.flush()" << '\n'; } indent_down(); @@ -1605,8 +1632,7 @@ void t_py_generator::generate_service_client(t_service* tservice) { } else { t_struct noargs(program_); t_function recv_function((*f_iter)->get_returntype(), - string("recv_") + (*f_iter)->get_name(), - &noargs); + string("recv_") + (*f_iter)->get_name(), &noargs); f_service_ << indent() << "def " << function_signature(&recv_function) << ":" << '\n'; } indent_up(); @@ -1617,23 +1643,27 @@ void t_py_generator::generate_service_client(t_service* tservice) { f_service_ << indent() << "d = self._reqs.pop(rseqid)" << '\n'; } else if (gen_tornado_) { } else { - f_service_ << indent() << "iprot = self._iprot" << '\n' << indent() - << "(fname, mtype, rseqid) = iprot.readMessageBegin()" << '\n'; + f_service_ << indent() << "iprot = self._iprot" << '\n' + << indent() << "(fname, mtype, rseqid) = iprot.readMessageBegin()" << '\n'; } f_service_ << indent() << "if mtype == TMessageType.EXCEPTION:" << '\n' << indent() << indent_str() << "x = TApplicationException()" << '\n'; if (gen_twisted_) { - f_service_ << indent() << indent_str() << "x.read(iprot)" << '\n' << indent() - << indent_str() << "iprot.readMessageEnd()" << '\n' << indent() << indent_str() << "return d.errback(x)" - << '\n' << indent() << "result = " << resultname << "()" << '\n' << indent() - << "result.read(iprot)" << '\n' << indent() << "iprot.readMessageEnd()" << '\n'; + f_service_ << indent() << indent_str() << "x.read(iprot)" << '\n' + << indent() << indent_str() << "iprot.readMessageEnd()" << '\n' + << indent() << indent_str() << "return d.errback(x)" << '\n' + << indent() << "result = " << resultname << "()" << '\n' + << indent() << "result.read(iprot)" << '\n' + << indent() << "iprot.readMessageEnd()" << '\n'; } else { - f_service_ << indent() << indent_str() << "x.read(iprot)" << '\n' << indent() - << indent_str() << "iprot.readMessageEnd()" << '\n' << indent() << indent_str() << "raise x" << '\n' - << indent() << "result = " << resultname << "()" << '\n' << indent() - << "result.read(iprot)" << '\n' << indent() << "iprot.readMessageEnd()" << '\n'; + f_service_ << indent() << indent_str() << "x.read(iprot)" << '\n' + << indent() << indent_str() << "iprot.readMessageEnd()" << '\n' + << indent() << indent_str() << "raise x" << '\n' + << indent() << "result = " << resultname << "()" << '\n' + << indent() << "result.read(iprot)" << '\n' + << indent() << "iprot.readMessageEnd()" << '\n'; } // Careful, only return _result if not a void function @@ -1708,28 +1738,31 @@ void t_py_generator::generate_service_remote(t_service* tservice) { ofstream_with_content_based_conditional_update f_remote; f_remote.open(f_remote_name.c_str()); - f_remote << - "#!/usr/bin/env python" << '\n' << - py_autogen_comment() << '\n' << - "import sys" << '\n' << - "import pprint" << '\n' << - "if sys.version_info[0] > 2:" << '\n' << - indent_str() << "from urllib.parse import urlparse" << '\n' << - "else:" << '\n' << - indent_str() << "from urlparse import urlparse" << '\n' << - "from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient" << '\n' << - "from thrift.protocol.TBinaryProtocol import TBinaryProtocol" << '\n' << '\n'; - - f_remote << - "from " << module_ << " import " << service_name_ << '\n' << - "from " << module_ << ".ttypes import *" << '\n' << '\n'; - - f_remote << - "if len(sys.argv) <= 1 or sys.argv[1] == '--help':" << '\n' << - indent_str() << "print('')" << '\n' << - indent_str() << "print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')" << '\n' << - indent_str() << "print('')" << '\n' << - indent_str() << "print('Functions:')" << '\n'; + f_remote << "#!/usr/bin/env python" << '\n' + << py_autogen_comment() << '\n' + << "import sys" << '\n' + << "import pprint" << '\n' + << "if sys.version_info[0] > 2:" << '\n' + << indent_str() << "from urllib.parse import urlparse" << '\n' + << "else:" << '\n' + << indent_str() << "from urlparse import urlparse" << '\n' + << "from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient" << '\n' + << "from thrift.protocol.TBinaryProtocol import TBinaryProtocol" << '\n' + << '\n'; + + f_remote << "from " << module_ << " import " << service_name_ << '\n' + << "from " << module_ << ".ttypes import *" << '\n' + << '\n'; + + f_remote << "if len(sys.argv) <= 1 or sys.argv[1] == '--help':" << '\n' + << indent_str() << "print('')" << '\n' + << indent_str() + << "print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] " + "[-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function " + "[arg1 [arg2...]]')" + << '\n' + << indent_str() << "print('')" << '\n' + << indent_str() << "print('Functions:')" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { f_remote << indent_str() << "print(' " << (*f_iter)->get_returntype()->get_name() << " " << (*f_iter)->get_name() << "("; @@ -1814,15 +1847,18 @@ void t_py_generator::generate_service_remote(t_service* tservice) { << indent_str() << "transport = THttpClient.THttpClient(host, port, uri)" << '\n' << "else:" << '\n' << indent_str() << "if ssl:" << '\n' - << indent_str() << indent_str() << "socket = TSSLSocket.TSSLSocket(host, port, " + << indent_str() << indent_str() + << "socket = TSSLSocket.TSSLSocket(host, port, " "validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile)" << '\n' << indent_str() << "else:" << '\n' << indent_str() << indent_str() << "socket = TSocket.TSocket(host, port)" << '\n' << indent_str() << "if framed:" << '\n' - << indent_str() << indent_str() << "transport = TTransport.TFramedTransport(socket)" << '\n' + << indent_str() << indent_str() << "transport = TTransport.TFramedTransport(socket)" + << '\n' << indent_str() << "else:" << '\n' - << indent_str() << indent_str() << "transport = TTransport.TBufferedTransport(socket)" << '\n' + << indent_str() << indent_str() << "transport = TTransport.TBufferedTransport(socket)" + << '\n' << "protocol = TBinaryProtocol(transport)" << '\n' << "client = " << service_name_ << ".Client(protocol)" << '\n' << "transport.open()" << '\n' @@ -1845,8 +1881,8 @@ void t_py_generator::generate_service_remote(t_service* tservice) { f_remote << "if cmd == '" << (*f_iter)->get_name() << "':" << '\n'; indent_up(); f_remote << indent() << "if len(args) != " << num_args << ":" << '\n' - << indent() << indent_str() << "print('" << (*f_iter)->get_name() << " requires " << num_args - << " args')" << '\n' + << indent() << indent_str() << "print('" << (*f_iter)->get_name() << " requires " + << num_args << " args')" << '\n' << indent() << indent_str() << "sys.exit(1)" << '\n' << indent() << "pp.pprint(client." << (*f_iter)->get_name() << "("; indent_down(); @@ -1882,12 +1918,11 @@ void t_py_generator::generate_service_remote(t_service* tservice) { #ifndef _MSC_VER // Make file executable, love that bitwise OR action - chmod(f_remote_name.c_str(), - S_IRUSR | S_IWUSR | S_IXUSR + chmod(f_remote_name.c_str(), S_IRUSR | S_IWUSR | S_IXUSR #ifndef _WIN32 - | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH + | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH #endif - ); + ); #endif // _MSC_VER } @@ -1948,7 +1983,7 @@ void t_py_generator::generate_service_server(t_service* tservice) { f_service_ << indent() << "def on_message_begin(self, func):" << '\n'; indent_up(); - f_service_ << indent() << "self._on_message_begin = func" << '\n'; + f_service_ << indent() << "self._on_message_begin = func" << '\n'; indent_down(); f_service_ << '\n'; @@ -1959,7 +1994,7 @@ void t_py_generator::generate_service_server(t_service* tservice) { f_service_ << indent() << "(name, type, seqid) = iprot.readMessageBegin()" << '\n'; f_service_ << indent() << "if self._on_message_begin:" << '\n'; indent_up(); - f_service_ << indent() << "self._on_message_begin(name, type, seqid)" << '\n'; + f_service_ << indent() << "self._on_message_begin(name, type, seqid)" << '\n'; indent_down(); // TODO(mcslee): validate message @@ -2018,8 +2053,9 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* (void)tservice; // Open function if (gen_tornado_) { - f_service_ << indent() << "@gen.coroutine" << '\n' << indent() << "def process_" - << tfunction->get_name() << "(self, seqid, iprot, oprot):" << '\n'; + f_service_ << indent() << "@gen.coroutine" << '\n' + << indent() << "def process_" << tfunction->get_name() + << "(self, seqid, iprot, oprot):" << '\n'; } else { f_service_ << indent() << "def process_" << tfunction->get_name() << "(self, seqid, iprot, oprot):" << '\n'; @@ -2030,8 +2066,9 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* string argsname = tfunction->get_name() + "_args"; string resultname = tfunction->get_name() + "_result"; - f_service_ << indent() << "args = " << argsname << "()" << '\n' << indent() << "args.read(iprot)" - << '\n' << indent() << "iprot.readMessageEnd()" << '\n'; + f_service_ << indent() << "args = " << argsname << "()" << '\n' + << indent() << "args.read(iprot)" << '\n' + << indent() << "iprot.readMessageEnd()" << '\n'; t_struct* xs = tfunction->get_xceptions(); const std::vector& xceptions = xs->get_members(); @@ -2136,8 +2173,8 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* << indent() << "oprot.trans.flush()" << '\n'; } else { f_service_ << indent() << "except Exception:" << '\n' - << indent() << indent_str() - << "logging.exception('Exception in oneway handler')" << '\n'; + << indent() << indent_str() << "logging.exception('Exception in oneway handler')" + << '\n'; } indent_down(); @@ -2195,8 +2232,8 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* << '\n'; } else { f_service_ << indent() << "except Exception:" << '\n' - << indent() << indent_str() - << "logging.exception('Exception in oneway handler')" << '\n'; + << indent() << indent_str() << "logging.exception('Exception in oneway handler')" + << '\n'; } if (!tfunction->is_oneway()) { @@ -2241,8 +2278,7 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* } indent_down(); - f_service_ << indent() - << "except TTransport.TTransportException:" << '\n' + f_service_ << indent() << "except TTransport.TTransportException:" << '\n' << indent() << indent_str() << "raise" << '\n'; if (!tfunction->is_oneway()) { @@ -2276,7 +2312,8 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* << indent() << "oprot.trans.flush()" << '\n'; } else { f_service_ << indent() << "except Exception:" << '\n' - << indent() << indent_str() << "logging.exception('Exception in oneway handler')" << '\n'; + << indent() << indent_str() << "logging.exception('Exception in oneway handler')" + << '\n'; } // Close function @@ -2287,9 +2324,7 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* /** * Deserializes a field of any type. */ -void t_py_generator::generate_deserialize_field(ostream& out, - t_field* tfield, - string prefix) { +void t_py_generator::generate_deserialize_field(ostream& out, t_field* tfield, string prefix) { t_type* type = get_true_type(tfield->get_type()); if (type->is_void()) { @@ -2313,10 +2348,11 @@ void t_py_generator::generate_deserialize_field(ostream& out, case t_base_type::TYPE_STRING: if (type->is_binary()) { out << "readBinary()"; - } else if(!gen_utf8strings_) { + } else if (!gen_utf8strings_) { out << "readString()"; } else { - out << "readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()"; + out << "readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else " + "iprot.readString()"; } break; case t_base_type::TYPE_BOOL: @@ -2337,6 +2373,9 @@ void t_py_generator::generate_deserialize_field(ostream& out, case t_base_type::TYPE_DOUBLE: out << "readDouble()"; break; + case t_base_type::TYPE_UUID: + out << "readUuid()"; + break; default: throw "compiler error: no Python name for base type " + t_base_type::t_base_name(tbase); } @@ -2350,8 +2389,7 @@ void t_py_generator::generate_deserialize_field(ostream& out, } out << '\n'; } else { - printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", - tfield->get_name().c_str(), + printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", tfield->get_name().c_str(), type->get_name().c_str()); } } @@ -2385,20 +2423,20 @@ void t_py_generator::generate_deserialize_container(ostream& out, t_type* ttype, // Declare variables, read header if (ttype->is_map()) { - out << indent() << prefix << " = {}" << '\n' << indent() << "(" << ktype << ", " << vtype - << ", " << size << ") = iprot.readMapBegin()" << '\n'; + out << indent() << prefix << " = {}" << '\n' + << indent() << "(" << ktype << ", " << vtype << ", " << size << ") = iprot.readMapBegin()" + << '\n'; } else if (ttype->is_set()) { - out << indent() << prefix << " = set()" << '\n' << indent() << "(" << etype << ", " << size - << ") = iprot.readSetBegin()" << '\n'; + out << indent() << prefix << " = set()" << '\n' + << indent() << "(" << etype << ", " << size << ") = iprot.readSetBegin()" << '\n'; } else if (ttype->is_list()) { - out << indent() << prefix << " = []" << '\n' << indent() << "(" << etype << ", " << size - << ") = iprot.readListBegin()" << '\n'; + out << indent() << prefix << " = []" << '\n' + << indent() << "(" << etype << ", " << size << ") = iprot.readListBegin()" << '\n'; } // For loop iterates over elements string i = tmp("_i"); - indent(out) << - "for " << i << " in range(" << size << "):" << '\n'; + indent(out) << "for " << i << " in range(" << size << "):" << '\n'; indent_up(); @@ -2461,9 +2499,7 @@ void t_py_generator::generate_deserialize_set_element(ostream& out, t_set* tset, /** * Write a list element */ -void t_py_generator::generate_deserialize_list_element(ostream& out, - t_list* tlist, - string prefix) { +void t_py_generator::generate_deserialize_list_element(ostream& out, t_list* tlist, string prefix) { string elem = tmp("_elem"); t_field felem(tlist->get_elem_type(), elem); @@ -2508,7 +2544,8 @@ void t_py_generator::generate_serialize_field(ostream& out, t_field* tfield, str } else if (!gen_utf8strings_) { out << "writeString(" << name << ")"; } else { - out << "writeString(" << name << ".encode('utf-8') if sys.version_info[0] == 2 else " << name << ")"; + out << "writeString(" << name << ".encode('utf-8') if sys.version_info[0] == 2 else " + << name << ")"; } break; case t_base_type::TYPE_BOOL: @@ -2529,11 +2566,14 @@ void t_py_generator::generate_serialize_field(ostream& out, t_field* tfield, str case t_base_type::TYPE_DOUBLE: out << "writeDouble(" << name << ")"; break; + case t_base_type::TYPE_UUID: + out << "writeUuid(" << name << ")"; + break; default: throw "compiler error: no Python name for base type " + t_base_type::t_base_name(tbase); } } else if (type->is_enum()) { - if (gen_enum_){ + if (gen_enum_) { out << "writeI32(" << name << ".value)"; } else { out << "writeI32(" << name << ")"; @@ -2541,10 +2581,8 @@ void t_py_generator::generate_serialize_field(ostream& out, t_field* tfield, str } out << '\n'; } else { - printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n", - prefix.c_str(), - tfield->get_name().c_str(), - type->get_name().c_str()); + printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n", prefix.c_str(), + tfield->get_name().c_str(), type->get_name().c_str()); } } @@ -2702,12 +2740,16 @@ void t_py_generator::generate_python_docstring(ostream& out, t_doc* tdoc) { */ string t_py_generator::declare_argument(t_field* tfield) { std::ostringstream result; - result << tfield->get_name() << "="; + t_field::e_req req = tfield->get_req(); + result << tfield->get_name() << member_hint(tfield->get_type(), req); + + result << " = "; if (tfield->get_value() != nullptr) { result << render_field_default_value(tfield); } else { result << "None"; } + return result.str(); } @@ -2731,7 +2773,7 @@ string t_py_generator::render_field_default_value(t_field* tfield) { * @param tfunction Function definition * @return String of rendered function definition */ -string t_py_generator::function_signature(t_function* tfunction, bool interface) { +string t_py_generator::function_signature(t_function* tfunction, bool interface, bool send_part) { vector pre; vector post; string signature = tfunction->get_name() + "("; @@ -2741,6 +2783,10 @@ string t_py_generator::function_signature(t_function* tfunction, bool interface) } signature += argument_list(tfunction->get_arglist(), &pre, &post) + ")"; + if (!send_part) { + signature += func_hint(tfunction->get_returntype()); + } + return signature; } @@ -2771,6 +2817,7 @@ string t_py_generator::argument_list(t_struct* tstruct, vector* pre, vec result += ", "; } result += (*f_iter)->get_name(); + result += arg_hint((*f_iter)->get_type()); } if (post) { for (s_iter = post->begin(); s_iter != post->end(); ++s_iter) { @@ -2795,13 +2842,84 @@ string t_py_generator::type_name(t_type* ttype) { return get_real_py_module(program, gen_twisted_, package_prefix_) + "." + ttype->get_name(); } if (program != nullptr && program != program_) { - return get_real_py_module(program, gen_twisted_, package_prefix_) + ".ttypes." + ttype->get_name(); + return get_real_py_module(program, gen_twisted_, package_prefix_) + ".ttypes." + + ttype->get_name(); } return ttype->get_name(); } +string t_py_generator::arg_hint(t_type* type) { + if (gen_type_hints_) { + return ": " + type_to_py_type(type); + } + + return ""; +} + +string t_py_generator::member_hint(t_type* type, t_field::e_req req) { + if (gen_type_hints_) { + if (req != t_field::T_REQUIRED) { + return ": typing.Optional[" + type_to_py_type(type) + "]"; + } else { + return ": " + type_to_py_type(type); + } + } + + return ""; +} + +string t_py_generator::func_hint(t_type* type) { + if (gen_type_hints_) { + return " -> " + type_to_py_type(type); + } + + return ""; +} + /** - * Converts the parse type to a Python tyoe + * Converts the parse type to a Python type + */ +string t_py_generator::type_to_py_type(t_type* type) { + type = get_true_type(type); + + if (type->is_binary()) { + return "bytes"; + } + if (type->is_base_type()) { + t_base_type::t_base tbase = ((t_base_type*)type)->get_base(); + switch (tbase) { + case t_base_type::TYPE_VOID: + return "None"; + case t_base_type::TYPE_STRING: + return "str"; + case t_base_type::TYPE_BOOL: + return "bool"; + case t_base_type::TYPE_I8: + case t_base_type::TYPE_I16: + case t_base_type::TYPE_I32: + case t_base_type::TYPE_I64: + return "int"; + case t_base_type::TYPE_DOUBLE: + return "float"; + case t_base_type::TYPE_UUID: + return "UUID"; + } + } else if (type->is_enum() || type->is_struct() || type->is_xception()) { + return type_name(type); + } else if (type->is_map()) { + return "dict[" + type_to_py_type(((t_map*)type)->get_key_type()) + ", " + + type_to_py_type(((t_map*)type)->get_val_type()) + "]"; + } else if (type->is_set()) { + return "set[" + type_to_py_type(((t_set*)type)->get_elem_type()) + "]"; + } else if (type->is_list()) { + return "list[" + type_to_py_type(((t_list*)type)->get_elem_type()) + "]"; + } + + throw "INVALID TYPE IN type_to_py_type: " + type->get_name(); +} + +/** + * Converts the parse type to a Python type enum */ string t_py_generator::type_to_enum(t_type* type) { type = get_true_type(type); @@ -2825,6 +2943,8 @@ string t_py_generator::type_to_enum(t_type* type) { return "TType.I64"; case t_base_type::TYPE_DOUBLE: return "TType.DOUBLE"; + case t_base_type::TYPE_UUID: + return "TType.UUID"; default: throw "compiler error: unhandled type"; } @@ -2850,12 +2970,12 @@ string t_py_generator::type_to_spec_args(t_type* ttype) { } if (ttype->is_binary()) { - return "'BINARY'"; + return "'BINARY'"; } else if (gen_utf8strings_ && ttype->is_base_type() && reinterpret_cast(ttype)->is_string()) { return "'UTF8'"; } else if (ttype->is_base_type() || ttype->is_enum()) { - return "None"; + return "None"; } else if (ttype->is_struct() || ttype->is_xception()) { return "[" + type_name(ttype) + ", None]"; } else if (ttype->is_map()) { @@ -2883,25 +3003,28 @@ std::string t_py_generator::display_name() const { return "Python"; } - THRIFT_REGISTER_GENERATOR( py, "Python", " zope.interface: Generate code for use with zope.interface.\n" " twisted: Generate Twisted-friendly RPC services.\n" " tornado: Generate code for use with Tornado.\n" - " no_utf8strings: Do not Encode/decode strings using utf8 in the generated code. Basically no effect for Python 3.\n" + " no_utf8strings: Do not Encode/decode strings using utf8 in the generated code. Basically " + "no effect for Python 3.\n" " coding=CODING: Add file encoding declare in generated file.\n" " slots: Generate code using slots for instance members.\n" " dynamic: Generate dynamic code, less code generated but slower.\n" " dynbase=CLS Derive generated classes from class CLS instead of TBase.\n" - " dynfrozen=CLS Derive generated immutable classes from class CLS instead of TFrozenBase.\n" + " dynfrozen=CLS Derive generated immutable classes from class CLS instead of " + "TFrozenBase.\n" " dynexc=CLS Derive generated exceptions from CLS instead of TExceptionBase.\n" - " dynfrozenexc=CLS Derive generated immutable exceptions from CLS instead of TFrozenExceptionBase.\n" + " dynfrozenexc=CLS Derive generated immutable exceptions from CLS instead of " + "TFrozenExceptionBase.\n" " dynimport='from foo.bar import CLS'\n" " Add an import line to generated code to find the dynbase class.\n" " package_prefix='top.package.'\n" " Package prefix for generated files.\n" " old_style: Deprecated. Generate old-style classes.\n" - " enum: Generates Python's IntEnum, connects thrift to python enums. Python 3.4 and higher.\n" -) + " enum: Generates Python's IntEnum, connects thrift to python enums. Python 3.4 " + "and higher.\n" + " type_hints: Generate type hints in write method, including IntEnum generation.\n") From 12b0116a17b674da9d23a729d4d0a5ab3bc74c35 Mon Sep 17 00:00:00 2001 From: arkuhn Date: Fri, 23 Feb 2024 20:18:55 -0500 Subject: [PATCH 109/430] Update tests for type_hints --- test/py/Makefile.am | 12 +++++++++++- test/py/RunClientServer.py | 2 +- test/py/generate.cmake | 4 ++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/test/py/Makefile.am b/test/py/Makefile.am index e02607758bd..b4be95352da 100644 --- a/test/py/Makefile.am +++ b/test/py/Makefile.am @@ -52,7 +52,11 @@ thrift_gen = \ gen-py-enum/ThriftTest/__init__.py \ gen-py-enum/DebugProtoTest/__init__.py \ gen-py-enum/DoubleConstantsTest/__init__.py \ - gen-py-enum/Recursive/__init__.py + gen-py-enum/Recursive/__init__.py \ + gen-py-type_hints/ThriftTest/__init__.py \ + gen-py-type_hints/DebugProtoTest/__init__.py \ + gen-py-type_hints/DoubleConstantsTest/__init__.py \ + gen-py-type_hints/Recursive/__init__.py distdir: $(MAKE) $(AM_MAKEFLAGS) distdir-am @@ -119,6 +123,12 @@ gen-py-enum/%/__init__.py: ../%.thrift $(THRIFT) && $(THRIFT) --gen py:enum -out gen-py-enum ../v0.16/$(notdir $<) \ || $(THRIFT) --gen py:enum -out gen-py-enum $< +gen-py-type_hints/%/__init__.py: ../%.thrift $(THRIFT) + test -d gen-py-type_hints || $(MKDIR_P) gen-py-type_hints + test ../v0.16/$(notdir $<) \ + && $(THRIFT) --gen py:type_hints -out gen-py-type_hints ../v0.16/$(notdir $<) \ + || $(THRIFT) --gen py:type_hints -out gen-py-type_hints $< + clean-local: $(RM) -r build find . -type f \( -iname "*.pyc" \) | xargs rm -f diff --git a/test/py/RunClientServer.py b/test/py/RunClientServer.py index cb0decf0e57..e6ad3a340a2 100755 --- a/test/py/RunClientServer.py +++ b/test/py/RunClientServer.py @@ -259,7 +259,7 @@ def main(): parser = OptionParser() parser.add_option('--all', action="store_true", dest='all') parser.add_option('--genpydirs', type='string', dest='genpydirs', - default='default,slots,oldstyle,no_utf8strings,dynamic,dynamicslots,enum', + default='default,slots,oldstyle,no_utf8strings,dynamic,dynamicslots,enum,type_hints', help='directory extensions for generated code, used as suffixes for \"gen-py-*\" added sys.path for individual tests') parser.add_option("--port", type="int", dest="port", default=9090, help="port number for server to listen on") diff --git a/test/py/generate.cmake b/test/py/generate.cmake index eb6f1110624..a439c440d23 100644 --- a/test/py/generate.cmake +++ b/test/py/generate.cmake @@ -14,6 +14,7 @@ generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:no_utf8strings gen-py generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:dynamic gen-py-dynamic) generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:dynamic,slots gen-py-dynamicslots) generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:enum gen-py-enum) +generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:type_hints gen-py-type_hints) generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py gen-py-default) generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:slots gen-py-slots) @@ -22,6 +23,7 @@ generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:no_utf8strings ge generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:dynamic gen-py-dynamic) generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:dynamic,slots gen-py-dynamicslots) generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:enum gen-py-enum) +generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:type_hints gen-py-type_hints) generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py gen-py-default) generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:slots gen-py-slots) @@ -30,6 +32,7 @@ generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:no_utf8strings gen generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:dynamic gen-py-dynamic) generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:dynamic,slots gen-py-dynamicslots) generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:enum gen-py-enum) +generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:type_hints gen-py-type_hints) generate(${MY_PROJECT_DIR}/test/Recursive.thrift py gen-py-default) generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:slots gen-py-slots) @@ -38,3 +41,4 @@ generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:no_utf8strings gen-py-no_utf generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:dynamic gen-py-dynamic) generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:dynamic,slots gen-py-dynamicslots) generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:enum gen-py-enum) +generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:type_hints gen-py-type_hints) From d850f8680845c8d837a58aeffb1f73df169af397 Mon Sep 17 00:00:00 2001 From: arkuhn Date: Sun, 26 May 2024 01:21:15 -0400 Subject: [PATCH 110/430] Review comments - Update flag description to be more precise - No implict enum generation (gen enum flag required) - Use latest thrift test IDL for uuid coverage - rebase on latest main --- .../cpp/src/thrift/generate/t_py_generator.cc | 437 +++++++++--------- test/py/Makefile.am | 6 +- test/py/generate.cmake | 8 +- 3 files changed, 220 insertions(+), 231 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_py_generator.cc b/compiler/cpp/src/thrift/generate/t_py_generator.cc index ddca9fe3931..90bfd05d8ec 100644 --- a/compiler/cpp/src/thrift/generate/t_py_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_py_generator.cc @@ -17,21 +17,21 @@ * under the License. */ +#include #include #include #include #include -#include #include -#include "thrift/generate/t_generator.h" -#include "thrift/platform.h" -#include "thrift/version.h" -#include -#include #include #include #include +#include +#include +#include "thrift/platform.h" +#include "thrift/version.h" +#include "thrift/generate/t_generator.h" using std::map; using std::ostream; @@ -49,7 +49,7 @@ class t_py_generator : public t_generator { t_py_generator(t_program* program, const std::map& parsed_options, const std::string& option_string) - : t_generator(program) { + : t_generator (program) { update_keywords_for_validation(); std::map::const_iterator iter; @@ -71,70 +71,66 @@ class t_py_generator : public t_generator { gen_dynbaseclass_frozen_ = ""; import_dynbase_ = ""; package_prefix_ = ""; - for (iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) { - if (iter->first.compare("enum") == 0) { + for( iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) { + if( iter->first.compare("enum") == 0) { gen_enum_ = true; - } else if (iter->first.compare("new_style") == 0) { - pwarning( - 0, - "new_style is enabled by default, so the option will be removed in the near future.\n"); - } else if (iter->first.compare("old_style") == 0) { + } else if( iter->first.compare("new_style") == 0) { + pwarning(0, "new_style is enabled by default, so the option will be removed in the near future.\n"); + } else if( iter->first.compare("old_style") == 0) { gen_newstyle_ = false; pwarning(0, "old_style is deprecated and may be removed in the future.\n"); - } else if (iter->first.compare("utf8strings") == 0) { - pwarning(0, - "utf8strings is enabled by default, so the option will be removed in the near " - "future.\n"); - } else if (iter->first.compare("no_utf8strings") == 0) { + } else if( iter->first.compare("utf8strings") == 0) { + pwarning(0, "utf8strings is enabled by default, so the option will be removed in the near future.\n"); + } else if( iter->first.compare("no_utf8strings") == 0) { gen_utf8strings_ = false; - } else if (iter->first.compare("slots") == 0) { + } else if( iter->first.compare("slots") == 0) { gen_slots_ = true; - } else if (iter->first.compare("package_prefix") == 0) { + } else if( iter->first.compare("package_prefix") == 0) { package_prefix_ = iter->second; - } else if (iter->first.compare("dynamic") == 0) { + } else if( iter->first.compare("dynamic") == 0) { gen_dynamic_ = true; gen_newstyle_ = false; // dynamic is newstyle - if (gen_dynbaseclass_.empty()) { + if( gen_dynbaseclass_.empty()) { gen_dynbaseclass_ = "TBase"; } - if (gen_dynbaseclass_frozen_.empty()) { + if( gen_dynbaseclass_frozen_.empty()) { gen_dynbaseclass_frozen_ = "TFrozenBase"; } - if (gen_dynbaseclass_exc_.empty()) { + if( gen_dynbaseclass_exc_.empty()) { gen_dynbaseclass_exc_ = "TExceptionBase"; } - if (gen_dynbaseclass_frozen_exc_.empty()) { + if( gen_dynbaseclass_frozen_exc_.empty()) { gen_dynbaseclass_frozen_exc_ = "TFrozenExceptionBase"; } - if (import_dynbase_.empty()) { - import_dynbase_ - = "from thrift.protocol.TBase import TBase, TFrozenBase, TExceptionBase, " - "TFrozenExceptionBase, TTransport\n"; + if( import_dynbase_.empty()) { + import_dynbase_ = "from thrift.protocol.TBase import TBase, TFrozenBase, TExceptionBase, TFrozenExceptionBase, TTransport\n"; } - } else if (iter->first.compare("dynbase") == 0) { + } else if( iter->first.compare("dynbase") == 0) { gen_dynbase_ = true; gen_dynbaseclass_ = (iter->second); - } else if (iter->first.compare("dynfrozen") == 0) { + } else if( iter->first.compare("dynfrozen") == 0) { gen_dynbaseclass_frozen_ = (iter->second); - } else if (iter->first.compare("dynexc") == 0) { + } else if( iter->first.compare("dynexc") == 0) { gen_dynbaseclass_exc_ = (iter->second); - } else if (iter->first.compare("dynfrozenexc") == 0) { + } else if( iter->first.compare("dynfrozenexc") == 0) { gen_dynbaseclass_frozen_exc_ = (iter->second); - } else if (iter->first.compare("dynimport") == 0) { + } else if( iter->first.compare("dynimport") == 0) { gen_dynbase_ = true; import_dynbase_ = (iter->second); - } else if (iter->first.compare("zope.interface") == 0) { + } else if( iter->first.compare("zope.interface") == 0) { gen_zope_interface_ = true; - } else if (iter->first.compare("twisted") == 0) { + } else if( iter->first.compare("twisted") == 0) { gen_twisted_ = true; gen_zope_interface_ = true; - } else if (iter->first.compare("tornado") == 0) { + } else if( iter->first.compare("tornado") == 0) { gen_tornado_ = true; - } else if (iter->first.compare("coding") == 0) { + } else if( iter->first.compare("coding") == 0) { coding_ = iter->second; } else if (iter->first.compare("type_hints") == 0) { + if (!gen_enum_) { + throw "the type_hints py option requires the enum py option"; + } gen_type_hints_ = true; - gen_enum_ = true; } else { throw "unknown option py:" + iter->first; } @@ -155,7 +151,9 @@ class t_py_generator : public t_generator { } } - std::string indent_str() const override { return " "; } + std::string indent_str() const override { + return " "; + } /** * Init and close methods @@ -208,7 +206,9 @@ class t_py_generator : public t_generator { * Serialization constructs */ - void generate_deserialize_field(std::ostream& out, t_field* tfield, std::string prefix = ""); + void generate_deserialize_field(std::ostream& out, + t_field* tfield, + std::string prefix = ""); void generate_deserialize_struct(std::ostream& out, t_struct* tstruct, std::string prefix = ""); @@ -218,7 +218,9 @@ class t_py_generator : public t_generator { void generate_deserialize_map_element(std::ostream& out, t_map* tmap, std::string prefix = ""); - void generate_deserialize_list_element(std::ostream& out, t_list* tlist, std::string prefix = ""); + void generate_deserialize_list_element(std::ostream& out, + t_list* tlist, + std::string prefix = ""); void generate_serialize_field(std::ostream& out, t_field* tfield, std::string prefix = ""); @@ -256,9 +258,7 @@ class t_py_generator : public t_generator { std::string declare_argument(t_field* tfield); std::string render_field_default_value(t_field* tfield); std::string type_name(t_type* ttype); - std::string function_signature(t_function* tfunction, - bool interface = false, - bool send_part = false); + std::string function_signature(t_function* tfunction, bool interface = false, bool send_part = false); std::string argument_list(t_struct* tstruct, std::vector* pre = nullptr, std::vector* post = nullptr); @@ -273,9 +273,7 @@ class t_py_generator : public t_generator { return sub_namespace == "twisted"; } - static std::string get_real_py_module(const t_program* program, - bool gen_twisted, - std::string package_dir = "") { + static std::string get_real_py_module(const t_program* program, bool gen_twisted, std::string package_dir="") { if (gen_twisted) { std::string twisted_module = program->get_namespace("py.twisted"); if (!twisted_module.empty()) { @@ -291,8 +289,7 @@ class t_py_generator : public t_generator { } static bool is_immutable(t_type* ttype) { - std::map>::iterator it - = ttype->annotations_.find("python.immutable"); + std::map>::iterator it = ttype->annotations_.find("python.immutable"); if (it == ttype->annotations_.end()) { // Exceptions are immutable by default. @@ -305,6 +302,7 @@ class t_py_generator : public t_generator { } private: + /** * True if we should generate new-style classes. */ @@ -312,8 +310,8 @@ class t_py_generator : public t_generator { bool gen_enum_; /** - * True if we should generate dynamic style classes. - */ + * True if we should generate dynamic style classes. + */ bool gen_dynamic_; bool gen_dynbase_; @@ -327,8 +325,8 @@ class t_py_generator : public t_generator { bool gen_slots_; /** - * True if we should generate classes type hints and type checks in write methods. - */ + * True if we should generate classes type hints and type checks in write methods. + */ bool gen_type_hints_; std::string copy_options_; @@ -374,13 +372,11 @@ class t_py_generator : public t_generator { protected: std::set lang_keywords_for_validation() const override { - std::string keywords[] - = {"False", "None", "True", "and", "as", "assert", "break", - "class", "continue", "def", "del", "elif", "else", "except", - "exec", "finally", "for", "from", "global", "if", "import", - "in", "is", "lambda", "nonlocal", "not", "or", "pass", - "print", "raise", "return", "try", "while", "with", "yield"}; - return std::set(keywords, keywords + sizeof(keywords) / sizeof(keywords[0])); + std::string keywords[] = { "False", "None", "True", "and", "as", "assert", "break", "class", + "continue", "def", "del", "elif", "else", "except", "exec", "finally", "for", "from", + "global", "if", "import", "in", "is", "lambda", "nonlocal", "not", "or", "pass", "print", + "raise", "return", "try", "while", "with", "yield" }; + return std::set(keywords, keywords + sizeof(keywords)/sizeof(keywords[0]) ); } }; @@ -443,9 +439,10 @@ void t_py_generator::init_generator() { f_types_ << "all_structs = []" << '\n'; - f_consts_ << py_autogen_comment() << '\n' - << py_imports() << '\n' - << "from .ttypes import *" << '\n'; + f_consts_ << + py_autogen_comment() << '\n' << + py_imports() << '\n' << + "from .ttypes import *" << '\n'; } /** @@ -466,11 +463,11 @@ string t_py_generator::render_includes() { string t_py_generator::py_autogen_comment() { string coding; if (!coding_.empty()) { - coding = "# -*- coding: " + coding_ + " -*-\n"; + coding = "# -*- coding: " + coding_ + " -*-\n"; } - return coding + std::string("#\n") + "# Autogenerated by Thrift Compiler (" + THRIFT_VERSION - + ")\n" + "#\n" + "# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n" - + "#\n" + "# options string: " + copy_options_ + "\n" + "#\n"; + return coding + std::string("#\n") + "# Autogenerated by Thrift Compiler (" + THRIFT_VERSION + ")\n" + + "#\n" + "# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n" + "#\n" + + "# options string: " + copy_options_ + "\n" + "#\n"; } /** @@ -485,9 +482,12 @@ string t_py_generator::py_imports() { ss << "from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, " "TApplicationException" << '\n' - << "from thrift.protocol.TProtocol import TProtocolException" << '\n' - << "from thrift.TRecursive import fix_spec" << '\n' - << "from uuid import UUID" << '\n'; + << "from thrift.protocol.TProtocol import TProtocolException" + << '\n' + << "from thrift.TRecursive import fix_spec" + << '\n' + << "from uuid import UUID" + << '\n'; if (gen_enum_) { ss << "from enum import IntEnum" << '\n'; } @@ -540,8 +540,10 @@ void t_py_generator::generate_enum(t_enum* tenum) { f_types_ << '\n' << '\n' - << "class " << tenum->get_name() << (base_class.empty() ? "" : "(" + base_class + ")") - << ":" << '\n'; + << "class " << tenum->get_name() + << (base_class.empty() ? "" : "(" + base_class + ")") + << ":" + << '\n'; indent_up(); generate_python_docstring(f_types_, tenum); @@ -649,7 +651,7 @@ string t_py_generator::render_const_value(t_type* type, t_const_value* value) { throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string(); } indent(out) << render_const_value(g_type_string, v_iter->first) << ": " - << render_const_value(field_type, v_iter->second) << "," << '\n'; + << render_const_value(field_type, v_iter->second) << "," << '\n'; } indent_down(); indent(out) << "})"; @@ -665,7 +667,7 @@ string t_py_generator::render_const_value(t_type* type, t_const_value* value) { map::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { indent(out) << render_const_value(ktype, v_iter->first) << ": " - << render_const_value(vtype, v_iter->second) << "," << '\n'; + << render_const_value(vtype, v_iter->second) << "," << '\n'; } indent_down(); indent(out) << "}"; @@ -719,7 +721,7 @@ string t_py_generator::render_const_value(t_type* type, t_const_value* value) { * definitions are grouped at the end of the file to enable co-recursive structs. */ void t_py_generator::generate_forward_declaration(t_struct* tstruct) { - generate_py_struct(tstruct, tstruct->is_xception()); + generate_py_struct(tstruct, tstruct->is_xception()); } /** @@ -746,6 +748,7 @@ void t_py_generator::generate_py_struct(t_struct* tstruct, bool is_exception) { generate_py_struct_definition(f_types_, tstruct, is_exception); } + /** * Generate the thrift_spec for a struct * For example, @@ -819,7 +822,7 @@ void t_py_generator::generate_py_struct_definition(ostream& out, } else if (gen_dynamic_) { if (is_immutable(tstruct)) { out << "(" << gen_dynbaseclass_frozen_ << ")"; - } else { + } else { out << "(" << gen_dynbaseclass_ << ")"; } } else if (gen_newstyle_) { @@ -892,9 +895,9 @@ void t_py_generator::generate_py_struct_definition(ostream& out, if (is_immutable(tstruct)) { if (gen_enum_ && type->is_enum()) { indent(out) << "super(" << tstruct->get_name() << ", self).__setattr__('" - << (*m_iter)->get_name() << "', " << (*m_iter)->get_name() << " if hasattr(" - << (*m_iter)->get_name() << ", 'value') else " << type_name(type) - << ".__members__.get(" << (*m_iter)->get_name() << "))" << '\n'; + << (*m_iter)->get_name() << "', " << (*m_iter)->get_name() + << " if hasattr(" << (*m_iter)->get_name() << ", 'value') else " + << type_name(type) << ".__members__.get(" << (*m_iter)->get_name() << "))" << '\n'; } else if (gen_newstyle_ || gen_dynamic_) { indent(out) << "super(" << tstruct->get_name() << ", self).__setattr__('" << (*m_iter)->get_name() << "', " << (*m_iter)->get_name() << ")" << '\n'; @@ -923,10 +926,11 @@ void t_py_generator::generate_py_struct_definition(ostream& out, // trivial because we know which fields are user-provided, without slots we need to build a // way to know which fields are user-provided. if (gen_slots_ && !gen_dynamic_) { - out << indent() << "if args[0] not in self.__slots__:" << '\n'; - indent_up(); - out << indent() << "super().__setattr__(*args)" << '\n' << indent() << "return" << '\n'; - indent_down(); + out << indent() << "if args[0] not in self.__slots__:" << '\n'; + indent_up(); + out << indent() << "super().__setattr__(*args)" << '\n' + << indent() << "return" << '\n'; + indent_down(); } out << indent() << "raise TypeError(\"can't modify immutable instance\")" << '\n'; indent_down(); @@ -940,10 +944,11 @@ void t_py_generator::generate_py_struct_definition(ostream& out, // trivial because we know which fields are user-provided, without slots we need to build a // way to know which fields are user-provided. if (gen_slots_ && !gen_dynamic_) { - out << indent() << "if args[0] not in self.__slots__:" << '\n'; - indent_up(); - out << indent() << "super().__delattr__(*args)" << '\n' << indent() << "return" << '\n'; - indent_down(); + out << indent() << "if args[0] not in self.__slots__:" << '\n'; + indent_up(); + out << indent() << "super().__delattr__(*args)" << '\n' + << indent() << "return" << '\n'; + indent_down(); } out << indent() << "raise TypeError(\"can't modify immutable instance\")" << '\n'; indent_down(); @@ -977,8 +982,7 @@ void t_py_generator::generate_py_struct_definition(ostream& out, t_type* type = (*m_iter)->get_type(); if (type->is_enum()) { out << indent() << "if name == \"" << (*m_iter)->get_name() << "\":" << '\n' - << indent() << indent_str() - << "super().__setattr__(name, value if hasattr(value, 'value') else " + << indent() << indent_str() << "super().__setattr__(name, value if hasattr(value, 'value') else " << type_name(type) << ".__members__.get(value))" << '\n' << indent() << indent_str() << "return" << '\n'; } @@ -1018,10 +1022,8 @@ void t_py_generator::generate_py_struct_definition(ostream& out, // Equality and inequality methods that compare by value out << indent() << "def __eq__(self, other):" << '\n'; indent_up(); - out << indent() - << "return isinstance(other, self.__class__) and " - "self.__dict__ == other.__dict__" - << '\n'; + out << indent() << "return isinstance(other, self.__class__) and " + "self.__dict__ == other.__dict__" << '\n'; indent_down(); out << '\n'; @@ -1105,7 +1107,7 @@ void t_py_generator::generate_py_struct_reader(ostream& out, t_struct* tstruct) result << "None"; } indent(out) << result.str() << '\n'; - } + } } // Loop over reading in fields @@ -1181,8 +1183,9 @@ void t_py_generator::generate_py_struct_writer(ostream& out, t_struct* tstruct) indent(out) << "if oprot._fast_encode is not None and self.thrift_spec is not None:" << '\n'; indent_up(); - indent(out) << "oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))" - << '\n'; + indent(out) + << "oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))" + << '\n'; indent(out) << "return" << '\n'; indent_down(); @@ -1206,8 +1209,8 @@ void t_py_generator::generate_py_struct_writer(ostream& out, t_struct* tstruct) } // Write the struct map - out << indent() << "oprot.writeFieldStop()" << '\n' - << indent() << "oprot.writeStructEnd()" << '\n'; + out << indent() << "oprot.writeFieldStop()" << '\n' << indent() << "oprot.writeStructEnd()" + << '\n'; out << '\n'; @@ -1251,9 +1254,8 @@ void t_py_generator::generate_service(t_service* tservice) { if (tservice->get_extends() != nullptr) { f_service_ << "import " - << get_real_py_module(tservice->get_extends()->get_program(), gen_twisted_, - package_prefix_) - << "." << tservice->get_extends()->get_name() << '\n'; + << get_real_py_module(tservice->get_extends()->get_program(), gen_twisted_, package_prefix_) << "." + << tservice->get_extends()->get_name() << '\n'; } f_service_ << "import logging" << '\n' @@ -1283,7 +1285,8 @@ void t_py_generator::generate_service(t_service* tservice) { generate_service_remote(tservice); // Close service file - f_service_ << "fix_spec(all_structs)" << '\n' << "del all_structs" << '\n'; + f_service_ << "fix_spec(all_structs)" << '\n' + << "del all_structs" << '\n'; f_service_.close(); } @@ -1442,8 +1445,8 @@ void t_py_generator::generate_service_client(t_service* tservice) { } } else { if (gen_twisted_) { - f_service_ << indent() << extends << ".Client.__init__(self, transport, oprot_factory)" - << '\n'; + f_service_ << indent() << extends + << ".Client.__init__(self, transport, oprot_factory)" << '\n'; } else if (gen_tornado_) { f_service_ << indent() << extends << ".Client.__init__(self, transport, iprot_factory, oprot_factory)" << '\n'; @@ -1454,9 +1457,9 @@ void t_py_generator::generate_service_client(t_service* tservice) { indent_down(); if (gen_tornado_ && extends.empty()) { - f_service_ << '\n' - << indent() << "@gen.engine" << '\n' - << indent() << "def _start_receiving(self):" << '\n'; + f_service_ << '\n' << + indent() << "@gen.engine" << '\n' << + indent() << "def _start_receiving(self):" << '\n'; indent_up(); indent(f_service_) << "while True:" << '\n'; indent_up(); @@ -1553,10 +1556,9 @@ void t_py_generator::generate_service_client(t_service* tservice) { indent(f_service_) << "d.addCallbacks(" << '\n'; indent_up(); - f_service_ << indent() << "callback=self.cb_send_" << funname << "," << '\n' - << indent() << "callbackArgs=(seqid,)," << '\n' - << indent() << "errback=self.eb_send_" << funname << "," << '\n' - << indent() << "errbackArgs=(seqid,))" << '\n'; + f_service_ << indent() << "callback=self.cb_send_" << funname << "," << '\n' << indent() + << "callbackArgs=(seqid,)," << '\n' << indent() << "errback=self.eb_send_" + << funname << "," << '\n' << indent() << "errbackArgs=(seqid,))" << '\n'; indent_down(); indent(f_service_) << "return d" << '\n'; @@ -1567,9 +1569,8 @@ void t_py_generator::generate_service_client(t_service* tservice) { indent_up(); if ((*f_iter)->is_oneway()) { // if one-way, fire the deferred & remove it from _reqs - f_service_ << indent() << "d = self._reqs.pop(seqid)" << '\n' - << indent() << "d.callback(None)" << '\n' - << indent() << "return d" << '\n'; + f_service_ << indent() << "d = self._reqs.pop(seqid)" << '\n' << indent() + << "d.callback(None)" << '\n' << indent() << "return d" << '\n'; } else { f_service_ << indent() << "return self._reqs[seqid]" << '\n'; } @@ -1579,9 +1580,8 @@ void t_py_generator::generate_service_client(t_service* tservice) { // add an errback to fail the request if the call to send_<> raised an exception indent(f_service_) << "def eb_send_" << funname << "(self, f, seqid):" << '\n'; indent_up(); - f_service_ << indent() << "d = self._reqs.pop(seqid)" << '\n' - << indent() << "d.errback(f)" << '\n' - << indent() << "return d" << '\n'; + f_service_ << indent() << "d = self._reqs.pop(seqid)" << '\n' << indent() << "d.errback(f)" + << '\n' << indent() << "return d" << '\n'; indent_down(); } @@ -1611,13 +1611,12 @@ void t_py_generator::generate_service_client(t_service* tservice) { // Write to the stream if (gen_twisted_ || gen_tornado_) { - f_service_ << indent() << "args.write(oprot)" << '\n' - << indent() << "oprot.writeMessageEnd()" << '\n' - << indent() << "oprot.trans.flush()" << '\n'; + f_service_ << indent() << "args.write(oprot)" << '\n' << indent() << "oprot.writeMessageEnd()" + << '\n' << indent() << "oprot.trans.flush()" << '\n'; } else { - f_service_ << indent() << "args.write(self._oprot)" << '\n' - << indent() << "self._oprot.writeMessageEnd()" << '\n' - << indent() << "self._oprot.trans.flush()" << '\n'; + f_service_ << indent() << "args.write(self._oprot)" << '\n' << indent() + << "self._oprot.writeMessageEnd()" << '\n' << indent() + << "self._oprot.trans.flush()" << '\n'; } indent_down(); @@ -1632,7 +1631,8 @@ void t_py_generator::generate_service_client(t_service* tservice) { } else { t_struct noargs(program_); t_function recv_function((*f_iter)->get_returntype(), - string("recv_") + (*f_iter)->get_name(), &noargs); + string("recv_") + (*f_iter)->get_name(), + &noargs); f_service_ << indent() << "def " << function_signature(&recv_function) << ":" << '\n'; } indent_up(); @@ -1643,27 +1643,23 @@ void t_py_generator::generate_service_client(t_service* tservice) { f_service_ << indent() << "d = self._reqs.pop(rseqid)" << '\n'; } else if (gen_tornado_) { } else { - f_service_ << indent() << "iprot = self._iprot" << '\n' - << indent() << "(fname, mtype, rseqid) = iprot.readMessageBegin()" << '\n'; + f_service_ << indent() << "iprot = self._iprot" << '\n' << indent() + << "(fname, mtype, rseqid) = iprot.readMessageBegin()" << '\n'; } f_service_ << indent() << "if mtype == TMessageType.EXCEPTION:" << '\n' << indent() << indent_str() << "x = TApplicationException()" << '\n'; if (gen_twisted_) { - f_service_ << indent() << indent_str() << "x.read(iprot)" << '\n' - << indent() << indent_str() << "iprot.readMessageEnd()" << '\n' - << indent() << indent_str() << "return d.errback(x)" << '\n' - << indent() << "result = " << resultname << "()" << '\n' - << indent() << "result.read(iprot)" << '\n' - << indent() << "iprot.readMessageEnd()" << '\n'; + f_service_ << indent() << indent_str() << "x.read(iprot)" << '\n' << indent() + << indent_str() << "iprot.readMessageEnd()" << '\n' << indent() << indent_str() << "return d.errback(x)" + << '\n' << indent() << "result = " << resultname << "()" << '\n' << indent() + << "result.read(iprot)" << '\n' << indent() << "iprot.readMessageEnd()" << '\n'; } else { - f_service_ << indent() << indent_str() << "x.read(iprot)" << '\n' - << indent() << indent_str() << "iprot.readMessageEnd()" << '\n' - << indent() << indent_str() << "raise x" << '\n' - << indent() << "result = " << resultname << "()" << '\n' - << indent() << "result.read(iprot)" << '\n' - << indent() << "iprot.readMessageEnd()" << '\n'; + f_service_ << indent() << indent_str() << "x.read(iprot)" << '\n' << indent() + << indent_str() << "iprot.readMessageEnd()" << '\n' << indent() << indent_str() << "raise x" << '\n' + << indent() << "result = " << resultname << "()" << '\n' << indent() + << "result.read(iprot)" << '\n' << indent() << "iprot.readMessageEnd()" << '\n'; } // Careful, only return _result if not a void function @@ -1738,31 +1734,28 @@ void t_py_generator::generate_service_remote(t_service* tservice) { ofstream_with_content_based_conditional_update f_remote; f_remote.open(f_remote_name.c_str()); - f_remote << "#!/usr/bin/env python" << '\n' - << py_autogen_comment() << '\n' - << "import sys" << '\n' - << "import pprint" << '\n' - << "if sys.version_info[0] > 2:" << '\n' - << indent_str() << "from urllib.parse import urlparse" << '\n' - << "else:" << '\n' - << indent_str() << "from urlparse import urlparse" << '\n' - << "from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient" << '\n' - << "from thrift.protocol.TBinaryProtocol import TBinaryProtocol" << '\n' - << '\n'; - - f_remote << "from " << module_ << " import " << service_name_ << '\n' - << "from " << module_ << ".ttypes import *" << '\n' - << '\n'; - - f_remote << "if len(sys.argv) <= 1 or sys.argv[1] == '--help':" << '\n' - << indent_str() << "print('')" << '\n' - << indent_str() - << "print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] " - "[-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function " - "[arg1 [arg2...]]')" - << '\n' - << indent_str() << "print('')" << '\n' - << indent_str() << "print('Functions:')" << '\n'; + f_remote << + "#!/usr/bin/env python" << '\n' << + py_autogen_comment() << '\n' << + "import sys" << '\n' << + "import pprint" << '\n' << + "if sys.version_info[0] > 2:" << '\n' << + indent_str() << "from urllib.parse import urlparse" << '\n' << + "else:" << '\n' << + indent_str() << "from urlparse import urlparse" << '\n' << + "from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient" << '\n' << + "from thrift.protocol.TBinaryProtocol import TBinaryProtocol" << '\n' << '\n'; + + f_remote << + "from " << module_ << " import " << service_name_ << '\n' << + "from " << module_ << ".ttypes import *" << '\n' << '\n'; + + f_remote << + "if len(sys.argv) <= 1 or sys.argv[1] == '--help':" << '\n' << + indent_str() << "print('')" << '\n' << + indent_str() << "print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')" << '\n' << + indent_str() << "print('')" << '\n' << + indent_str() << "print('Functions:')" << '\n'; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { f_remote << indent_str() << "print(' " << (*f_iter)->get_returntype()->get_name() << " " << (*f_iter)->get_name() << "("; @@ -1847,18 +1840,15 @@ void t_py_generator::generate_service_remote(t_service* tservice) { << indent_str() << "transport = THttpClient.THttpClient(host, port, uri)" << '\n' << "else:" << '\n' << indent_str() << "if ssl:" << '\n' - << indent_str() << indent_str() - << "socket = TSSLSocket.TSSLSocket(host, port, " + << indent_str() << indent_str() << "socket = TSSLSocket.TSSLSocket(host, port, " "validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile)" << '\n' << indent_str() << "else:" << '\n' << indent_str() << indent_str() << "socket = TSocket.TSocket(host, port)" << '\n' << indent_str() << "if framed:" << '\n' - << indent_str() << indent_str() << "transport = TTransport.TFramedTransport(socket)" - << '\n' + << indent_str() << indent_str() << "transport = TTransport.TFramedTransport(socket)" << '\n' << indent_str() << "else:" << '\n' - << indent_str() << indent_str() << "transport = TTransport.TBufferedTransport(socket)" - << '\n' + << indent_str() << indent_str() << "transport = TTransport.TBufferedTransport(socket)" << '\n' << "protocol = TBinaryProtocol(transport)" << '\n' << "client = " << service_name_ << ".Client(protocol)" << '\n' << "transport.open()" << '\n' @@ -1881,8 +1871,8 @@ void t_py_generator::generate_service_remote(t_service* tservice) { f_remote << "if cmd == '" << (*f_iter)->get_name() << "':" << '\n'; indent_up(); f_remote << indent() << "if len(args) != " << num_args << ":" << '\n' - << indent() << indent_str() << "print('" << (*f_iter)->get_name() << " requires " - << num_args << " args')" << '\n' + << indent() << indent_str() << "print('" << (*f_iter)->get_name() << " requires " << num_args + << " args')" << '\n' << indent() << indent_str() << "sys.exit(1)" << '\n' << indent() << "pp.pprint(client." << (*f_iter)->get_name() << "("; indent_down(); @@ -1918,11 +1908,12 @@ void t_py_generator::generate_service_remote(t_service* tservice) { #ifndef _MSC_VER // Make file executable, love that bitwise OR action - chmod(f_remote_name.c_str(), S_IRUSR | S_IWUSR | S_IXUSR + chmod(f_remote_name.c_str(), + S_IRUSR | S_IWUSR | S_IXUSR #ifndef _WIN32 - | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH + | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH #endif - ); + ); #endif // _MSC_VER } @@ -1983,7 +1974,7 @@ void t_py_generator::generate_service_server(t_service* tservice) { f_service_ << indent() << "def on_message_begin(self, func):" << '\n'; indent_up(); - f_service_ << indent() << "self._on_message_begin = func" << '\n'; + f_service_ << indent() << "self._on_message_begin = func" << '\n'; indent_down(); f_service_ << '\n'; @@ -1994,7 +1985,7 @@ void t_py_generator::generate_service_server(t_service* tservice) { f_service_ << indent() << "(name, type, seqid) = iprot.readMessageBegin()" << '\n'; f_service_ << indent() << "if self._on_message_begin:" << '\n'; indent_up(); - f_service_ << indent() << "self._on_message_begin(name, type, seqid)" << '\n'; + f_service_ << indent() << "self._on_message_begin(name, type, seqid)" << '\n'; indent_down(); // TODO(mcslee): validate message @@ -2053,9 +2044,8 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* (void)tservice; // Open function if (gen_tornado_) { - f_service_ << indent() << "@gen.coroutine" << '\n' - << indent() << "def process_" << tfunction->get_name() - << "(self, seqid, iprot, oprot):" << '\n'; + f_service_ << indent() << "@gen.coroutine" << '\n' << indent() << "def process_" + << tfunction->get_name() << "(self, seqid, iprot, oprot):" << '\n'; } else { f_service_ << indent() << "def process_" << tfunction->get_name() << "(self, seqid, iprot, oprot):" << '\n'; @@ -2066,9 +2056,8 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* string argsname = tfunction->get_name() + "_args"; string resultname = tfunction->get_name() + "_result"; - f_service_ << indent() << "args = " << argsname << "()" << '\n' - << indent() << "args.read(iprot)" << '\n' - << indent() << "iprot.readMessageEnd()" << '\n'; + f_service_ << indent() << "args = " << argsname << "()" << '\n' << indent() << "args.read(iprot)" + << '\n' << indent() << "iprot.readMessageEnd()" << '\n'; t_struct* xs = tfunction->get_xceptions(); const std::vector& xceptions = xs->get_members(); @@ -2173,8 +2162,8 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* << indent() << "oprot.trans.flush()" << '\n'; } else { f_service_ << indent() << "except Exception:" << '\n' - << indent() << indent_str() << "logging.exception('Exception in oneway handler')" - << '\n'; + << indent() << indent_str() + << "logging.exception('Exception in oneway handler')" << '\n'; } indent_down(); @@ -2232,8 +2221,8 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* << '\n'; } else { f_service_ << indent() << "except Exception:" << '\n' - << indent() << indent_str() << "logging.exception('Exception in oneway handler')" - << '\n'; + << indent() << indent_str() + << "logging.exception('Exception in oneway handler')" << '\n'; } if (!tfunction->is_oneway()) { @@ -2278,7 +2267,8 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* } indent_down(); - f_service_ << indent() << "except TTransport.TTransportException:" << '\n' + f_service_ << indent() + << "except TTransport.TTransportException:" << '\n' << indent() << indent_str() << "raise" << '\n'; if (!tfunction->is_oneway()) { @@ -2312,8 +2302,7 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* << indent() << "oprot.trans.flush()" << '\n'; } else { f_service_ << indent() << "except Exception:" << '\n' - << indent() << indent_str() << "logging.exception('Exception in oneway handler')" - << '\n'; + << indent() << indent_str() << "logging.exception('Exception in oneway handler')" << '\n'; } // Close function @@ -2324,7 +2313,9 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* /** * Deserializes a field of any type. */ -void t_py_generator::generate_deserialize_field(ostream& out, t_field* tfield, string prefix) { +void t_py_generator::generate_deserialize_field(ostream& out, + t_field* tfield, + string prefix) { t_type* type = get_true_type(tfield->get_type()); if (type->is_void()) { @@ -2348,11 +2339,10 @@ void t_py_generator::generate_deserialize_field(ostream& out, t_field* tfield, s case t_base_type::TYPE_STRING: if (type->is_binary()) { out << "readBinary()"; - } else if (!gen_utf8strings_) { + } else if(!gen_utf8strings_) { out << "readString()"; } else { - out << "readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else " - "iprot.readString()"; + out << "readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()"; } break; case t_base_type::TYPE_BOOL: @@ -2389,7 +2379,8 @@ void t_py_generator::generate_deserialize_field(ostream& out, t_field* tfield, s } out << '\n'; } else { - printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", tfield->get_name().c_str(), + printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", + tfield->get_name().c_str(), type->get_name().c_str()); } } @@ -2423,20 +2414,20 @@ void t_py_generator::generate_deserialize_container(ostream& out, t_type* ttype, // Declare variables, read header if (ttype->is_map()) { - out << indent() << prefix << " = {}" << '\n' - << indent() << "(" << ktype << ", " << vtype << ", " << size << ") = iprot.readMapBegin()" - << '\n'; + out << indent() << prefix << " = {}" << '\n' << indent() << "(" << ktype << ", " << vtype + << ", " << size << ") = iprot.readMapBegin()" << '\n'; } else if (ttype->is_set()) { - out << indent() << prefix << " = set()" << '\n' - << indent() << "(" << etype << ", " << size << ") = iprot.readSetBegin()" << '\n'; + out << indent() << prefix << " = set()" << '\n' << indent() << "(" << etype << ", " << size + << ") = iprot.readSetBegin()" << '\n'; } else if (ttype->is_list()) { - out << indent() << prefix << " = []" << '\n' - << indent() << "(" << etype << ", " << size << ") = iprot.readListBegin()" << '\n'; + out << indent() << prefix << " = []" << '\n' << indent() << "(" << etype << ", " << size + << ") = iprot.readListBegin()" << '\n'; } // For loop iterates over elements string i = tmp("_i"); - indent(out) << "for " << i << " in range(" << size << "):" << '\n'; + indent(out) << + "for " << i << " in range(" << size << "):" << '\n'; indent_up(); @@ -2499,7 +2490,9 @@ void t_py_generator::generate_deserialize_set_element(ostream& out, t_set* tset, /** * Write a list element */ -void t_py_generator::generate_deserialize_list_element(ostream& out, t_list* tlist, string prefix) { +void t_py_generator::generate_deserialize_list_element(ostream& out, + t_list* tlist, + string prefix) { string elem = tmp("_elem"); t_field felem(tlist->get_elem_type(), elem); @@ -2544,8 +2537,7 @@ void t_py_generator::generate_serialize_field(ostream& out, t_field* tfield, str } else if (!gen_utf8strings_) { out << "writeString(" << name << ")"; } else { - out << "writeString(" << name << ".encode('utf-8') if sys.version_info[0] == 2 else " - << name << ")"; + out << "writeString(" << name << ".encode('utf-8') if sys.version_info[0] == 2 else " << name << ")"; } break; case t_base_type::TYPE_BOOL: @@ -2573,7 +2565,7 @@ void t_py_generator::generate_serialize_field(ostream& out, t_field* tfield, str throw "compiler error: no Python name for base type " + t_base_type::t_base_name(tbase); } } else if (type->is_enum()) { - if (gen_enum_) { + if (gen_enum_){ out << "writeI32(" << name << ".value)"; } else { out << "writeI32(" << name << ")"; @@ -2581,8 +2573,10 @@ void t_py_generator::generate_serialize_field(ostream& out, t_field* tfield, str } out << '\n'; } else { - printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n", prefix.c_str(), - tfield->get_name().c_str(), type->get_name().c_str()); + printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n", + prefix.c_str(), + tfield->get_name().c_str(), + type->get_name().c_str()); } } @@ -2749,7 +2743,6 @@ string t_py_generator::declare_argument(t_field* tfield) { } else { result << "None"; } - return result.str(); } @@ -2842,8 +2835,7 @@ string t_py_generator::type_name(t_type* ttype) { return get_real_py_module(program, gen_twisted_, package_prefix_) + "." + ttype->get_name(); } if (program != nullptr && program != program_) { - return get_real_py_module(program, gen_twisted_, package_prefix_) + ".ttypes." - + ttype->get_name(); + return get_real_py_module(program, gen_twisted_, package_prefix_) + ".ttypes." + ttype->get_name(); } return ttype->get_name(); } @@ -2970,12 +2962,12 @@ string t_py_generator::type_to_spec_args(t_type* ttype) { } if (ttype->is_binary()) { - return "'BINARY'"; + return "'BINARY'"; } else if (gen_utf8strings_ && ttype->is_base_type() && reinterpret_cast(ttype)->is_string()) { return "'UTF8'"; } else if (ttype->is_base_type() || ttype->is_enum()) { - return "None"; + return "None"; } else if (ttype->is_struct() || ttype->is_xception()) { return "[" + type_name(ttype) + ", None]"; } else if (ttype->is_map()) { @@ -3009,22 +3001,19 @@ THRIFT_REGISTER_GENERATOR( " zope.interface: Generate code for use with zope.interface.\n" " twisted: Generate Twisted-friendly RPC services.\n" " tornado: Generate code for use with Tornado.\n" - " no_utf8strings: Do not Encode/decode strings using utf8 in the generated code. Basically " - "no effect for Python 3.\n" + " no_utf8strings: Do not Encode/decode strings using utf8 in the generated code. Basically no effect for Python 3.\n" " coding=CODING: Add file encoding declare in generated file.\n" " slots: Generate code using slots for instance members.\n" " dynamic: Generate dynamic code, less code generated but slower.\n" " dynbase=CLS Derive generated classes from class CLS instead of TBase.\n" - " dynfrozen=CLS Derive generated immutable classes from class CLS instead of " - "TFrozenBase.\n" + " dynfrozen=CLS Derive generated immutable classes from class CLS instead of TFrozenBase.\n" " dynexc=CLS Derive generated exceptions from CLS instead of TExceptionBase.\n" - " dynfrozenexc=CLS Derive generated immutable exceptions from CLS instead of " - "TFrozenExceptionBase.\n" + " dynfrozenexc=CLS Derive generated immutable exceptions from CLS instead of TFrozenExceptionBase.\n" " dynimport='from foo.bar import CLS'\n" " Add an import line to generated code to find the dynbase class.\n" " package_prefix='top.package.'\n" " Package prefix for generated files.\n" " old_style: Deprecated. Generate old-style classes.\n" - " enum: Generates Python's IntEnum, connects thrift to python enums. Python 3.4 " - "and higher.\n" - " type_hints: Generate type hints in write method, including IntEnum generation.\n") + " enum: Generates Python's IntEnum, connects thrift to python enums. Python 3.4 and higher.\n" + " type_hints: Generate type hints and type checks in write method, including IntEnum generation.\n" +) diff --git a/test/py/Makefile.am b/test/py/Makefile.am index b4be95352da..7e403d13dbd 100644 --- a/test/py/Makefile.am +++ b/test/py/Makefile.am @@ -125,9 +125,9 @@ gen-py-enum/%/__init__.py: ../%.thrift $(THRIFT) gen-py-type_hints/%/__init__.py: ../%.thrift $(THRIFT) test -d gen-py-type_hints || $(MKDIR_P) gen-py-type_hints - test ../v0.16/$(notdir $<) \ - && $(THRIFT) --gen py:type_hints -out gen-py-type_hints ../v0.16/$(notdir $<) \ - || $(THRIFT) --gen py:type_hints -out gen-py-type_hints $< + test ../$(notdir $<) \ + && $(THRIFT) --gen py:type_hints,enum -out gen-py-type_hints ../$(notdir $<) \ + || $(THRIFT) --gen py:type_hints,enum -out gen-py-type_hints $< clean-local: $(RM) -r build diff --git a/test/py/generate.cmake b/test/py/generate.cmake index a439c440d23..80e7f515bab 100644 --- a/test/py/generate.cmake +++ b/test/py/generate.cmake @@ -14,7 +14,7 @@ generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:no_utf8strings gen-py generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:dynamic gen-py-dynamic) generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:dynamic,slots gen-py-dynamicslots) generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:enum gen-py-enum) -generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:type_hints gen-py-type_hints) +generate(${MY_PROJECT_DIR}/test/ThriftTest.thrift py:type_hints,enum gen-py-type_hints) generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py gen-py-default) generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:slots gen-py-slots) @@ -23,7 +23,7 @@ generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:no_utf8strings ge generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:dynamic gen-py-dynamic) generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:dynamic,slots gen-py-dynamicslots) generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:enum gen-py-enum) -generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:type_hints gen-py-type_hints) +generate(${MY_PROJECT_DIR}/test/DebugProtoTest.thrift py:type_hints,enum gen-py-type_hints) generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py gen-py-default) generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:slots gen-py-slots) @@ -32,7 +32,7 @@ generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:no_utf8strings gen generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:dynamic gen-py-dynamic) generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:dynamic,slots gen-py-dynamicslots) generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:enum gen-py-enum) -generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:type_hints gen-py-type_hints) +generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:type_hints,enum gen-py-type_hints) generate(${MY_PROJECT_DIR}/test/Recursive.thrift py gen-py-default) generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:slots gen-py-slots) @@ -41,4 +41,4 @@ generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:no_utf8strings gen-py-no_utf generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:dynamic gen-py-dynamic) generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:dynamic,slots gen-py-dynamicslots) generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:enum gen-py-enum) -generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:type_hints gen-py-type_hints) +generate(${MY_PROJECT_DIR}/test/Recursive.thrift py:type_hints,enum gen-py-type_hints) From 4c39000f88ae397eb52f4db191ddb0b38153a947 Mon Sep 17 00:00:00 2001 From: Adam Kuhn Date: Tue, 18 Jun 2024 19:40:08 -0400 Subject: [PATCH 111/430] Update compiler/cpp/src/thrift/generate/t_py_generator.cc Review: document explicit int enum generation requirement instead of implicit Co-authored-by: r/Salomon Smeke <134332337+salomon-smekecohen@users.noreply.github.com> --- compiler/cpp/src/thrift/generate/t_py_generator.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/cpp/src/thrift/generate/t_py_generator.cc b/compiler/cpp/src/thrift/generate/t_py_generator.cc index 90bfd05d8ec..7b5c54df6cf 100644 --- a/compiler/cpp/src/thrift/generate/t_py_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_py_generator.cc @@ -3015,5 +3015,5 @@ THRIFT_REGISTER_GENERATOR( " Package prefix for generated files.\n" " old_style: Deprecated. Generate old-style classes.\n" " enum: Generates Python's IntEnum, connects thrift to python enums. Python 3.4 and higher.\n" - " type_hints: Generate type hints and type checks in write method, including IntEnum generation.\n" + " type_hints: Generate type hints and type checks in write method. Requires the enum option.\n" ) From 7de26c45443bc1642f90d5365bf8eef15e239ce5 Mon Sep 17 00:00:00 2001 From: arkuhn Date: Wed, 19 Jun 2024 01:20:47 -0400 Subject: [PATCH 112/430] Add tests --- test/py/RunClientServer.py | 1 + test/py/TestTypes.py | 65 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 test/py/TestTypes.py diff --git a/test/py/RunClientServer.py b/test/py/RunClientServer.py index e6ad3a340a2..583d88a6422 100755 --- a/test/py/RunClientServer.py +++ b/test/py/RunClientServer.py @@ -44,6 +44,7 @@ 'TestEof.py', 'TestSyntax.py', 'TestSocket.py', + 'TestTypes.py' ] FRAMED = ["TNonblockingServer"] SKIP_ZLIB = ['TNonblockingServer', 'THttpServer'] diff --git a/test/py/TestTypes.py b/test/py/TestTypes.py new file mode 100644 index 00000000000..f578f42e90c --- /dev/null +++ b/test/py/TestTypes.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +# +# 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. +from ThriftTest import ThriftTest +from ThriftTest.ThriftTest import Client +from ThriftTest.ttypes import Xtruct + +import unittest + +# only run this test if the string 'options string: py:type_hints' esxists in the file +def has_type_hints_option(): + with open(ThriftTest.__file__) as f: + return 'options string: py:type_hints' in f.read() + +@unittest.skipUnless(has_type_hints_option(), "type hints not enabled") +class TypeAnnotationsTest(unittest.TestCase): + + def test_void(self): + self.assertEqual(Client.testVoid.__annotations__, {'return': None}) + + def test_string(self): + self.assertEqual(Client.testString.__annotations__, {'return': str, 'thing': str}) + + def test_byte(self): + self.assertEqual(Client.testByte.__annotations__, {'return': int, 'thing': int}) + + def test_i32(self): + self.assertEqual(Client.testI32.__annotations__, {'return': int, 'thing': int}) + + def test_i64(self): + self.assertEqual(Client.testI64.__annotations__, {'return': int, 'thing': int}) + + def test_double(self): + self.assertEqual(Client.testDouble.__annotations__, {'return': float, 'thing': float}) + + def test_binary(self): + self.assertEqual(Client.testBinary.__annotations__, {'return': bytes, 'thing': bytes}) + + def test_struct(self): + self.assertEqual(Client.testStruct.__annotations__, {'return': Xtruct, 'thing': Xtruct}) + + def test_map(self): + self.assertEqual(Client.testMap.__annotations__, {'return': dict[int, int], 'thing': dict[int, int]}) + + def test_list(self): + self.assertEqual(Client.testList.__annotations__, {'return': list[int], 'thing': list[int]}) + + def test_set(self): + self.assertEqual(Client.testSet.__annotations__, {'return': set[int], 'thing': set[int]}) From 5d3b5a039bf94a2c1744b70e3f0d9dd249ce393e Mon Sep 17 00:00:00 2001 From: arkuhn Date: Sat, 22 Jun 2024 08:42:44 -0400 Subject: [PATCH 113/430] Generate thrift_spec class attribute (with type hints) --- compiler/cpp/src/thrift/generate/t_py_generator.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/compiler/cpp/src/thrift/generate/t_py_generator.cc b/compiler/cpp/src/thrift/generate/t_py_generator.cc index 7b5c54df6cf..893d6355cec 100644 --- a/compiler/cpp/src/thrift/generate/t_py_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_py_generator.cc @@ -831,6 +831,8 @@ void t_py_generator::generate_py_struct_definition(ostream& out, out << ":" << '\n'; indent_up(); generate_python_docstring(out, tstruct); + std::string thrift_spec_type = gen_type_hints_ ? ": typing.Any" : ""; + out << indent() << "thrift_spec" << thrift_spec_type << " = None" << '\n'; out << '\n'; From cb9ceada554f47aa5ebbedfe3984de0983cf0226 Mon Sep 17 00:00:00 2001 From: Sven Roederer Date: Fri, 5 Jul 2024 12:47:41 +0200 Subject: [PATCH 114/430] GHA/build: run tests for netstd Build and test the netstd library so there is some basic testing. Run tests on ubuntu-22.04, as 20.04 wil be EoL soon and also had some issues with dotnet-sdk. --- .github/workflows/build.yml | 61 +++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aef5e20fe44..63ad16d1951 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -297,6 +297,67 @@ jobs: lib/kotlin/cross-test-server/build/install/TestServer/ retention-days: 3 + lib-netstd: + needs: compiler + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v4 + + - name: Install dependencies + run: | + sudo apt-get update -yq + sudo apt-get install -y --no-install-recommends $BUILD_DEPS + sudo apt-get install -y --no-install-recommends curl openssl ca-certificates + +# the sdk is installed by default, but keep this step for reference +# - name: Set up .NET SDK +# run: | +# sudo apt-get install -y --no-install-recommends dotnet-sdk-8.0 + + - name: Run bootstrap + run: ./bootstrap.sh + + - name: Run configure for netstd + run: | + ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-netstd/with-netstd/') + + - uses: actions/download-artifact@v4 + with: + name: thrift-compiler + path: compiler/cpp + + - name: Run thrift-compiler + run: | + chmod a+x compiler/cpp/thrift + compiler/cpp/thrift -version + + - name: Run make for netstd + run: make -C lib/netstd + + - name: Run make install for netstd + run: sudo make -C lib/netstd install + + - name: Run make check for netstd + run: make -C lib/netstd check + + - name: Run make check for test/netstd + run: make -C test/netstd check + + - name: Run make precross for test/netstd + run: make -C test/netstd precross + + - name: Upload netstd precross artifacts + uses: actions/upload-artifact@v4 + with: + name: netstd-precross + if-no-files-found: error + path: | + test/netstd/Client/bin/Release/ + test/netstd/Server/bin/Release/ + retention-days: 3 + lib-swift: needs: compiler runs-on: ubuntu-22.04 From efe5e027355318c9b12993c829a80c68735e199b Mon Sep 17 00:00:00 2001 From: Csaba Ringhofer Date: Fri, 23 Aug 2024 14:08:35 +0200 Subject: [PATCH 115/430] THRIFT-5813: Close the socket in TSocket.isOpen() when peek() fails Client: py --- lib/py/src/transport/TSocket.py | 10 +++++++--- lib/py/test/test_socket.py | 6 ++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/py/src/transport/TSocket.py b/lib/py/src/transport/TSocket.py index 459f04370fe..51ea7e33014 100644 --- a/lib/py/src/transport/TSocket.py +++ b/lib/py/src/transport/TSocket.py @@ -90,18 +90,22 @@ def isOpen(self): self.handle.settimeout(0) try: peeked_bytes = self.handle.recv(1, socket.MSG_PEEK) + # the length will be zero if we got EOF (indicating connection closed) + if len(peeked_bytes) == 1: + return True except (socket.error, OSError) as exc: # on modern python this is just BlockingIOError if exc.errno in (errno.EWOULDBLOCK, errno.EAGAIN): return True - return False except ValueError: # SSLSocket fails on recv with non-zero flags; fallback to the old behavior return True finally: self.handle.settimeout(original_timeout) - # the length will be zero if we got EOF (indicating connection closed) - return len(peeked_bytes) == 1 + # The caller may assume that after isOpen() returns False, calling close() + # is not needed, so it is safer to close the socket here. + self.close() + return False def setTimeout(self, ms): if ms is None: diff --git a/lib/py/test/test_socket.py b/lib/py/test/test_socket.py index ab56a6ec3fc..13c1d5113c9 100644 --- a/lib/py/test/test_socket.py +++ b/lib/py/test/test_socket.py @@ -67,9 +67,11 @@ def test_isOpen_checks_for_readability(self): # once the server side closes, it no longer shows open acc.client.close() # this also blocks until the other thread is done acc.close() - self.assertFalse(sock.isOpen()) - sock.close() + self.assertIsNotNone(sock.handle) + self.assertFalse(sock.isOpen()) + # after isOpen() returned False the socket should be closed (THRIFT-5813) + self.assertIsNone(sock.handle) if __name__ == "__main__": From 4f5bfd81c7ca517f9378518bb2a9573b21f37b2b Mon Sep 17 00:00:00 2001 From: Sven Roederer Date: Wed, 17 Jul 2024 15:27:24 +0200 Subject: [PATCH 116/430] Thrift5272: cpp: add test for handling i8 type in printTo() Compare output of printTo() with known expected strings. Also fix some whitespacing, while at the files. --- lib/cpp/test/CMakeLists.txt | 11 +++++ lib/cpp/test/Makefile.am | 18 ++++++-- lib/cpp/test/Thrift5272.cpp | 76 ++++++++++++++++++++++++++++++++++ lib/cpp/test/Thrift5272.thrift | 30 ++++++++++++++ 4 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 lib/cpp/test/Thrift5272.cpp create mode 100644 lib/cpp/test/Thrift5272.thrift diff --git a/lib/cpp/test/CMakeLists.txt b/lib/cpp/test/CMakeLists.txt index 5ad8d74a845..a73b3e6f772 100644 --- a/lib/cpp/test/CMakeLists.txt +++ b/lib/cpp/test/CMakeLists.txt @@ -47,6 +47,8 @@ set(testgencpp_SOURCES gen-cpp/OneWayService.h gen-cpp/TypedefTest_types.cpp gen-cpp/TypedefTest_types.h + gen-cpp/Thrift5272_types.cpp + gen-cpp/Thrift5272_types.h ThriftTest_extras.cpp DebugProtoTest_extras.cpp ) @@ -83,6 +85,7 @@ set(UnitTest_SOURCES TServerTransportTest.cpp ThrifttReadCheckTests.cpp TUuidTest.cpp + Thrift5272.cpp ) add_executable(UnitTests ${UnitTest_SOURCES}) @@ -369,6 +372,8 @@ endif() # # Common thrift code generation rules # +# files from /test +# add_custom_command(OUTPUT gen-cpp/AnnotationTest_constants.cpp gen-cpp/AnnotationTest_constants.h @@ -407,10 +412,16 @@ add_custom_command(OUTPUT gen-cpp/SecondService.cpp gen-cpp/ThriftTest_constants COMMAND ${THRIFT_COMPILER} --gen cpp ${PROJECT_SOURCE_DIR}/test/ThriftTest.thrift ) +# files from /lib/cpp/test + add_custom_command(OUTPUT gen-cpp/OneWayService.cpp gen-cpp/OneWayTest_types.h gen-cpp/OneWayService.h COMMAND ${THRIFT_COMPILER} --gen cpp ${CMAKE_CURRENT_SOURCE_DIR}/OneWayTest.thrift ) +add_custom_command(OUTPUT gen-cpp/Thrift5272_types.cpp gen-cpp/Thrift5272_types.h + COMMAND ${THRIFT_COMPILER} --gen cpp ${CMAKE_CURRENT_SOURCE_DIR}/Thrift5272.thrift +) + add_custom_command(OUTPUT gen-cpp/ChildService.cpp gen-cpp/ChildService.h gen-cpp/ParentService.cpp gen-cpp/ParentService.h gen-cpp/proc_types.cpp gen-cpp/proc_types.h COMMAND ${THRIFT_COMPILER} --gen cpp:templates,cob_style ${CMAKE_CURRENT_SOURCE_DIR}/processor/proc.thrift ) diff --git a/lib/cpp/test/Makefile.am b/lib/cpp/test/Makefile.am index adb923a10b7..d9ab09208c9 100644 --- a/lib/cpp/test/Makefile.am +++ b/lib/cpp/test/Makefile.am @@ -24,12 +24,13 @@ BUILT_SOURCES = gen-cpp/AnnotationTest_types.h \ gen-cpp/OptionalRequiredTest_types.h \ gen-cpp/Recursive_types.h \ gen-cpp/ThriftTest_types.h \ + gen-cpp/Thrift5272_types.h \ gen-cpp/TypedefTest_types.h \ gen-cpp/ChildService.h \ gen-cpp/EmptyService.h \ gen-cpp/ParentService.h \ - gen-cpp/OneWayTest_types.h \ - gen-cpp/OneWayService.h \ + gen-cpp/OneWayTest_types.h \ + gen-cpp/OneWayService.h \ gen-cpp/proc_types.h noinst_LTLIBRARIES = libtestgencpp.la libprocessortest.la @@ -50,6 +51,8 @@ nodist_libtestgencpp_la_SOURCES = \ gen-cpp/ThriftTest_types.h \ gen-cpp/ThriftTest_constants.cpp \ gen-cpp/ThriftTest_constants.h \ + gen-cpp/Thrift5272_types.cpp \ + gen-cpp/Thrift5272_types.h \ gen-cpp/TypedefTest_types.cpp \ gen-cpp/TypedefTest_types.h \ gen-cpp/OneWayService.cpp \ @@ -104,7 +107,7 @@ check_PROGRAMS = \ OpenSSLManualInitTest \ EnumTest \ RenderedDoubleConstantsTest \ - AnnotationTest + AnnotationTest if AMX_HAVE_LIBEVENT noinst_PROGRAMS += \ @@ -134,6 +137,7 @@ UnitTests_SOURCES = \ TServerTransportTest.cpp \ TTransportCheckThrow.h \ ThrifttReadCheckTests.cpp \ + Thrift5272.cpp \ TUuidTest.cpp UnitTests_LDADD = \ @@ -409,6 +413,8 @@ OpenSSLManualInitTest_LDADD = \ # # Common thrift code generation rules # +# files from /test +# gen-cpp/AnnotationTest_constants.cpp gen-cpp/AnnotationTest_constants.h gen-cpp/AnnotationTest_types.cpp gen-cpp/AnnotationTest_types.h: $(top_srcdir)/test/AnnotationTest.thrift $(THRIFT) --gen cpp $< @@ -419,7 +425,6 @@ gen-cpp/DebugProtoTest_types.cpp gen-cpp/DebugProtoTest_types.h gen-cpp/EmptySer gen-cpp/DoubleConstantsTest_constants.cpp gen-cpp/DoubleConstantsTest_constants.h: $(top_srcdir)/test/DoubleConstantsTest.thrift $(THRIFT) --gen cpp $< - gen-cpp/EnumTest_types.cpp gen-cpp/EnumTest_types.h: $(top_srcdir)/test/EnumTest.thrift $(THRIFT) --gen cpp $< @@ -438,9 +443,14 @@ gen-cpp/Service.cpp gen-cpp/StressTest_types.cpp: $(top_srcdir)/test/StressTest. gen-cpp/SecondService.cpp gen-cpp/ThriftTest_constants.cpp gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_types.cpp gen-cpp/ThriftTest_types.h: $(top_srcdir)/test/ThriftTest.thrift $(THRIFT) --gen cpp $< +# files from /lib/cpp/test + gen-cpp/OneWayService.cpp gen-cpp/OneWayTest_types.h gen-cpp/OneWayService.h: OneWayTest.thrift $(THRIFT) --gen cpp $< +gen-cpp/Thrift5272_types.cpp gen-cpp/Thrift5272_types.h: Thrift5272.thrift + $(THRIFT) --gen cpp $< + gen-cpp/ChildService.cpp gen-cpp/ChildService.h gen-cpp/ParentService.cpp gen-cpp/ParentService.h gen-cpp/proc_types.cpp gen-cpp/proc_types.h: processor/proc.thrift $(THRIFT) --gen cpp:templates,cob_style $< diff --git a/lib/cpp/test/Thrift5272.cpp b/lib/cpp/test/Thrift5272.cpp new file mode 100644 index 00000000000..a6b23760adf --- /dev/null +++ b/lib/cpp/test/Thrift5272.cpp @@ -0,0 +1,76 @@ +/* + * 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 +#include +#include +#include "gen-cpp/Thrift5272_types.h" + +BOOST_AUTO_TEST_SUITE(Thrift5272Test) + +namespace utf = boost::unit_test; + +// Define this env var to enable some logging (in case you need to debug) +#undef ENABLE_STDERR_LOGGING + +using namespace thrift5272; + + +BOOST_AUTO_TEST_CASE( printTo ) +{ + std::stringstream ss; + std::string text; + Meta a = Meta(); + + a.printTo(ss); + text = ss.str(); + BOOST_TEST(text == "Meta(byte_type=0, i8_type=0, i16_type=0, i32_type=0, i64_type=0)"); + + ss.clear(); + ss.str(""); + a.byte_type = 50; + a.i8_type = 50; + a.i16_type = 50; + a.i32_type = 50; + a.i64_type = 50; + a.printTo(ss); + text = ss.str(); + BOOST_TEST(text == "Meta(byte_type=50, i8_type=50, i16_type=50, i32_type=50, i64_type=50)"); + + ss.clear(); + ss.str(""); + a.byte_type = 127; + a.i8_type = 127; + a.i16_type = 127; + a.i32_type = 127; + a.i64_type = 127; + a.printTo(ss); + text = ss.str(); + BOOST_TEST(text == "Meta(byte_type=127, i8_type=127, i16_type=127, i32_type=127, i64_type=127)"); +} + +BOOST_AUTO_TEST_CASE( ostream_handle_int8_to_str ) +{ + int8_t t = 65; + std::ostringstream o; + o << t; + BOOST_TEST(o.str() != "65", "ostingstream handles int8 correctly. let's drop specialization for Thrift5272 from TToString.h."); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/lib/cpp/test/Thrift5272.thrift b/lib/cpp/test/Thrift5272.thrift new file mode 100644 index 00000000000..4be3b6075d0 --- /dev/null +++ b/lib/cpp/test/Thrift5272.thrift @@ -0,0 +1,30 @@ +/* + * 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 cpp thrift5272 + +// a minimal Thrift struct, to test Trift5272.cpp +struct Meta +{ + 1: byte byte_type, // keep using byte, even it'S just an alias for i8 (THRIFT-5153) + 2: i8 i8_type, + 3: i16 i16_type, + 4: i32 i32_type, + 5: i64 i64_type, +} From 791f85c865604365819f5cb238cd16375b7068c9 Mon Sep 17 00:00:00 2001 From: Sven Roederer Date: Thu, 18 Jul 2024 02:06:17 +0200 Subject: [PATCH 117/430] cpp: add fix for Thrift5272 patch taken from Jira issue, with permission of author (github-user @jvoosten) --- lib/cpp/src/thrift/TToString.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/cpp/src/thrift/TToString.h b/lib/cpp/src/thrift/TToString.h index d91c58c4b2e..fe460326918 100644 --- a/lib/cpp/src/thrift/TToString.h +++ b/lib/cpp/src/thrift/TToString.h @@ -45,6 +45,14 @@ std::string to_string(const T& t) { return o.str(); } +// special handling of i8 datatypes (THRIFT-5272) +inline std::string to_string(const int8_t& t) { + std::ostringstream o; + o.imbue(default_locale); + o << static_cast(t); + return o.str(); +} + // TODO: replace the computations below with std::numeric_limits::max_digits10 once C++11 // is enabled. inline std::string to_string(const float& t) { From d80bb575cb664529e506318c751c411282bb9526 Mon Sep 17 00:00:00 2001 From: Sven Roederer Date: Wed, 17 Jul 2024 15:21:14 +0200 Subject: [PATCH 118/430] cpp: update includes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add missing include of "sstream" (seen when building with msvc) * remove deprecated boost header While compiling ThrifttReadCheckTests.cpp I found this warning: /usr/include/boost/test/auto_unit_test.hpp:17:1: note: ‘#pragma message: This header is deprecated. Use instead.’ 17 | BOOST_HEADER_DEPRECATED( "" ) | ^~~~~~~~~~~~~~~~~~~~~~~ As this goes back to boost v1.34.0 (released in May 2007) we can switch the headerfile, without risking build errors. --- lib/cpp/src/thrift/TUuid.h | 1 + lib/cpp/test/ThrifttReadCheckTests.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cpp/src/thrift/TUuid.h b/lib/cpp/src/thrift/TUuid.h index bcf0160bcdb..aa69c673dce 100644 --- a/lib/cpp/src/thrift/TUuid.h +++ b/lib/cpp/src/thrift/TUuid.h @@ -27,6 +27,7 @@ #endif // THRIFT_TUUID_SUPPORT_BOOST_UUID #include +#include namespace apache { namespace thrift { diff --git a/lib/cpp/test/ThrifttReadCheckTests.cpp b/lib/cpp/test/ThrifttReadCheckTests.cpp index 481185e7c12..7aab09f41d6 100644 --- a/lib/cpp/test/ThrifttReadCheckTests.cpp +++ b/lib/cpp/test/ThrifttReadCheckTests.cpp @@ -19,7 +19,6 @@ #define MAX_MESSAGE_SIZE 2 -#include #include #include #include From 5fc920dac710f6eee0417f58e65f91886ae704eb Mon Sep 17 00:00:00 2001 From: adrianhelvikspond Date: Wed, 31 Jul 2024 09:02:14 +0200 Subject: [PATCH 119/430] Fix JS property/method collisions for fields enamed read/write --- .../cpp/src/thrift/generate/t_js_generator.cc | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_js_generator.cc b/compiler/cpp/src/thrift/generate/t_js_generator.cc index dfc334bbf0f..27240e4f0b5 100644 --- a/compiler/cpp/src/thrift/generate/t_js_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_js_generator.cc @@ -1061,10 +1061,10 @@ void t_js_generator::generate_js_struct_reader(ostream& out, t_struct* tstruct) vector::const_iterator f_iter; if (gen_es6_) { - indent(out) << "read (input) {" << '\n'; + indent(out) << "[Symbol.for(\"read\")] (input) {" << '\n'; } else { indent(out) << js_namespace(tstruct->get_program()) << tstruct->get_name() - << ".prototype.read = function(input) {" << '\n'; + << ".prototype[Symbol.for(\"read\")] = function(input) {" << '\n'; } indent_up(); @@ -1151,10 +1151,10 @@ void t_js_generator::generate_js_struct_writer(ostream& out, t_struct* tstruct) vector::const_iterator f_iter; if (gen_es6_) { - indent(out) << "write (output) {" << '\n'; + indent(out) << "[Symbol.for(\"write\")] (output) {" << '\n'; } else { indent(out) << js_namespace(tstruct->get_program()) << tstruct->get_name() - << ".prototype.write = function(output) {" << '\n'; + << ".prototype[Symbol.for(\"write\")] = function(output) {" << '\n'; } indent_up(); @@ -1395,7 +1395,7 @@ void t_js_generator::generate_service_processor(t_service* tservice) { "Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN_METHOD, " "'Unknown function ' + r.fname);" << '\n' << indent() << " output.writeMessageBegin(r.fname, Thrift.MessageType.EXCEPTION, r.rseqid);" - << '\n' << indent() << " x.write(output);" << '\n' << indent() + << '\n' << indent() << " x[Symbol.for(\"write\")](output);" << '\n' << indent() << " output.writeMessageEnd();" << '\n' << indent() << " output.flush();" << '\n' << indent() << "}" << '\n'; @@ -1447,7 +1447,7 @@ void t_js_generator::generate_process_function(t_service* tservice, t_function* + "_result"; indent(f_service_) << js_const_type_ << "args = new " << argsname << "();" << '\n' << indent() - << "args.read(input);" << '\n' << indent() << "input.readMessageEnd();" << '\n'; + << "args[Symbol.for(\"read\")](input);" << '\n' << indent() << "input.readMessageEnd();" << '\n'; // Generate the function call t_struct* arg_struct = tfunction->get_arglist(); @@ -1509,7 +1509,7 @@ void t_js_generator::generate_process_function(t_service* tservice, t_function* f_service_ << indent() << js_const_type_ << "result_obj = new " << resultname << "({success: result});" << '\n' << indent() << "output.writeMessageBegin(\"" << tfunction->get_name() << "\", Thrift.MessageType.REPLY, seqid);" << '\n' << indent() - << "result_obj.write(output);" << '\n' << indent() << "output.writeMessageEnd();" << '\n' + << "result_obj[Symbol.for(\"write\")](output);" << '\n' << indent() << "output.writeMessageEnd();" << '\n' << indent() << "output.flush();" << '\n'; indent_down(); @@ -1562,7 +1562,7 @@ void t_js_generator::generate_process_function(t_service* tservice, t_function* indent(f_service_) << "}" << '\n'; } - f_service_ << indent() << "result.write(output);" << '\n' << indent() + f_service_ << indent() << "result[Symbol.for(\"write\")](output);" << '\n' << indent() << "output.writeMessageEnd();" << '\n' << indent() << "output.flush();" << '\n'; indent_down(); indent(f_service_) << "});" << '\n'; @@ -1610,7 +1610,7 @@ void t_js_generator::generate_process_function(t_service* tservice, t_function* " err.message);" << '\n' << indent() << "output.writeMessageBegin(\"" << tfunction->get_name() << "\", Thrift.MessageType.EXCEPTION, seqid);" << '\n'; indent_down(); - f_service_ << indent() << "}" << '\n' << indent() << "result_obj.write(output);" << '\n' << indent() + f_service_ << indent() << "}" << '\n' << indent() << "result_obj[Symbol.for(\"write\")](output);" << '\n' << indent() << "output.writeMessageEnd();" << '\n' << indent() << "output.flush();" << '\n'; indent_down(); @@ -2013,7 +2013,7 @@ void t_js_generator::generate_service_client(t_service* tservice) { // Write to the stream - f_service_ << indent() << "args.write(" << outputVar << ");" << '\n' << indent() << outputVar + f_service_ << indent() << "args[Symbol.for(\"write\")](" << outputVar << ");" << '\n' << indent() << outputVar << ".writeMessageEnd();" << '\n'; if (gen_node_) { @@ -2152,13 +2152,13 @@ void t_js_generator::generate_service_client(t_service* tservice) { indent_up(); f_service_ << indent() << js_const_type_ << "x = new Thrift.TApplicationException();" << '\n' - << indent() << "x.read(" << inputVar << ");" << '\n' + << indent() << "x[Symbol.for(\"read\")](" << inputVar << ");" << '\n' << indent() << inputVar << ".readMessageEnd();" << '\n' << indent() << render_recv_throw("x") << '\n'; scope_down(f_service_); f_service_ << indent() << js_const_type_ << "result = new " << resultname << "();" << '\n' << indent() - << "result.read(" << inputVar << ");" << '\n'; + << "result[Symbol.for(\"read\")](" << inputVar << ");" << '\n'; f_service_ << indent() << inputVar << ".readMessageEnd();" << '\n' << '\n'; @@ -2299,7 +2299,7 @@ void t_js_generator::generate_deserialize_field(ostream& out, */ void t_js_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) { out << indent() << prefix << " = new " << js_type_namespace(tstruct->get_program()) - << tstruct->get_name() << "();" << '\n' << indent() << prefix << ".read(input);" << '\n'; + << tstruct->get_name() << "();" << '\n' << indent() << prefix << "[Symbol.for(\"read\")](input);" << '\n'; } void t_js_generator::generate_deserialize_container(ostream& out, t_type* ttype, string prefix) { @@ -2482,7 +2482,7 @@ void t_js_generator::generate_serialize_field(ostream& out, t_field* tfield, str */ void t_js_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) { (void)tstruct; - indent(out) << prefix << ".write(output);" << '\n'; + indent(out) << prefix << "[Symbol.for(\"write\")](output);" << '\n'; } /** From bcc9cee244a282d9a716890c50ab95a9bb677e80 Mon Sep 17 00:00:00 2001 From: Alexander Kurz Date: Thu, 8 Aug 2024 10:43:24 +0000 Subject: [PATCH 120/430] THRIFT-5810: install static MSVC libraries to lib/ With THRIFT-5109 the LIB_INSTALL_DIR for MSVC libs chanaged from lib/ to bin/ which makes sense for shared libs but is not consistent with the usual treatment of static libs. Install the static libs to lib/, similar to other platforms and projects. --- build/cmake/DefineInstallationPaths.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build/cmake/DefineInstallationPaths.cmake b/build/cmake/DefineInstallationPaths.cmake index 23962b442d0..0c3dd094ac7 100644 --- a/build/cmake/DefineInstallationPaths.cmake +++ b/build/cmake/DefineInstallationPaths.cmake @@ -20,7 +20,9 @@ # Define the default install paths set(BIN_INSTALL_DIR "bin" CACHE PATH "The binary install dir (default: bin)") -if(MSVC) +# For MSVC builds, install shared libs to bin/, while keeping the install +# dir for static libs as lib/. +if(MSVC AND BUILD_SHARED_LIBS) set(LIB_INSTALL_DIR "bin${LIB_SUFFIX}" CACHE PATH "The library install dir (default: bin${LIB_SUFFIX})") else() set(LIB_INSTALL_DIR "lib${LIB_SUFFIX}" CACHE PATH "The library install dir (default: lib${LIB_SUFFIX})") From e9b1ef606ef747069ed9741995849661e584e436 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Sep 2024 06:49:16 +0000 Subject: [PATCH 121/430] Bump jvm from 2.0.10 to 2.0.20 in /lib/kotlin Bumps [jvm](https://github.com/JetBrains/kotlin) from 2.0.10 to 2.0.20. - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.0.10...v2.0.20) --- updated-dependencies: - dependency-name: jvm dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lib/kotlin/settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/kotlin/settings.gradle.kts b/lib/kotlin/settings.gradle.kts index cb797ee5a76..ccb54e766aa 100644 --- a/lib/kotlin/settings.gradle.kts +++ b/lib/kotlin/settings.gradle.kts @@ -18,7 +18,7 @@ */ pluginManagement { plugins { - kotlin("jvm") version "2.0.10" + kotlin("jvm") version "2.0.20" id("com.ncorti.ktfmt.gradle") version "0.19.0" } } From 80e9c4f564d557c5b2a9cf2458b526d704d123aa Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 3 Sep 2024 01:00:03 +0200 Subject: [PATCH 122/430] THRIFT-5815 veralign.sh broken and incomplete Patch: Jens Geyer --- build/veralign.sh | 8 ++++---- .../Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/build/veralign.sh b/build/veralign.sh index f59eaf40a0b..bc7cbaec9e2 100755 --- a/build/veralign.sh +++ b/build/veralign.sh @@ -69,12 +69,12 @@ FILES[lib/js/package-lock.json]=jsonReplace FILES[lib/js/package.json]=jsonReplace FILES[lib/js/src/thrift.js]=simpleReplace FILES[lib/lua/Thrift.lua]=simpleReplace -FILES[lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj]=simpleReplace -FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj]=simpleReplace +FILES[lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj]=simpleReplace FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj]=simpleReplace +FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj]=simpleReplace FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj]=simpleReplace -FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj]=simpleReplace -FILES[lib/netstd/Thrift/Properties/AssemblyInfo.cs]=simpleReplace +FILES[lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj]=simpleReplace +FILES[lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj]=simpleReplace FILES[lib/netstd/Thrift/Thrift.csproj]=simpleReplace FILES[lib/ocaml/_oasis]=simpleReplace FILES[lib/perl/lib/Thrift.pm]=simpleReplace diff --git a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj index fefaaadcb87..0f82cd93cd5 100644 --- a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj +++ b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj @@ -21,6 +21,7 @@ Exe net8.0 + 0.21.0 latestMajor false true From 467c6bdcb14f1fcdfb416df92b76ca9e5abbdc90 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 3 Sep 2024 01:21:07 +0200 Subject: [PATCH 123/430] THRIFT-5815 veralign.sh broken and incomplete Patch: Jens Geyer --- build/veralign.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/veralign.sh b/build/veralign.sh index bc7cbaec9e2..8664a4605f1 100755 --- a/build/veralign.sh +++ b/build/veralign.sh @@ -68,7 +68,9 @@ FILES[lib/java/gradle.properties]=simpleReplace FILES[lib/js/package-lock.json]=jsonReplace FILES[lib/js/package.json]=jsonReplace FILES[lib/js/src/thrift.js]=simpleReplace +FILES[lib/js/package-lock.json]=simpleReplace FILES[lib/lua/Thrift.lua]=simpleReplace +FILES[lib/netstd/Thrift/Properties/AssemblyInfo.cs]=simpleReplace FILES[lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj]=simpleReplace FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj]=simpleReplace FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj]=simpleReplace @@ -103,6 +105,8 @@ FILES[tutorial/netstd/Client/Client.csproj]=simpleReplace FILES[tutorial/netstd/Interfaces/Interfaces.csproj]=simpleReplace FILES[tutorial/netstd/Server/Server.csproj]=simpleReplace FILES[tutorial/ocaml/_oasis]=simpleReplace +FILES[lib/ts/package-lock.json]=simpleReplace +FILES[package-lock.json]=simpleReplace From ef199ccbc2a56831bbacc436fff1de49fa7aac16 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 3 Sep 2024 01:28:31 +0200 Subject: [PATCH 124/430] bump version number --- ApacheThrift.nuspec | 8 ++++---- CMakeLists.txt | 2 +- Thrift.podspec | 4 ++-- appveyor.yml | 2 +- bower.json | 2 +- compiler/cpp/src/thrift/version.h | 2 +- configure.ac | 2 +- contrib/Rebus/Properties/AssemblyInfo.cs | 4 ++-- contrib/thrift-maven-plugin/pom.xml | 2 +- contrib/thrift.spec | 2 +- contrib/zeromq/csharp/AssemblyInfo.cs | 2 +- doc/specs/idl.md | 2 +- lib/d/src/thrift/base.d | 2 +- lib/dart/pubspec.yaml | 2 +- lib/delphi/src/Thrift.pas | 2 +- lib/erl/src/thrift.app.src | 2 +- lib/haxe/haxelib.json | 2 +- lib/java/gradle.properties | 2 +- lib/js/package-lock.json | 4 ++-- lib/js/package.json | 2 +- lib/js/src/thrift.js | 2 +- lib/lua/Thrift.lua | 2 +- .../Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj | 2 +- .../Thrift.Compile.net6/Thrift.Compile.net6.csproj | 2 +- .../Thrift.Compile.net8/Thrift.Compile.net8.csproj | 2 +- .../Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj | 2 +- .../Thrift.IntegrationTests.csproj | 2 +- lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj | 2 +- lib/netstd/Thrift/Properties/AssemblyInfo.cs | 4 ++-- lib/netstd/Thrift/Thrift.csproj | 6 +++--- lib/ocaml/_oasis | 2 +- lib/perl/lib/Thrift.pm | 2 +- lib/py/setup.py | 2 +- lib/rb/thrift.gemspec | 2 +- lib/rs/Cargo.toml | 2 +- lib/st/package.xml | 2 +- lib/swift/Sources/Thrift.swift | 2 +- lib/swift/Tests/ThriftTests/ThriftTests.swift | 2 +- lib/ts/package-lock.json | 4 ++-- lib/ts/package.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- sonar-project.properties | 6 +++--- test/dart/test_client/pubspec.yaml | 2 +- test/erl/src/thrift_test.app.src | 2 +- test/netstd/Client/Client.csproj | 2 +- test/netstd/Server/Server.csproj | 2 +- tutorial/dart/client/pubspec.yaml | 2 +- tutorial/dart/console_client/pubspec.yaml | 2 +- tutorial/dart/server/pubspec.yaml | 2 +- tutorial/delphi/DelphiClient/DelphiClient.dproj | 4 ++-- tutorial/delphi/DelphiServer/DelphiServer.dproj | 4 ++-- tutorial/netstd/Client/Client.csproj | 2 +- tutorial/netstd/Interfaces/Interfaces.csproj | 2 +- tutorial/netstd/Server/Server.csproj | 2 +- tutorial/ocaml/_oasis | 2 +- 56 files changed, 71 insertions(+), 71 deletions(-) diff --git a/ApacheThrift.nuspec b/ApacheThrift.nuspec index a4ca51e4256..5a20f6286f7 100644 --- a/ApacheThrift.nuspec +++ b/ApacheThrift.nuspec @@ -19,14 +19,14 @@ the "Thrift" project. 2. nuget setApiKey 3. nuget pack ApacheThrift.nuspec -Symbols -SymbolPackageFormat snupkg - 4. nuget push ApacheThrift.0.21.0.nupkg -Source https://api.nuget.org/v3/index.json + 4. nuget push ApacheThrift.0.22.0.nupkg -Source https://api.nuget.org/v3/index.json --> ApacheThrift - 0.21.0 - Apache Thrift 0.21.0 + 0.22.0 + Apache Thrift 0.22.0 Apache Thrift Developers Apache Software Foundation Apache-2.0 @@ -36,7 +36,7 @@ Contains runtime libraries from lib/netstd for netstandard2.0 framework development. - + Apache Thrift RPC diff --git a/CMakeLists.txt b/CMakeLists.txt index 78969f275e3..b76d7035b22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,7 @@ endif() # PACKAGE_VERSION is used by cpack scripts currently # Both thrift_VERSION and PACKAGE_VERSION should be the same for now -set(thrift_VERSION "0.21.0") +set(thrift_VERSION "0.22.0") set(PACKAGE_VERSION ${thrift_VERSION}) project("thrift" VERSION ${PACKAGE_VERSION}) diff --git a/Thrift.podspec b/Thrift.podspec index 4fde1e5988f..08ed58c7e46 100644 --- a/Thrift.podspec +++ b/Thrift.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Thrift' - s.version = '0.21.0' + s.version = '0.22.0' s.summary = "Apache Thrift is a lightweight, language-independent software stack with an associated code generation mechanism for RPC." s.description = <<-DESC The Apache Thrift scalable cross-language software framework for networked services development combines a software stack with a code generation engine to build services that work efficiently and seamlessly between many programming languages. @@ -10,6 +10,6 @@ The Apache Thrift scalable cross-language software framework for networked servi s.author = { 'Apache Thrift Developers' => 'dev@thrift.apache.org' } s.ios.deployment_target = '9.0' s.osx.deployment_target = '10.10' - s.source = { :git => 'https://github.com/apache/thrift.git', :tag => 'v0.21.0' } + s.source = { :git => 'https://github.com/apache/thrift.git', :tag => 'v0.22.0' } s.source_files = 'lib/swift/Sources/*.swift' end diff --git a/appveyor.yml b/appveyor.yml index 0e81ba44757..8efc5222d05 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,7 +19,7 @@ # build Apache Thrift on AppVeyor - https://ci.appveyor.com -version: '0.21.0.{build}' +version: '0.22.0.{build}' shallow_clone: true diff --git a/bower.json b/bower.json index f80fe97bb02..871ab420de5 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "thrift", - "version": "0.21.0", + "version": "0.22.0", "homepage": "https://github.com/apache/thrift.git", "authors": [ "Apache Thrift " diff --git a/compiler/cpp/src/thrift/version.h b/compiler/cpp/src/thrift/version.h index 9692231e549..f7419838e8b 100644 --- a/compiler/cpp/src/thrift/version.h +++ b/compiler/cpp/src/thrift/version.h @@ -24,6 +24,6 @@ #pragma once #endif // _MSC_VER -#define THRIFT_VERSION "0.21.0" +#define THRIFT_VERSION "0.22.0" #endif // _THRIFT_VERSION_H_ diff --git a/configure.ac b/configure.ac index c8eaa6db31a..f0d073810c5 100644 --- a/configure.ac +++ b/configure.ac @@ -20,7 +20,7 @@ AC_PREREQ(2.65) AC_CONFIG_MACRO_DIR([./aclocal]) -AC_INIT([thrift], [0.21.0]) +AC_INIT([thrift], [0.22.0]) AC_CONFIG_AUX_DIR([.]) diff --git a/contrib/Rebus/Properties/AssemblyInfo.cs b/contrib/Rebus/Properties/AssemblyInfo.cs index f1dc685c2f7..25739150526 100644 --- a/contrib/Rebus/Properties/AssemblyInfo.cs +++ b/contrib/Rebus/Properties/AssemblyInfo.cs @@ -34,5 +34,5 @@ [assembly: Guid("0af10984-40d3-453d-b1e5-421529e8c7e2")] -[assembly: AssemblyVersion("0.21.0.0")] -[assembly: AssemblyFileVersion("0.21.0.0")] +[assembly: AssemblyVersion("0.22.0.0")] +[assembly: AssemblyFileVersion("0.22.0.0")] diff --git a/contrib/thrift-maven-plugin/pom.xml b/contrib/thrift-maven-plugin/pom.xml index 54ff1e02d6d..b314527ae99 100644 --- a/contrib/thrift-maven-plugin/pom.xml +++ b/contrib/thrift-maven-plugin/pom.xml @@ -29,7 +29,7 @@ thrift-maven-plugin maven-plugin thrift-maven-plugin - 0.21.0 + 0.22.0 1.8 diff --git a/contrib/thrift.spec b/contrib/thrift.spec index 20dcc574060..15e1c5b75a5 100644 --- a/contrib/thrift.spec +++ b/contrib/thrift.spec @@ -28,7 +28,7 @@ Name: thrift License: Apache License v2.0 Group: Development Summary: RPC and serialization framework -Version: 0.21.0 +Version: 0.22.0 Release: 0 URL: http://thrift.apache.org Packager: Thrift Developers diff --git a/contrib/zeromq/csharp/AssemblyInfo.cs b/contrib/zeromq/csharp/AssemblyInfo.cs index 7f91c339042..27378f30cbf 100644 --- a/contrib/zeromq/csharp/AssemblyInfo.cs +++ b/contrib/zeromq/csharp/AssemblyInfo.cs @@ -36,7 +36,7 @@ // The form "{Major}.{Minor}.*" will automatically update the build and revision, // and "{Major}.{Minor}.{Build}.*" will update just the revision. -[assembly: AssemblyVersion("0.21.0.0")] +[assembly: AssemblyVersion("0.22.0.0")] // The following attributes are used to specify the signing key for the assembly, // if desired. See the Mono documentation for more information about signing. diff --git a/doc/specs/idl.md b/doc/specs/idl.md index f5803b54a50..9777af4e0c9 100644 --- a/doc/specs/idl.md +++ b/doc/specs/idl.md @@ -1,6 +1,6 @@ ## Thrift interface description language -For Thrift version 0.21.0. +For Thrift version 0.22.0. The Thrift interface definition language (IDL) allows for the definition of [Thrift Types](/docs/types). A Thrift IDL file is processed by the Thrift code generator to produce code for the various target languages to support the defined structs and services in the IDL file. diff --git a/lib/d/src/thrift/base.d b/lib/d/src/thrift/base.d index ddc0dd498bf..b5cb075bf8d 100644 --- a/lib/d/src/thrift/base.d +++ b/lib/d/src/thrift/base.d @@ -50,7 +50,7 @@ class TCompoundOperationException : TException { /// The Thrift version string, used for informative purposes. // Note: This is currently hardcoded, but will likely be filled in by the build // system in future versions. -enum VERSION = "0.21.0"; +enum VERSION = "0.22.0"; /** * Functions used for logging inside Thrift. diff --git a/lib/dart/pubspec.yaml b/lib/dart/pubspec.yaml index 069818f0864..db7b8a6bd54 100644 --- a/lib/dart/pubspec.yaml +++ b/lib/dart/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: thrift -version: 0.21.0 +version: 0.22.0 description: > A Dart library for Apache Thrift author: Apache Thrift Developers diff --git a/lib/delphi/src/Thrift.pas b/lib/delphi/src/Thrift.pas index 9e1b0bbf59b..b06d38fbdb8 100644 --- a/lib/delphi/src/Thrift.pas +++ b/lib/delphi/src/Thrift.pas @@ -28,7 +28,7 @@ interface Thrift.Protocol; const - Version = '0.21.0'; + Version = '0.22.0'; type TException = Thrift.Exception.TException; // compatibility alias diff --git a/lib/erl/src/thrift.app.src b/lib/erl/src/thrift.app.src index 8431213272a..499b7666452 100644 --- a/lib/erl/src/thrift.app.src +++ b/lib/erl/src/thrift.app.src @@ -22,7 +22,7 @@ {description, "Thrift bindings"}, % The version of the applicaton - {vsn, "0.21.0"}, + {vsn, "0.22.0"}, % All modules used by the application. {modules, []}, diff --git a/lib/haxe/haxelib.json b/lib/haxe/haxelib.json index 6f5de0b11b7..5eabff5f682 100644 --- a/lib/haxe/haxelib.json +++ b/lib/haxe/haxelib.json @@ -10,7 +10,7 @@ "framework" ], "description": "Haxe bindings for the Apache Thrift RPC and serialization framework", - "version": "0.21.0", + "version": "0.22.0", "releasenote": "Licensed under Apache License, Version 2.0. The Apache Thrift compiler needs to be installed separately.", "contributors": ["ApacheThrift"], "dependencies": { diff --git a/lib/java/gradle.properties b/lib/java/gradle.properties index a3912e3cbe3..5aca7544131 100644 --- a/lib/java/gradle.properties +++ b/lib/java/gradle.properties @@ -1,7 +1,7 @@ # This file is shared currently between this Gradle build and the # Ant builds for fd303 and JavaScript. Keep the dotted notation for # the properties to minimize the changes in the dependencies. -thrift.version=0.21.0 +thrift.version=0.22.0 thrift.groupid=org.apache.thrift release=false diff --git a/lib/js/package-lock.json b/lib/js/package-lock.json index 562e38f5259..ab908ac1d58 100644 --- a/lib/js/package-lock.json +++ b/lib/js/package-lock.json @@ -1,12 +1,12 @@ { "name": "thrift", - "version": "0.21.0", + "version": "0.22.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "thrift", - "version": "0.21.0", + "version": "0.22.0", "license": "Apache-2.0", "devDependencies": { "browserify": "~16.5", diff --git a/lib/js/package.json b/lib/js/package.json index d9ab5a63bae..73a8cb450bc 100644 --- a/lib/js/package.json +++ b/lib/js/package.json @@ -1,6 +1,6 @@ { "name": "thrift", - "version": "0.21.0", + "version": "0.22.0", "description": "Thrift is a software framework for scalable cross-language services development.", "main": "./src/thrift", "author": { diff --git a/lib/js/src/thrift.js b/lib/js/src/thrift.js index de5ca198aaf..7a23eac4d2b 100644 --- a/lib/js/src/thrift.js +++ b/lib/js/src/thrift.js @@ -46,7 +46,7 @@ var Thrift = { * @const {string} Version * @memberof Thrift */ - Version: '0.21.0', + Version: '0.22.0', /** * Thrift IDL type string to Id mapping. diff --git a/lib/lua/Thrift.lua b/lib/lua/Thrift.lua index 212359bc19e..58daa22eafd 100644 --- a/lib/lua/Thrift.lua +++ b/lib/lua/Thrift.lua @@ -48,7 +48,7 @@ function ttable_size(t) return count end -version = '0.21.0' +version = '0.22.0' TType = { STOP = 0, diff --git a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj index 0f82cd93cd5..7877e6bf93b 100644 --- a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj +++ b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj @@ -21,7 +21,7 @@ Exe net8.0 - 0.21.0 + 0.22.0 latestMajor false true diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj index bcbed7ef94d..6228aab98be 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj @@ -19,7 +19,7 @@ --> - 0.21.0 + 0.22.0 Thrift version $(ThriftVersion) net6.0 latestMajor diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj index 16b86cee017..49fc8288dbc 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj @@ -19,7 +19,7 @@ --> - 0.21.0 + 0.22.0 Thrift version $(ThriftVersion) net8.0 latestMajor diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj index cc2b5e499be..1e180617e52 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj @@ -19,7 +19,7 @@ --> - 0.21.0 + 0.22.0 Thrift version $(ThriftVersion) netstandard2.0 latestMajor diff --git a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj index 2cb634937a0..d7d52c82b78 100644 --- a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj +++ b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj @@ -23,7 +23,7 @@ latestMajor Thrift.IntegrationTests Thrift.IntegrationTests - 0.21.0.0 + 0.22.0.0 Exe false false diff --git a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj index 089064b2b4f..c66558cca3d 100644 --- a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj +++ b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj @@ -21,7 +21,7 @@ net8.0 latestMajor - 0.21.0.0 + 0.22.0.0 enable diff --git a/lib/netstd/Thrift/Properties/AssemblyInfo.cs b/lib/netstd/Thrift/Properties/AssemblyInfo.cs index 383b256c4c1..84be9807563 100644 --- a/lib/netstd/Thrift/Properties/AssemblyInfo.cs +++ b/lib/netstd/Thrift/Properties/AssemblyInfo.cs @@ -52,5 +52,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.21.0.0")] -[assembly: AssemblyFileVersion("0.21.0.0")] +[assembly: AssemblyVersion("0.22.0.0")] +[assembly: AssemblyFileVersion("0.22.0.0")] diff --git a/lib/netstd/Thrift/Thrift.csproj b/lib/netstd/Thrift/Thrift.csproj index 587a92e0878..4bee3dfc048 100644 --- a/lib/netstd/Thrift/Thrift.csproj +++ b/lib/netstd/Thrift/Thrift.csproj @@ -40,8 +40,8 @@ true thrift.snk false - Apache Thrift 0.21.0 - 0.21.0.0 + Apache Thrift 0.22.0 + 0.22.0.0 false http://thrift.apache.org/ Apache Thrift Developers @@ -50,7 +50,7 @@ C# .NET Core bindings for the Apache Thrift RPC system Apache Thrift RPC - https://github.com/apache/thrift/blob/0.21.0/CHANGES.md + https://github.com/apache/thrift/blob/0.22.0/CHANGES.md README.md Copyright 2024 The Apache Software Foundation diff --git a/lib/ocaml/_oasis b/lib/ocaml/_oasis index adf619804bc..bc01addfe3c 100644 --- a/lib/ocaml/_oasis +++ b/lib/ocaml/_oasis @@ -1,5 +1,5 @@ Name: libthrift-ocaml -Version: 0.21.0 +Version: 0.22.0 OASISFormat: 0.3 Synopsis: OCaml bindings for the Apache Thrift RPC system Authors: Apache Thrift Developers diff --git a/lib/perl/lib/Thrift.pm b/lib/perl/lib/Thrift.pm index 45bf33bb792..995131eccd8 100644 --- a/lib/perl/lib/Thrift.pm +++ b/lib/perl/lib/Thrift.pm @@ -31,6 +31,6 @@ use warnings; # package Thrift; -use version 0.77; our $VERSION = version->declare("v0.21.0"); +use version 0.77; our $VERSION = version->declare("v0.22.0"); 1; diff --git a/lib/py/setup.py b/lib/py/setup.py index 31e2bae326e..3e10f01bb76 100644 --- a/lib/py/setup.py +++ b/lib/py/setup.py @@ -105,7 +105,7 @@ def run_setup(with_binary): twisted_deps = ['twisted'] setup(name='thrift', - version='0.21.0', + version='0.22.0', description='Python bindings for the Apache Thrift RPC system', long_description=read_file("README.md"), long_description_content_type="text/markdown", diff --git a/lib/rb/thrift.gemspec b/lib/rb/thrift.gemspec index 1977ec4766f..625c6a458b3 100644 --- a/lib/rb/thrift.gemspec +++ b/lib/rb/thrift.gemspec @@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| s.name = 'thrift' - s.version = '0.21.0' + s.version = '0.22.0' s.authors = ['Apache Thrift Developers'] s.email = ['dev@thrift.apache.org'] s.homepage = 'http://thrift.apache.org' diff --git a/lib/rs/Cargo.toml b/lib/rs/Cargo.toml index dd4a1b641cc..263b9d972fc 100644 --- a/lib/rs/Cargo.toml +++ b/lib/rs/Cargo.toml @@ -2,7 +2,7 @@ name = "thrift" description = "Rust bindings for the Apache Thrift RPC system" edition = "2021" -version = "0.21.0" +version = "0.22.0" license = "Apache-2.0" authors = ["Apache Thrift Developers "] homepage = "http://thrift.apache.org" diff --git a/lib/st/package.xml b/lib/st/package.xml index d606aadb748..5f92da86515 100644 --- a/lib/st/package.xml +++ b/lib/st/package.xml @@ -17,7 +17,7 @@ specific language governing permissions and limitations under the License. --> - + libthrift-st thrift.st diff --git a/lib/swift/Sources/Thrift.swift b/lib/swift/Sources/Thrift.swift index d78cff6c01f..ad15d8abbe3 100644 --- a/lib/swift/Sources/Thrift.swift +++ b/lib/swift/Sources/Thrift.swift @@ -1,3 +1,3 @@ class Thrift { - let version = "0.21.0" + let version = "0.22.0" } diff --git a/lib/swift/Tests/ThriftTests/ThriftTests.swift b/lib/swift/Tests/ThriftTests/ThriftTests.swift index 10121e744fe..2632cc3e3bf 100644 --- a/lib/swift/Tests/ThriftTests/ThriftTests.swift +++ b/lib/swift/Tests/ThriftTests/ThriftTests.swift @@ -3,7 +3,7 @@ import XCTest class ThriftTests: XCTestCase { func testVersion() { - XCTAssertEqual(Thrift().version, "0.21.0") + XCTAssertEqual(Thrift().version, "0.22.0") } static var allTests : [(String, (ThriftTests) -> () throws -> Void)] { diff --git a/lib/ts/package-lock.json b/lib/ts/package-lock.json index ee1592ea654..a523ef42b9f 100644 --- a/lib/ts/package-lock.json +++ b/lib/ts/package-lock.json @@ -1,12 +1,12 @@ { "name": "thrift", - "version": "0.21.0", + "version": "0.22.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "thrift", - "version": "0.21.0", + "version": "0.22.0", "license": "Apache-2.0", "dependencies": { "bufferutil": "^4.0.1", diff --git a/lib/ts/package.json b/lib/ts/package.json index f2960657bf6..13aefaabf6a 100644 --- a/lib/ts/package.json +++ b/lib/ts/package.json @@ -1,6 +1,6 @@ { "name": "thrift", - "version": "0.21.0", + "version": "0.22.0", "description": "Thrift is a software framework for scalable cross-language services development.", "author": { "name": "Apache Thrift Developers", diff --git a/package-lock.json b/package-lock.json index 8fc75aacbd0..50f7d58558f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "thrift", - "version": "0.21.0", + "version": "0.22.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "thrift", - "version": "0.21.0", + "version": "0.22.0", "license": "Apache-2.0", "dependencies": { "browser-or-node": "^1.2.1", diff --git a/package.json b/package.json index 2925cc8f2ae..5b02952667b 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "type": "git", "url": "https://github.com/apache/thrift.git" }, - "version": "0.21.0", + "version": "0.22.0", "author": { "name": "Apache Thrift Developers", "email": "dev@thrift.apache.org", diff --git a/sonar-project.properties b/sonar-project.properties index 02b1195c229..f88d43505cc 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -16,7 +16,7 @@ development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between all major languages. # Apache Thrift Version -sonar.projectVersion=0.21.0 +sonar.projectVersion=0.22.0 # use this to set another version string # $ sonar-runner -D sonar.projectVersion=`git rev-parse HEAD` # set projectDate in combination with projectVersion for imports of old releases @@ -54,7 +54,7 @@ module1.sonar.projectName=Apache Thrift - Java Library module1.sonar.projectBaseDir=lib/java module1.sonar.sources=src module1.sonar.tests=test -module1.sonar.binaries=build/libs/libthrift-0.21.0.jar +module1.sonar.binaries=build/libs/libthrift-0.22.0.jar module1.sonar.libraries=build/deps/*.jar module1.sonar.language=java @@ -62,7 +62,7 @@ module2.sonar.projectName=Apache Thrift - Java Tutorial module2.sonar.projectBaseDir=. module2.sonar.sources=tutorial/java/src, tutorial/java/gen-java module2.sonar.binaries=tutorial/java/tutorial.jar -module2.sonar.libraries=lib/java/build/deps/*.jar,lib/java/build/libs/libthrift-0.21.0.jar +module2.sonar.libraries=lib/java/build/deps/*.jar,lib/java/build/libs/libthrift-0.22.0.jar module2.sonar.language=java module3.sonar.projectName=Apache Thrift - JavaScript Library diff --git a/test/dart/test_client/pubspec.yaml b/test/dart/test_client/pubspec.yaml index f4d01358a9c..0df6caea19f 100644 --- a/test/dart/test_client/pubspec.yaml +++ b/test/dart/test_client/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: thrift_test_client -version: 0.21.0 +version: 0.22.0 description: A client integration test for the Dart Thrift library author: Apache Thrift Developers homepage: http://thrift.apache.org diff --git a/test/erl/src/thrift_test.app.src b/test/erl/src/thrift_test.app.src index b78fc296c75..fa95d3c1e71 100644 --- a/test/erl/src/thrift_test.app.src +++ b/test/erl/src/thrift_test.app.src @@ -22,7 +22,7 @@ {description, "Thrift cross language test"}, % The version of the applicaton - {vsn, "0.21.0"}, + {vsn, "0.22.0"}, % All modules used by the application. {modules, [ diff --git a/test/netstd/Client/Client.csproj b/test/netstd/Client/Client.csproj index 62b01ddc8c1..78cc22a0155 100644 --- a/test/netstd/Client/Client.csproj +++ b/test/netstd/Client/Client.csproj @@ -24,7 +24,7 @@ Client Client Exe - 0.21.0.0 + 0.22.0.0 false false false diff --git a/test/netstd/Server/Server.csproj b/test/netstd/Server/Server.csproj index 94cd8b1c046..766b7a9f1a8 100644 --- a/test/netstd/Server/Server.csproj +++ b/test/netstd/Server/Server.csproj @@ -24,7 +24,7 @@ Server Server Exe - 0.21.0.0 + 0.22.0.0 false false false diff --git a/tutorial/dart/client/pubspec.yaml b/tutorial/dart/client/pubspec.yaml index b486ec80b28..71b580c1630 100644 --- a/tutorial/dart/client/pubspec.yaml +++ b/tutorial/dart/client/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: tutorial_client -version: 0.21.0 +version: 0.22.0 description: A Dart client implementation of the Apache Thrift tutorial author: Apache Thrift Developers homepage: http://thrift.apache.org diff --git a/tutorial/dart/console_client/pubspec.yaml b/tutorial/dart/console_client/pubspec.yaml index bf61ded77ad..b7e2e5090e4 100644 --- a/tutorial/dart/console_client/pubspec.yaml +++ b/tutorial/dart/console_client/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: tutorial_console_client -version: 0.21.0 +version: 0.22.0 description: > A Dart console client to implementation of the Apache Thrift tutorial author: Apache Thrift Developers diff --git a/tutorial/dart/server/pubspec.yaml b/tutorial/dart/server/pubspec.yaml index 29811eb21be..f694118b389 100644 --- a/tutorial/dart/server/pubspec.yaml +++ b/tutorial/dart/server/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: tutorial_server -version: 0.21.0 +version: 0.22.0 description: A Dart server to support the Apache Thrift tutorial author: Apache Thrift Developers homepage: http://thrift.apache.org diff --git a/tutorial/delphi/DelphiClient/DelphiClient.dproj b/tutorial/delphi/DelphiClient/DelphiClient.dproj index fbb63f7f616..785de16ab31 100644 --- a/tutorial/delphi/DelphiClient/DelphiClient.dproj +++ b/tutorial/delphi/DelphiClient/DelphiClient.dproj @@ -124,13 +124,13 @@ popd]]> Thrift Tutorial - 0.21.0.0 + 0.22.0.0 DelphiClient Copyright © 2012 The Apache Software Foundation DelphiClient.exe Thrift - 0.21.0.0 + 0.22.0.0 diff --git a/tutorial/delphi/DelphiServer/DelphiServer.dproj b/tutorial/delphi/DelphiServer/DelphiServer.dproj index 376d90ae1b1..43c963afd05 100644 --- a/tutorial/delphi/DelphiServer/DelphiServer.dproj +++ b/tutorial/delphi/DelphiServer/DelphiServer.dproj @@ -121,13 +121,13 @@ popd]]> Thrift Tutorial - 0.21.0.0 + 0.22.0.0 DelphiServer Copyright © 2012 The Apache Software Foundation DelphiServer.exe Thrift - 0.21.0.0 + 0.22.0.0 diff --git a/tutorial/netstd/Client/Client.csproj b/tutorial/netstd/Client/Client.csproj index ebc63acfc2f..732943f12be 100644 --- a/tutorial/netstd/Client/Client.csproj +++ b/tutorial/netstd/Client/Client.csproj @@ -24,7 +24,7 @@ Client Client Exe - 0.21.0.0 + 0.22.0.0 false false false diff --git a/tutorial/netstd/Interfaces/Interfaces.csproj b/tutorial/netstd/Interfaces/Interfaces.csproj index b0de8423016..2791dc8d5cc 100644 --- a/tutorial/netstd/Interfaces/Interfaces.csproj +++ b/tutorial/netstd/Interfaces/Interfaces.csproj @@ -22,7 +22,7 @@ net8.0 Interfaces Interfaces - 0.21.0.0 + 0.22.0.0 false false false diff --git a/tutorial/netstd/Server/Server.csproj b/tutorial/netstd/Server/Server.csproj index 38131a6d32d..16b72e281b5 100644 --- a/tutorial/netstd/Server/Server.csproj +++ b/tutorial/netstd/Server/Server.csproj @@ -24,7 +24,7 @@ Server Server Exe - 0.21.0.0 + 0.22.0.0 false false false diff --git a/tutorial/ocaml/_oasis b/tutorial/ocaml/_oasis index 180f86560e8..12ec7f9edbf 100644 --- a/tutorial/ocaml/_oasis +++ b/tutorial/ocaml/_oasis @@ -1,5 +1,5 @@ Name: tutorial -Version: 0.21.0 +Version: 0.22.0 OASISFormat: 0.3 Synopsis: OCaml Tutorial example Authors: Apache Thrift Developers From d707811dbf1e155ceb4f06a1f8958813f43786a5 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 3 Sep 2024 01:53:49 +0200 Subject: [PATCH 125/430] bump version number --- debian/changelog | 6 ++++++ doap.rdf | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/debian/changelog b/debian/changelog index 147c4b4bf65..df7e6931f3d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +thrift (0.21.0) stable; urgency=low + + * update to 0.21.0 + + -- Apache Thrift Developers Mon, 02 Sep 2024 23:30:00 +0100 + thrift (0.20.0) stable; urgency=low * update to 0.20.0 diff --git a/doap.rdf b/doap.rdf index 703082acb81..f36508ef0f1 100644 --- a/doap.rdf +++ b/doap.rdf @@ -55,6 +55,11 @@ + + Apache Thrift + 2024-09-02 + 0.21.0 + Apache Thrift 2024-02-04 From 449442e4d213e0682cc24e1626bd1e4b9f0b2fd8 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 3 Sep 2024 01:54:39 +0200 Subject: [PATCH 126/430] added ticket data for 0.21.0 to CHANGES.md --- CHANGES.md | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index bc2fed4750e..f8c91cef521 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,87 @@ - # Apache Thrift Changelog +## 0.21.0 + +### Build Process + +- [THRIFT-5815](https://issues.apache.org/jira/browse/THRIFT-5815) - veralign.sh broken and incomplete +- [THRIFT-5810](https://issues.apache.org/jira/browse/THRIFT-5810) - Wrong installation path for static MSVC libs. +- [THRIFT-5755](https://issues.apache.org/jira/browse/THRIFT-5755) - Docker image build fail + +### C++ + +- [THRIFT-5773](https://issues.apache.org/jira/browse/THRIFT-5773) - UUID wrapper for C++ +- [THRIFT-5772](https://issues.apache.org/jira/browse/THRIFT-5772) - Add UUID support for C++ +- [THRIFT-5682](https://issues.apache.org/jira/browse/THRIFT-5682) - UB in generated C++ code stops compiling with C++20" +- [THRIFT-5678](https://issues.apache.org/jira/browse/THRIFT-5678) - TConnectedClient: warning due to non-virtual dtor +- [THRIFT-5492](https://issues.apache.org/jira/browse/THRIFT-5492) - Bogus END_OF_FILE exception +- [THRIFT-5272](https://issues.apache.org/jira/browse/THRIFT-5272) - printTo does not properly handle i8 datatypes + +### Compiler (General) + +- [THRIFT-5800](https://issues.apache.org/jira/browse/THRIFT-5800) - "Could not find include file foo.thrift" probably should be failure instead of warning +- [THRIFT-5766](https://issues.apache.org/jira/browse/THRIFT-5766) - Replace std::endl with "\n" + +### Delphi + +- [THRIFT-5789](https://issues.apache.org/jira/browse/THRIFT-5789) - Refactor test suite client implementation +- [THRIFT-5782](https://issues.apache.org/jira/browse/THRIFT-5782) - implement full deprecation support +- [THRIFT-5750](https://issues.apache.org/jira/browse/THRIFT-5750) - Remove "ansistr_binary_" option +- [THRIFT-5788](https://issues.apache.org/jira/browse/THRIFT-5788) - Refactor and streamline hash set implementation +- [THRIFT-5765](https://issues.apache.org/jira/browse/THRIFT-5765) - Extra override for WriteBinary() to avoid unnecessary memory allocations when using COM types +- [THRIFT-5764](https://issues.apache.org/jira/browse/THRIFT-5764) - Extra CTOR for TThriftBytesImpl + +### Go + +- [THRIFT-5786](https://issues.apache.org/jira/browse/THRIFT-5786) - Full deprecation support for go +- [THRIFT-5654](https://issues.apache.org/jira/browse/THRIFT-5654) - LNK4042 and LNK2019 in go_validator_generator.cc +- [THRIFT-5784](https://issues.apache.org/jira/browse/THRIFT-5784) - go: Add THeaderTransforms to TConfiguration + +### Java + +- [THRIFT-5762](https://issues.apache.org/jira/browse/THRIFT-5762) - Expose service result objects in Java +- [THRIFT-5530](https://issues.apache.org/jira/browse/THRIFT-5530) - could not resolve plugin artifact 'com.github.johnrengelman.shadow:com.github.johnrengelman.shadow.gradle.plugin:4.0.4' +- [THRIFT-5230](https://issues.apache.org/jira/browse/THRIFT-5230) - Fix connection leak and CancelledKeyException when handling Epoll bug +- [THRIFT-4847](https://issues.apache.org/jira/browse/THRIFT-4847) - CancelledKeyException causes TThreadedSelectorServer to fail. + +### JSON + +- [THRIFT-5761](https://issues.apache.org/jira/browse/THRIFT-5761) - Lib/json tests fail + +### netstd + +- [THRIFT-5798](https://issues.apache.org/jira/browse/THRIFT-5798) - Expand netstd compile tests to fully cover all current target environments +- [THRIFT-5797](https://issues.apache.org/jira/browse/THRIFT-5797) - HashSet() CTOR takes no argument for net < 5 +- [THRIFT-5796](https://issues.apache.org/jira/browse/THRIFT-5796) - Indicate target environment via #if check +- [THRIFT-5795](https://issues.apache.org/jira/browse/THRIFT-5795) - namespace not properly escaped +- [THRIFT-5794](https://issues.apache.org/jira/browse/THRIFT-5794) - Uncompilable C# code in 0.20.0 +- [THRIFT-5781](https://issues.apache.org/jira/browse/THRIFT-5781) - implement full deprecation support +- [THRIFT-5780](https://issues.apache.org/jira/browse/THRIFT-5780) - Prevent certain warnings related to net8 +- [THRIFT-5787](https://issues.apache.org/jira/browse/THRIFT-5787) - .NET ApacheThrift client v20.0 breaks compatibility in TBinaryProtocol.Factory constructor +- [THRIFT-5783](https://issues.apache.org/jira/browse/THRIFT-5783) - drop net7 support + +### Node.js + +- [THRIFT-5769](https://issues.apache.org/jira/browse/THRIFT-5769) - Large messages crash Node.js client when using TFramedTransport + +### PHP + +- [THRIFT-5760](https://issues.apache.org/jira/browse/THRIFT-5760) - Update minimal version of php +- [THRIFT-5758](https://issues.apache.org/jira/browse/THRIFT-5758) - PHP 8.2 Deprecate dynamic properties +- [THRIFT-5756](https://issues.apache.org/jira/browse/THRIFT-5756) - Run php tests in github actions + +### Python + +- [THRIFT-4181](https://issues.apache.org/jira/browse/THRIFT-4181) - PEP 484 Type Hinting on generated code +- [THRIFT-5813](https://issues.apache.org/jira/browse/THRIFT-5813) - Clarify TSocket state after isOpen +- [THRIFT-5777](https://issues.apache.org/jira/browse/THRIFT-5777) - timeout exception mismatched +- [THRIFT-5139](https://issues.apache.org/jira/browse/THRIFT-5139) - Type hinting for Python library + +### Rust + +- [THRIFT-5812](https://issues.apache.org/jira/browse/THRIFT-5812) - Capacity overflow in Rust server + + ## 0.20.0 ### Known Open Issues (Blocker or Critical) From ed5c5a41726c27873df197ac57a0a987ba4bb14e Mon Sep 17 00:00:00 2001 From: Carel Combrink Date: Tue, 3 Sep 2024 22:01:48 +0200 Subject: [PATCH 127/430] THRIFT-5816 Fix UUID for boost 1.86.0 (change in {{data}} member usage) client: cpp Patch: Carel Combrink This closes #3035 --- lib/c_glib/test/testthrifttestclient.cpp | 4 ++-- lib/c_glib/test/testthrifttestzlibclient.cpp | 4 ++-- lib/cpp/src/thrift/TUuid.cpp | 2 +- lib/cpp/src/thrift/TUuid.h | 2 +- lib/cpp/test/TUuidTest.cpp | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/c_glib/test/testthrifttestclient.cpp b/lib/c_glib/test/testthrifttestclient.cpp index 77cd24a8f22..513f0712b52 100644 --- a/lib/c_glib/test/testthrifttestclient.cpp +++ b/lib/c_glib/test/testthrifttestclient.cpp @@ -112,8 +112,8 @@ class TestHandler : public ThriftTestIf { out = thing; } - std::string testUuid(const std::string thing) override { - cout << "[C -> C++] testUuid(\"" << std::hex << thing << "\")" << '\n'; + apache::thrift::TUuid testUuid(const apache::thrift::TUuid thing) override { + cout << "[C -> C++] testUuid(\"" << thing << "\")" << '\n'; return thing; } diff --git a/lib/c_glib/test/testthrifttestzlibclient.cpp b/lib/c_glib/test/testthrifttestzlibclient.cpp index 7c0f24a5ed0..dbcd64e76a6 100644 --- a/lib/c_glib/test/testthrifttestzlibclient.cpp +++ b/lib/c_glib/test/testthrifttestzlibclient.cpp @@ -107,8 +107,8 @@ class TestHandler : public ThriftTestIf { out = thing; } - std::string testUuid(const std::string thing) override { - cout << "[C -> C++] testUuid(\"" << std::hex << thing << "\")" << '\n'; + apache::thrift::TUuid testUuid(const apache::thrift::TUuid thing) override { + cout << "[C -> C++] testUuid(\"" << thing << "\")" << '\n'; return thing; } diff --git a/lib/cpp/src/thrift/TUuid.cpp b/lib/cpp/src/thrift/TUuid.cpp index a0c45f9de6f..062b286d8b5 100644 --- a/lib/cpp/src/thrift/TUuid.cpp +++ b/lib/cpp/src/thrift/TUuid.cpp @@ -37,7 +37,7 @@ TUuid::TUuid(const std::string& str) noexcept { } try { - const boost::uuids::uuid uuid{gen(str)}; + const boost::uuids::uuid uuid = gen(str); std::copy(uuid.begin(), uuid.end(), this->begin()); } catch (const std::runtime_error&) { // Invalid string most probably diff --git a/lib/cpp/src/thrift/TUuid.h b/lib/cpp/src/thrift/TUuid.h index aa69c673dce..405772aedc5 100644 --- a/lib/cpp/src/thrift/TUuid.h +++ b/lib/cpp/src/thrift/TUuid.h @@ -90,7 +90,7 @@ class TUuid { #endif // THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT TUuid(const boost::uuids::uuid& buuid) noexcept { - std::copy(std::begin(buuid.data), std::end(buuid.data), std::begin(this->data_)); + std::copy(buuid.begin(), buuid.end(), std::begin(this->data_)); } #endif // THRIFT_TUUID_SUPPORT_BOOST_UUID diff --git a/lib/cpp/test/TUuidTest.cpp b/lib/cpp/test/TUuidTest.cpp index 4a521cf50f9..d2a661581c6 100644 --- a/lib/cpp/test/TUuidTest.cpp +++ b/lib/cpp/test/TUuidTest.cpp @@ -122,7 +122,7 @@ BOOST_AUTO_TEST_CASE(into_boost_uuid) { BOOST_AUTO_TEST_CASE(from_boost_uuid) { static boost::uuids::string_generator gen; - boost::uuids::uuid boost_uuid{gen("1f610073-db33-4d21-adf2-75460d4955cc")}; + boost::uuids::uuid boost_uuid = gen("1f610073-db33-4d21-adf2-75460d4955cc"); BOOST_TEST(!boost_uuid.is_nil()); TUuid uuid; BOOST_TEST(uuid.is_nil()); @@ -175,7 +175,7 @@ BOOST_AUTO_TEST_CASE(test_character_buffer) { BOOST_AUTO_TEST_CASE(test_boost_buffer) { static boost::uuids::string_generator gen; - boost::uuids::uuid boost_uuid{gen("1f610073-db33-4d21-adf2-75460d4955cc")}; + boost::uuids::uuid boost_uuid = gen("1f610073-db33-4d21-adf2-75460d4955cc"); BOOST_TEST(!boost_uuid.is_nil()); const TUuid uuid{boost_uuid.data}; From 3867d6832e271adcd3111c3068efc9c11cb9cf63 Mon Sep 17 00:00:00 2001 From: Carel Combrink Date: Tue, 3 Sep 2024 22:01:48 +0200 Subject: [PATCH 128/430] THRIFT-5816 Fix UUID for boost 1.86.0 (change in {{data}} member usage) client: cpp Patch: Carel Combrink This closes #3035 --- lib/c_glib/test/testthrifttestclient.cpp | 4 ++-- lib/c_glib/test/testthrifttestzlibclient.cpp | 4 ++-- lib/cpp/src/thrift/TUuid.cpp | 2 +- lib/cpp/src/thrift/TUuid.h | 2 +- lib/cpp/test/TUuidTest.cpp | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/c_glib/test/testthrifttestclient.cpp b/lib/c_glib/test/testthrifttestclient.cpp index 77cd24a8f22..513f0712b52 100644 --- a/lib/c_glib/test/testthrifttestclient.cpp +++ b/lib/c_glib/test/testthrifttestclient.cpp @@ -112,8 +112,8 @@ class TestHandler : public ThriftTestIf { out = thing; } - std::string testUuid(const std::string thing) override { - cout << "[C -> C++] testUuid(\"" << std::hex << thing << "\")" << '\n'; + apache::thrift::TUuid testUuid(const apache::thrift::TUuid thing) override { + cout << "[C -> C++] testUuid(\"" << thing << "\")" << '\n'; return thing; } diff --git a/lib/c_glib/test/testthrifttestzlibclient.cpp b/lib/c_glib/test/testthrifttestzlibclient.cpp index 7c0f24a5ed0..dbcd64e76a6 100644 --- a/lib/c_glib/test/testthrifttestzlibclient.cpp +++ b/lib/c_glib/test/testthrifttestzlibclient.cpp @@ -107,8 +107,8 @@ class TestHandler : public ThriftTestIf { out = thing; } - std::string testUuid(const std::string thing) override { - cout << "[C -> C++] testUuid(\"" << std::hex << thing << "\")" << '\n'; + apache::thrift::TUuid testUuid(const apache::thrift::TUuid thing) override { + cout << "[C -> C++] testUuid(\"" << thing << "\")" << '\n'; return thing; } diff --git a/lib/cpp/src/thrift/TUuid.cpp b/lib/cpp/src/thrift/TUuid.cpp index a0c45f9de6f..062b286d8b5 100644 --- a/lib/cpp/src/thrift/TUuid.cpp +++ b/lib/cpp/src/thrift/TUuid.cpp @@ -37,7 +37,7 @@ TUuid::TUuid(const std::string& str) noexcept { } try { - const boost::uuids::uuid uuid{gen(str)}; + const boost::uuids::uuid uuid = gen(str); std::copy(uuid.begin(), uuid.end(), this->begin()); } catch (const std::runtime_error&) { // Invalid string most probably diff --git a/lib/cpp/src/thrift/TUuid.h b/lib/cpp/src/thrift/TUuid.h index aa69c673dce..405772aedc5 100644 --- a/lib/cpp/src/thrift/TUuid.h +++ b/lib/cpp/src/thrift/TUuid.h @@ -90,7 +90,7 @@ class TUuid { #endif // THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT TUuid(const boost::uuids::uuid& buuid) noexcept { - std::copy(std::begin(buuid.data), std::end(buuid.data), std::begin(this->data_)); + std::copy(buuid.begin(), buuid.end(), std::begin(this->data_)); } #endif // THRIFT_TUUID_SUPPORT_BOOST_UUID diff --git a/lib/cpp/test/TUuidTest.cpp b/lib/cpp/test/TUuidTest.cpp index 4a521cf50f9..d2a661581c6 100644 --- a/lib/cpp/test/TUuidTest.cpp +++ b/lib/cpp/test/TUuidTest.cpp @@ -122,7 +122,7 @@ BOOST_AUTO_TEST_CASE(into_boost_uuid) { BOOST_AUTO_TEST_CASE(from_boost_uuid) { static boost::uuids::string_generator gen; - boost::uuids::uuid boost_uuid{gen("1f610073-db33-4d21-adf2-75460d4955cc")}; + boost::uuids::uuid boost_uuid = gen("1f610073-db33-4d21-adf2-75460d4955cc"); BOOST_TEST(!boost_uuid.is_nil()); TUuid uuid; BOOST_TEST(uuid.is_nil()); @@ -175,7 +175,7 @@ BOOST_AUTO_TEST_CASE(test_character_buffer) { BOOST_AUTO_TEST_CASE(test_boost_buffer) { static boost::uuids::string_generator gen; - boost::uuids::uuid boost_uuid{gen("1f610073-db33-4d21-adf2-75460d4955cc")}; + boost::uuids::uuid boost_uuid = gen("1f610073-db33-4d21-adf2-75460d4955cc"); BOOST_TEST(!boost_uuid.is_nil()); const TUuid uuid{boost_uuid.data}; From 7df39f16b7f7e7271ebbc1d21856eac17512c7ca Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 4 Sep 2024 22:15:24 +0200 Subject: [PATCH 129/430] updated CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index f8c91cef521..d500ccfb23a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -16,6 +16,7 @@ - [THRIFT-5678](https://issues.apache.org/jira/browse/THRIFT-5678) - TConnectedClient: warning due to non-virtual dtor - [THRIFT-5492](https://issues.apache.org/jira/browse/THRIFT-5492) - Bogus END_OF_FILE exception - [THRIFT-5272](https://issues.apache.org/jira/browse/THRIFT-5272) - printTo does not properly handle i8 datatypes +- [THRIFT-5816](https://issues.apache.org/jira/browse/THRIFT-5816) - Fix UUID for boost 1.86.0 (change in data member usage) ### Compiler (General) From be216b1b83f51b1ed00f6c62b8e12ce3a3b3c974 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2024 18:13:51 -0400 Subject: [PATCH 130/430] Bump com.ncorti.ktfmt.gradle from 0.19.0 to 0.20.1 in /lib/kotlin (#3031) * Bump com.ncorti.ktfmt.gradle from 0.19.0 to 0.20.1 in /lib/kotlin Bumps com.ncorti.ktfmt.gradle from 0.19.0 to 0.20.1. --- updated-dependencies: - dependency-name: com.ncorti.ktfmt.gradle dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Fix formatting --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Christopher Tubbs --- .../org/apache/thrift/test/TestClient.kt | 62 +++++++++++-------- .../org/apache/thrift/test/TestHandler.kt | 8 ++- .../org/apache/thrift/test/TestServer.kt | 42 ++++++++----- lib/kotlin/settings.gradle.kts | 2 +- .../kotlin/org/apache/thrift/MetaDataTest.kt | 7 +-- 5 files changed, 69 insertions(+), 52 deletions(-) diff --git a/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt b/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt index a9241da5c53..5178b55afed 100644 --- a/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt +++ b/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt @@ -66,14 +66,14 @@ enum class ProtocolType(val key: String) { Json("json"), MultiJson("multij"), Compact("compact"), - MultiCompact("multic") + MultiCompact("multic"), } enum class TransportType(val key: String) { Buffered("buffered"), Framed("framed"), FastFramed("fastframed"), - Http("http") + Http("http"), } class TestClient : CliktCommand() { @@ -114,7 +114,8 @@ class TestClient : CliktCommand() { TransportType.Framed -> TNonblockingSocket(host, port, socketTimeout) else -> throw UnsupportedOperationException( - "only frame transport type is supported for now, got $transportType") + "only frame transport type is supported for now, got $transportType" + ) } private val clientManager = TAsyncClientManager() @@ -272,7 +273,8 @@ class TestClient : CliktCommand() { if (xtructs != null) { for ((string_thing, byte_thing, i32_thing, i64_thing) in xtructs) { print( - "{\"$string_thing\", $byte_thing, $i32_thing, $i64_thing}, ") + "{\"$string_thing\", $byte_thing, $i32_thing, $i64_thing}, " + ) } } print("}") @@ -284,13 +286,15 @@ class TestClient : CliktCommand() { if (whoa.size == 2 && whoa.containsKey(1L) && whoa.containsKey(2L)) { val firstMap = whoa[1L]!! val secondMap = whoa[2L]!! - if (firstMap.size == 2 && - firstMap.containsKey(Numberz.TWO) && - firstMap.containsKey(Numberz.THREE) && - secondMap.size == 1 && - secondMap.containsKey(Numberz.SIX) && - insane == firstMap[Numberz.TWO] && - insane == firstMap[Numberz.THREE]) { + if ( + firstMap.size == 2 && + firstMap.containsKey(Numberz.TWO) && + firstMap.containsKey(Numberz.THREE) && + secondMap.size == 1 && + secondMap.containsKey(Numberz.SIX) && + insane == firstMap[Numberz.TWO] && + insane == firstMap[Numberz.THREE] + ) { val six = secondMap[Numberz.SIX]!! // Cannot use "new Insanity().equals(six)" because as of now, // struct/container @@ -361,9 +365,11 @@ class TestClient : CliktCommand() { private suspend fun multiplexTest(returnCode: Int): Int { var code = returnCode - if (protocolType == ProtocolType.Multi || - protocolType == ProtocolType.MultiJson || - protocolType == ProtocolType.MultiCompact) { + if ( + protocolType == ProtocolType.Multi || + protocolType == ProtocolType.MultiJson || + protocolType == ProtocolType.MultiCompact + ) { val secondClient: SecondServiceClient = createSecondServiceClient() print("secondtestString(\"Test2\")") val s = secondClient.secondtestString("Test2") @@ -432,7 +438,7 @@ class TestClient : CliktCommand() { private suspend fun exceptionTest( testClient: ThriftTestClient, - returnCode: Int + returnCode: Int, ): Pair { var client = testClient var code = returnCode @@ -467,7 +473,7 @@ class TestClient : CliktCommand() { private suspend fun multiExceptionTest( testClient: ThriftTestClient, - returnCode: Int + returnCode: Int, ): Pair { var client = testClient var code = returnCode @@ -523,7 +529,8 @@ private suspend fun ThriftTestClient.structTest(returnCode: Int): Pair, arg4: Numberz, - arg5: Long + arg5: Long, ): Xtruct { logger.info("testMulti()\n") val hello = Xtruct() diff --git a/lib/kotlin/cross-test-server/src/main/kotlin/org/apache/thrift/test/TestServer.kt b/lib/kotlin/cross-test-server/src/main/kotlin/org/apache/thrift/test/TestServer.kt index e79420b669e..706083faf0e 100644 --- a/lib/kotlin/cross-test-server/src/main/kotlin/org/apache/thrift/test/TestServer.kt +++ b/lib/kotlin/cross-test-server/src/main/kotlin/org/apache/thrift/test/TestServer.kt @@ -84,7 +84,8 @@ object TestServer { } } catch (e: Exception) { throw RuntimeException( - "The context is not a wrapper and does not implement the interface") + "The context is not a wrapper and does not implement the interface" + ) } } @@ -98,7 +99,8 @@ object TestServer { override fun preServe() { println( - "TServerEventHandler.preServe - called only once before server starts accepting connections") + "TServerEventHandler.preServe - called only once before server starts accepting connections" + ) } override fun createContext(input: TProtocol, output: TProtocol): ServerContext { @@ -108,32 +110,35 @@ object TestServer { println( "TServerEventHandler.createContext - connection #" + ctx.connectionId + - " established") + " established" + ) return ctx } override fun deleteContext( serverContext: ServerContext, input: TProtocol, - output: TProtocol + output: TProtocol, ) { val ctx = serverContext.unwrap(TestServerContext::class.java) println( "TServerEventHandler.deleteContext - connection #" + ctx.connectionId + - " terminated") + " terminated" + ) } override fun processContext( serverContext: ServerContext, inputTransport: TTransport, - outputTransport: TTransport + outputTransport: TTransport, ) { val ctx = serverContext.unwrap(TestServerContext::class.java) println( "TServerEventHandler.processContext - connection #" + ctx.connectionId + - " is ready to process next request") + " is ready to process next request" + ) } } } @@ -142,7 +147,7 @@ enum class ServerType(val key: String) { Simple("simple"), ThreadPool("thread-pool"), NonBlocking("nonblocking"), - ThreadedSelector("threaded-selector") + ThreadedSelector("threaded-selector"), } enum class ProtocolType(val key: String) { @@ -151,14 +156,14 @@ enum class ProtocolType(val key: String) { Json("json"), MultiJson("multij"), Compact("compact"), - MultiCompact("multic") + MultiCompact("multic"), } enum class TransportType(val key: String) { Buffered("buffered"), FastFramed("fastframed"), Framed("framed"), - Zlib("zlib") + Zlib("zlib"), } class TestServerCommand : CliktCommand() { @@ -193,12 +198,14 @@ class TestServerCommand : CliktCommand() { protocolType, getProtocolFactory(), getTransportFactory(), - useSSL) + useSSL, + ) // Set server event handler serverEngine.setServerEventHandler(TestServer.TestServerEventHandler()) // Run it println( - "Starting the ${if (useSSL) "ssl server" else "server"} [$protocolType/$transportType/$serverType] on port $port") + "Starting the ${if (useSSL) "ssl server" else "server"} [$protocolType/$transportType/$serverType] on port $port" + ) serverEngine.serve() } @@ -241,7 +248,7 @@ private fun getServerEngine( protocolType: ProtocolType, tProtocolFactory: TProtocolFactory, tTransportFactory: TTransportFactory, - ssl: Boolean + ssl: Boolean, ): TServer { val isMulti = protocolType == ProtocolType.Multi || @@ -261,7 +268,8 @@ private fun getServerEngine( ServerType.NonBlocking -> { val tNonblockingServerArgs = TNonblockingServer.Args(tNonblockingServerSocket) tNonblockingServerArgs.processor( - if (isMulti) multiplexedProcessor else testProcessor) + if (isMulti) multiplexedProcessor else testProcessor + ) tNonblockingServerArgs.protocolFactory(tProtocolFactory) tNonblockingServerArgs.transportFactory(tTransportFactory) return TNonblockingServer(tNonblockingServerArgs) @@ -270,7 +278,8 @@ private fun getServerEngine( val tThreadedSelectorServerArgs = TThreadedSelectorServer.Args(tNonblockingServerSocket) tThreadedSelectorServerArgs.processor( - if (isMulti) multiplexedProcessor else testProcessor) + if (isMulti) multiplexedProcessor else testProcessor + ) tThreadedSelectorServerArgs.protocolFactory(tProtocolFactory) tThreadedSelectorServerArgs.transportFactory(tTransportFactory) return TThreadedSelectorServer(tThreadedSelectorServerArgs) @@ -297,7 +306,8 @@ private fun getServerEngine( else -> { val tThreadPoolServerArgs = TThreadPoolServer.Args(tServerSocket) tThreadPoolServerArgs.processor( - if (isMulti) multiplexedProcessor else testProcessor) + if (isMulti) multiplexedProcessor else testProcessor + ) tThreadPoolServerArgs.protocolFactory(tProtocolFactory) tThreadPoolServerArgs.transportFactory(tTransportFactory) return TThreadPoolServer(tThreadPoolServerArgs) diff --git a/lib/kotlin/settings.gradle.kts b/lib/kotlin/settings.gradle.kts index ccb54e766aa..97fab34e835 100644 --- a/lib/kotlin/settings.gradle.kts +++ b/lib/kotlin/settings.gradle.kts @@ -19,7 +19,7 @@ pluginManagement { plugins { kotlin("jvm") version "2.0.20" - id("com.ncorti.ktfmt.gradle") version "0.19.0" + id("com.ncorti.ktfmt.gradle") version "0.20.1" } } diff --git a/lib/kotlin/src/test/kotlin/org/apache/thrift/MetaDataTest.kt b/lib/kotlin/src/test/kotlin/org/apache/thrift/MetaDataTest.kt index 16dc71e579e..7780aa410b0 100644 --- a/lib/kotlin/src/test/kotlin/org/apache/thrift/MetaDataTest.kt +++ b/lib/kotlin/src/test/kotlin/org/apache/thrift/MetaDataTest.kt @@ -31,11 +31,6 @@ internal class MetaDataTest { assertEquals(3, personMetadata.size) val idField = personMetadata[Person._Fields.ID]!! assertEquals("id", idField.fieldName) - assertEquals( - mapOf( - "max" to "100000", - "min" to "1", - ), - idField.fieldAnnotations) + assertEquals(mapOf("max" to "100000", "min" to "1"), idField.fieldAnnotations) } } From e8cfb1331f91fece921ad20cd3bda8abdaaa6343 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sat, 7 Sep 2024 12:51:04 +0200 Subject: [PATCH 131/430] Updated CHANGES.md --- CHANGES.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index d500ccfb23a..26f474e7b6b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,12 +10,13 @@ ### C++ -- [THRIFT-5773](https://issues.apache.org/jira/browse/THRIFT-5773) - UUID wrapper for C++ -- [THRIFT-5772](https://issues.apache.org/jira/browse/THRIFT-5772) - Add UUID support for C++ -- [THRIFT-5682](https://issues.apache.org/jira/browse/THRIFT-5682) - UB in generated C++ code stops compiling with C++20" -- [THRIFT-5678](https://issues.apache.org/jira/browse/THRIFT-5678) - TConnectedClient: warning due to non-virtual dtor -- [THRIFT-5492](https://issues.apache.org/jira/browse/THRIFT-5492) - Bogus END_OF_FILE exception - [THRIFT-5272](https://issues.apache.org/jira/browse/THRIFT-5272) - printTo does not properly handle i8 datatypes +- [THRIFT-5492](https://issues.apache.org/jira/browse/THRIFT-5492) - Bogus END_OF_FILE exception +- [THRIFT-5678](https://issues.apache.org/jira/browse/THRIFT-5678) - TConnectedClient: warning due to non-virtual dtor +- [THRIFT-5682](https://issues.apache.org/jira/browse/THRIFT-5682) - UB in generated C++ code stops compiling with C++20" +- [THRIFT-5709](https://issues.apache.org/jira/browse/THRIFT-5709) - Drastically improve `to_num()` performace +- [THRIFT-5772](https://issues.apache.org/jira/browse/THRIFT-5772) - Add UUID support for C++ +- [THRIFT-5773](https://issues.apache.org/jira/browse/THRIFT-5773) - UUID wrapper for C++ - [THRIFT-5816](https://issues.apache.org/jira/browse/THRIFT-5816) - Fix UUID for boost 1.86.0 (change in data member usage) ### Compiler (General) From a32990df27c16de47425ba64e01fc7eeb71d2385 Mon Sep 17 00:00:00 2001 From: Xuanwo Date: Wed, 21 Aug 2024 03:19:19 +0200 Subject: [PATCH 132/430] ci(rust): Add release workflow for rust, Update release_rust.yml This closes #3027 Signed-off-by: Xuanwo --- .github/workflows/release_rust.yml | 48 ++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 .github/workflows/release_rust.yml diff --git a/.github/workflows/release_rust.yml b/.github/workflows/release_rust.yml new file mode 100644 index 00000000000..04d4e33fdbf --- /dev/null +++ b/.github/workflows/release_rust.yml @@ -0,0 +1,48 @@ +# +# 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. +# + +name: Release Rust Packages + +on: + push: + tags: + - "*" + pull_request: + branches: + - master + paths: + - ".github/workflows/release_rust.yml" + workflow_dispatch: + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Dryrun + working-directory: lib/rs + run: cargo publish --dry-run + + - name: Publish + working-directory: lib/rs + # Only publish if it's a tag and the tag is not a pre-release + if: ${{ startsWith(github.ref, 'refs/tags/') && !contains(github.ref, '-') }} + run: cargo publish + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} From 1a31d9051d35b732a5fce258955ef95f576694ba Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sun, 15 Sep 2024 14:35:34 +0200 Subject: [PATCH 133/430] FIX: No rule to make target 'Tests/Thrift.Compile.Tests/Properties/AssemblyInfo.cs', needed by 'distdir-am'. --- lib/netstd/Makefile.am | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/netstd/Makefile.am b/lib/netstd/Makefile.am index bad1d6962a7..e7142b00569 100644 --- a/lib/netstd/Makefile.am +++ b/lib/netstd/Makefile.am @@ -57,10 +57,9 @@ EXTRA_DIST = \ Tests/Thrift.Compile.Tests \ Tests/Thrift.Compile.Tests/CassandraTest.thrift \ Tests/Thrift.Compile.Tests/optional_required_default.thrift \ - Tests/Thrift.Compile.Tests/Properties/AssemblyInfo.cs \ - Tests/Thrift.Compile.Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj \ - Tests/Thrift.Compile.Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj \ - Tests/Thrift.Compile.Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj \ + Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj \ + Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj \ + Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj \ Tests/Thrift.Tests/Collections \ Tests/Thrift.Tests/DataModel \ Tests/Thrift.Tests/Protocols \ From 8922f17d591613dcdafade06467ad439cda262fd Mon Sep 17 00:00:00 2001 From: Christopher Tubbs Date: Tue, 17 Sep 2024 20:42:24 -0400 Subject: [PATCH 134/430] Remove some gradle deprecation warnings (#3039) These are trivial changes for the java/kotlin libraries. * Specify JUnit platform explicitly * Remove unused system property (build.test) from unit test environment that relied on a deprecated task property (destinationDir) * Replace kotlinOptions.jvmTarget with compilerOptions replacement * Update README to avoid incorrect specification of gradle 8.0, when other gradle 8 versions are acceptable --- lib/java/README.md | 2 +- lib/java/gradle/environment.gradle | 1 + lib/java/gradle/unitTests.gradle | 1 - lib/kotlin/build.gradle.kts | 4 +++- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/java/README.md b/lib/java/README.md index c65f97ca4f9..8881da66e58 100644 --- a/lib/java/README.md +++ b/lib/java/README.md @@ -42,7 +42,7 @@ The Thrift Java source is not build using the GNU tools, but rather uses the Gradle build system, which tends to be predominant amongst Java developers. -Currently we use gradle 8.0 to build the Thrift Java source. The usual way to setup gradle +Currently we use gradle 8 to build the Thrift Java source. The usual way to setup gradle project is to include the gradle-wrapper.jar in the project and then run the gradle wrapper to bootstrap setting up gradle binaries. However to avoid putting binary files into the source tree we have ignored the gradle wrapper files. You are expected to install it manually, as described in diff --git a/lib/java/gradle/environment.gradle b/lib/java/gradle/environment.gradle index 977c07ef348..7e05b87e011 100644 --- a/lib/java/gradle/environment.gradle +++ b/lib/java/gradle/environment.gradle @@ -69,5 +69,6 @@ dependencies { testImplementation "org.junit.jupiter:junit-jupiter:${junitVersion}" testImplementation "org.mockito:mockito-core:${mockitoVersion}" + testRuntimeOnly "org.junit.platform:junit-platform-launcher" testRuntimeOnly "org.slf4j:slf4j-log4j12:${slf4jVersion}" } diff --git a/lib/java/gradle/unitTests.gradle b/lib/java/gradle/unitTests.gradle index 4f06fcfcdbf..6f63956235b 100644 --- a/lib/java/gradle/unitTests.gradle +++ b/lib/java/gradle/unitTests.gradle @@ -79,7 +79,6 @@ test { maxHeapSize = '512m' systemProperties = [ - 'build.test': "${compileTestJava.destinationDir}", 'test.port': "${testPort}", 'javax.net.ssl.trustStore': "${projectDir}/src/crossTest/resources/.truststore", 'javax.net.ssl.trustStorePassword': 'thrift', diff --git a/lib/kotlin/build.gradle.kts b/lib/kotlin/build.gradle.kts index 6b1c7c98618..3f8b653ca5a 100644 --- a/lib/kotlin/build.gradle.kts +++ b/lib/kotlin/build.gradle.kts @@ -41,7 +41,9 @@ kotlin { } tasks.withType { - kotlinOptions.jvmTarget = "1.8" + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8 + } } tasks { From de7e6ad681c357e5812e369d9b89d572f24689c3 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sun, 22 Sep 2024 19:03:04 +0200 Subject: [PATCH 135/430] Improved nuget package spec info --- lib/netstd/Thrift/Thrift.csproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/netstd/Thrift/Thrift.csproj b/lib/netstd/Thrift/Thrift.csproj index 4bee3dfc048..8c2e6b91968 100644 --- a/lib/netstd/Thrift/Thrift.csproj +++ b/lib/netstd/Thrift/Thrift.csproj @@ -51,6 +51,9 @@ Apache Thrift RPC https://github.com/apache/thrift/blob/0.22.0/CHANGES.md + https://thrift.apache.org/ + https://github.com/apache/thrift + git README.md Copyright 2024 The Apache Software Foundation From 90af876c67be3973064c44eb967b0d7169c9987f Mon Sep 17 00:00:00 2001 From: John Troy Date: Mon, 16 Sep 2024 09:33:40 -0400 Subject: [PATCH 136/430] THRIFT-5818: Add AIX support Client: go Splits recvfrom() into AIX and non-AIX variants because AIX's non-blocking flag doesn't match other platforms. --- lib/go/thrift/socket_aix_syscall.go | 29 +++++++++++++++++++++++++ lib/go/thrift/socket_non_aix_syscall.go | 29 +++++++++++++++++++++++++ lib/go/thrift/socket_unix_conn.go | 2 +- 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 lib/go/thrift/socket_aix_syscall.go create mode 100644 lib/go/thrift/socket_non_aix_syscall.go diff --git a/lib/go/thrift/socket_aix_syscall.go b/lib/go/thrift/socket_aix_syscall.go new file mode 100644 index 00000000000..2253f753188 --- /dev/null +++ b/lib/go/thrift/socket_aix_syscall.go @@ -0,0 +1,29 @@ +//go:build aix +// +build aix + +/* + * 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. + */ + +package thrift + +import "syscall" + +func peekNonblocking(fd int, p []byte) (int, syscall.Sockaddr, error) { + return syscall.Recvfrom(fd, p, syscall.MSG_PEEK|syscall.MSG_NONBLOCK) +} diff --git a/lib/go/thrift/socket_non_aix_syscall.go b/lib/go/thrift/socket_non_aix_syscall.go new file mode 100644 index 00000000000..523f356dba3 --- /dev/null +++ b/lib/go/thrift/socket_non_aix_syscall.go @@ -0,0 +1,29 @@ +//go:build !aix && !windows && !wasm +// +build !aix,!windows,!wasm + +/* + * 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. + */ + +package thrift + +import "syscall" + +func peekNonblocking(fd int, p []byte) (int, syscall.Sockaddr, error) { + return syscall.Recvfrom(fd, p, syscall.MSG_PEEK|syscall.MSG_DONTWAIT) +} diff --git a/lib/go/thrift/socket_unix_conn.go b/lib/go/thrift/socket_unix_conn.go index ac0dce9e8d2..c06e0e1f6ec 100644 --- a/lib/go/thrift/socket_unix_conn.go +++ b/lib/go/thrift/socket_unix_conn.go @@ -58,7 +58,7 @@ func (sc *socketConn) checkConn() error { var n int if readErr := rc.Read(func(fd uintptr) bool { - n, _, err = syscall.Recvfrom(int(fd), sc.buffer[:], syscall.MSG_PEEK|syscall.MSG_DONTWAIT) + n, _, err = peekNonblocking(int(fd), sc.buffer[:]) return true }); readErr != nil { return readErr From b0a6ec7ede854df5b414784264feb5598f52baca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 03:40:20 -0400 Subject: [PATCH 137/430] Bump com.bmuschko:gradle-clover-plugin from 3.0.3 to 3.0.7 in /lib/java (#3048) Bumps [com.bmuschko:gradle-clover-plugin](https://github.com/bmuschko/gradle-clover-plugin) from 3.0.3 to 3.0.7. - [Release notes](https://github.com/bmuschko/gradle-clover-plugin/releases) - [Changelog](https://github.com/bmuschko/gradle-clover-plugin/blob/master/RELEASE_NOTES.md) - [Commits](https://github.com/bmuschko/gradle-clover-plugin/compare/3.0.3...3.0.7) --- updated-dependencies: - dependency-name: com.bmuschko:gradle-clover-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- lib/java/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/java/build.gradle b/lib/java/build.gradle index 0acb8a83166..e09a7e832b3 100644 --- a/lib/java/build.gradle +++ b/lib/java/build.gradle @@ -31,7 +31,7 @@ buildscript { } dependencies { - classpath 'com.bmuschko:gradle-clover-plugin:3.0.3' + classpath 'com.bmuschko:gradle-clover-plugin:3.0.7' } } From bf570821c497678234ea631addca88784c15c8ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 03:44:07 -0400 Subject: [PATCH 138/430] Bump org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 in /lib/kotlin (#3046) Bumps [org.jetbrains.kotlinx:kotlinx-coroutines-jdk8](https://github.com/Kotlin/kotlinx.coroutines) from 1.8.1 to 1.9.0. - [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases) - [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md) - [Commits](https://github.com/Kotlin/kotlinx.coroutines/compare/1.8.1...1.9.0) --- updated-dependencies: - dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- lib/kotlin/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/kotlin/build.gradle.kts b/lib/kotlin/build.gradle.kts index 3f8b653ca5a..df4a2c13184 100644 --- a/lib/kotlin/build.gradle.kts +++ b/lib/kotlin/build.gradle.kts @@ -29,7 +29,7 @@ repositories { dependencies { implementation(platform("org.jetbrains.kotlin:kotlin-bom")) implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.8.1") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.9.0") implementation("org.apache.thrift:libthrift:INCLUDED") testImplementation(kotlin("test")) } From c368c3afccef1e4a6bc408d564e2d996a808e47a Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 10 Oct 2024 23:11:05 +0200 Subject: [PATCH 139/430] THRIFT-5822 Remove deprecated AnsiString functions from the library Client: Delphi Patch: Jens Geyer --- lib/delphi/src/Thrift.Protocol.pas | 61 ------------------------------ 1 file changed, 61 deletions(-) diff --git a/lib/delphi/src/Thrift.Protocol.pas b/lib/delphi/src/Thrift.Protocol.pas index 7cfc2ae651b..c09728311a8 100644 --- a/lib/delphi/src/Thrift.Protocol.pas +++ b/lib/delphi/src/Thrift.Protocol.pas @@ -232,7 +232,6 @@ TProtocolRecursionTrackerImpl = class abstract( TInterfacedObject, IProtocolRe procedure WriteI64( const i64: Int64); procedure WriteDouble( const d: Double); procedure WriteString( const s: string ); - procedure WriteAnsiString( const s: AnsiString); deprecated 'AnsiString routines are deprecated, see THRIFT-5750'; procedure WriteBinary( const b: TBytes); overload; procedure WriteBinary( const b: IThriftBytes); overload; procedure WriteUuid( const uuid: TGuid); @@ -259,7 +258,6 @@ TProtocolRecursionTrackerImpl = class abstract( TInterfacedObject, IProtocolRe function ReadBinaryCOM : IThriftBytes; function ReadUuid: TGuid; function ReadString: string; - function ReadAnsiString: AnsiString; deprecated 'AnsiString routines are deprecated, see THRIFT-5750'; function NextRecursionLevel : IProtocolRecursionTracker; procedure IncrementRecursionDepth; @@ -342,13 +340,6 @@ TProtocolImpl = class abstract( TInterfacedObject, IProtocol) property Transport: ITransport read GetTransport; - private - // THRIFT-5750 unit visible, but no longer protected - awaiting final removal - // - Note that you can implement whavetever you want in your derived class, but no longer inherit - // - The function can still be called via IProtocol until final removal - function ReadAnsiString: AnsiString; virtual; //deprecated; - procedure WriteAnsiString( const s: AnsiString); virtual; //deprecated; - public constructor Create( const aTransport : ITransport); virtual; end; @@ -538,15 +529,6 @@ TProtocolDecorator = class( TProtocolImpl) function ReadBinary: TBytes; override; function ReadUuid: TGuid; override; function ReadString: string; override; - - private - // THRIFT-5750 unit visible, but no longer protected - awaiting final removal - // - Note that you can implement whavetever you want in your derived class, but no longer inherit - // - The function can still be called via IProtocol until final removal - {$WARN SYMBOL_DEPRECATED OFF} - function ReadAnsiString: AnsiString; override; deprecated; - procedure WriteAnsiString( const s: AnsiString); override; deprecated; - {$WARN SYMBOL_DEPRECATED DEFAULT} end; @@ -701,38 +683,11 @@ procedure TProtocolImpl.Reset; FTrans.ResetConsumedMessageSize; end; -function TProtocolImpl.ReadAnsiString: AnsiString; -var - b : TBytes; - len : Integer; -begin - Result := ''; - b := ReadBinary; - len := Length( b ); - if len > 0 then begin - SetLength( Result, len); - System.Move( b[0], Pointer(Result)^, len ); - end; -end; - function TProtocolImpl.ReadString: string; begin Result := TEncoding.UTF8.GetString( ReadBinary ); end; -procedure TProtocolImpl.WriteAnsiString(const s: AnsiString); -var - b : TBytes; - len : Integer; -begin - len := Length(s); - SetLength( b, len); - if len > 0 then begin - System.Move( Pointer(s)^, b[0], len ); - end; - WriteBinary( b ); -end; - procedure TProtocolImpl.WriteString(const s: string); var b : TBytes; @@ -1530,14 +1485,6 @@ procedure TProtocolDecorator.WriteString( const s: string ); end; -procedure TProtocolDecorator.WriteAnsiString( const s: AnsiString); -begin - {$WARN SYMBOL_DEPRECATED OFF} - FWrappedProtocol.WriteAnsiString( s); - {$WARN SYMBOL_DEPRECATED DEFAULT} -end; - - procedure TProtocolDecorator.WriteBinary( const b: TBytes); begin FWrappedProtocol.WriteBinary( b); @@ -1682,14 +1629,6 @@ function TProtocolDecorator.ReadString: string; end; -function TProtocolDecorator.ReadAnsiString: AnsiString; -begin - {$WARN SYMBOL_DEPRECATED OFF} - result := FWrappedProtocol.ReadAnsiString; - {$WARN SYMBOL_DEPRECATED DEFAULT} -end; - - function TProtocolDecorator.GetMinSerializedSize( const aType : TType) : Integer; begin result := FWrappedProtocol.GetMinSerializedSize(aType); From eae0536c83a166bfdac0016a8b964777b16796da Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sun, 13 Oct 2024 01:46:47 +0200 Subject: [PATCH 140/430] fix a whole bunch of TAB indents --- compiler/cpp/src/thrift/generate/t_cl_generator.cc | 2 +- compiler/cpp/src/thrift/generate/t_cpp_generator.cc | 6 +++--- compiler/cpp/src/thrift/generate/t_haxe_generator.cc | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_cl_generator.cc b/compiler/cpp/src/thrift/generate/t_cl_generator.cc index dccecdc53f7..409af1dd174 100644 --- a/compiler/cpp/src/thrift/generate/t_cl_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_cl_generator.cc @@ -60,7 +60,7 @@ class t_cl_generator : public t_oop_generator { if(iter->first.compare("no_asd") == 0) { no_asd = true; } else if (iter->first.compare("sys_pref") == 0) { - system_prefix = iter->second; + system_prefix = iter->second; } else { throw "unknown option cl:" + iter->first; } diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc index 69842689296..13d27a1b18c 100644 --- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc @@ -1430,9 +1430,9 @@ void t_cpp_generator::generate_struct_definition(ostream& out, if (!pointers) { - // 'force_cpp_out' always goes into the .cpp file, and never into a .tcc - // file in case templates are involved. Since the constructor is not templated, - // putting it into the (later included) .tcc file would cause ODR violations. + // 'force_cpp_out' always goes into the .cpp file, and never into a .tcc + // file in case templates are involved. Since the constructor is not templated, + // putting it into the (later included) .tcc file would cause ODR violations. generate_default_constructor(force_cpp_out, tstruct, false); } diff --git a/compiler/cpp/src/thrift/generate/t_haxe_generator.cc b/compiler/cpp/src/thrift/generate/t_haxe_generator.cc index 40d4ce2e027..94f7f541d72 100644 --- a/compiler/cpp/src/thrift/generate/t_haxe_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_haxe_generator.cc @@ -97,16 +97,16 @@ class t_haxe_generator : public t_oop_generator { t_const_value* value); void render_struct_initializer(std::ostream& out, - t_struct* type, + t_struct* type, t_const_value* value); void render_map_initializer(std::ostream& out, - t_map* type, + t_map* type, t_const_value* value); void render_list_initializer(std::ostream& out, - t_list* type, + t_list* type, t_const_value* value); void render_set_initializer(std::ostream& out, - t_set* type, + t_set* type, t_const_value* value); // helper From a4d458fdf3668acb6823d42d97dcba62b48bd6af Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 10 Oct 2024 23:03:57 +0200 Subject: [PATCH 141/430] THRIFT-5824 Migrate, refactor and improve Delphi code generation test script Client: Delphi Patch: Jens Geyer --- .gitignore | 1 - lib/delphi/test/codegen/README.md | 33 +-- .../codegen/run-Pascal-Codegen-Tests.bat.tmpl | 177 ------------ .../test/codegen/run-Pascal-Codegen-Tests.ps1 | 252 ++++++++++++++++++ 4 files changed, 262 insertions(+), 201 deletions(-) delete mode 100644 lib/delphi/test/codegen/run-Pascal-Codegen-Tests.bat.tmpl create mode 100644 lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 diff --git a/.gitignore b/.gitignore index e7f06a77214..6a0495bdaa9 100644 --- a/.gitignore +++ b/.gitignore @@ -211,7 +211,6 @@ project.lock.json /lib/delphi/**/*.local /lib/delphi/**/*.dcu /lib/delphi/**/*.2007 -/lib/delphi/**/codegen/*.bat /lib/erl/.eunit /lib/erl/.generated /lib/erl/.rebar/ diff --git a/lib/delphi/test/codegen/README.md b/lib/delphi/test/codegen/README.md index a0145890f2e..65fbe4e510d 100644 --- a/lib/delphi/test/codegen/README.md +++ b/lib/delphi/test/codegen/README.md @@ -1,28 +1,15 @@ -How to use the test case: +Prerequisites ---------------------------------------------- -- copy and the template batch file -- open the batch file and adjust configuration as necessary -- run the batch - +- a suitable dcc32.exe must be reachable via normal search path +- the Thrift compiler thrift.exe is searched in this order + - under the `compiler` subdir, where debug is preferred over release + - otherwise via normal search path -Configuration: +How to use the test case: ---------------------------------------------- -SVNWORKDIR -should point to the Thrift working copy root - -MY_THRIFT_FILES -can be set to point to a folder with more thrift IDL files. -If you don't have any such files, just leave the setting blank. +- run the POSH script +- if any error messages occur, that's a bad sign +- there may be known but unfixed issues, these are listed accordingly -BIN -Local MSYS binary folder. Your THRIFT.EXE is installed here. -MINGW_BIN -Local MinGW bin folder. Contains DLL files required by THRIFT.EXE - -DCC -Identifies the Delphi Command Line compiler (dcc32.exe) -To be configuired only, if the default is not suitable. - ----------------------------------------------- -*EOF* \ No newline at end of file +*EOF* diff --git a/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.bat.tmpl b/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.bat.tmpl deleted file mode 100644 index 79cf0e3396a..00000000000 --- a/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.bat.tmpl +++ /dev/null @@ -1,177 +0,0 @@ -REM /* -REM * Licensed to the Apache Software Foundation (ASF) under one -REM * or more contributor license agreements. See the NOTICE file -REM * distributed with this work for additional information -REM * regarding copyright ownership. The ASF licenses this file -REM * to you under the Apache License, Version 2.0 (the -REM * "License"); you may not use this file except in compliance -REM * with the License. You may obtain a copy of the License at -REM * -REM * http://www.apache.org/licenses/LICENSE-2.0 -REM * -REM * Unless required by applicable law or agreed to in writing, -REM * software distributed under the License is distributed on an -REM * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -REM * KIND, either express or implied. See the License for the -REM * specific language governing permissions and limitations -REM * under the License. -REM */ -@echo off -if ""=="%1" goto CONFIG -goto HANDLEDIR - -REM ----------------------------------------------------- -:CONFIG -REM ----------------------------------------------------- - -rem * CONFIGURATION BEGIN -rem * configuration settings, adjust as necessary to meet your system setup -set SVNWORKDIR= -set MY_THRIFT_FILES= -set BIN=C:\MSys10\local\bin -set MINGW_BIN=C:\MinGW\bin -set DCC= -set SUBDIR=gen-delphi -rem * CONFIGURATION END - - -REM ----------------------------------------------------- -:START -REM ----------------------------------------------------- - -rem * configured? -if "%SVNWORKDIR%"=="" goto CONFIG_ERROR - -rem * try to find dcc32.exe -echo Looking for dcc32.exe ... -if not exist "%DCC%" set DCC=%ProgramFiles%\Embarcadero\RAD Studio\8.0\bin\dcc32.exe -if not exist "%DCC%" set DCC=%ProgramFiles(x86)%\Embarcadero\RAD Studio\8.0\bin\dcc32.exe -if not exist "%DCC%" goto CONFIG_ERROR -echo Found %DCC% -echo. - -rem * some helpers -set PATH=%BIN%;%MINGW_BIN%;%PATH% -set TARGET=%SVNWORKDIR%\..\thrift-testing -set SOURCE=%SVNWORKDIR% -set TESTAPP=TestProject -set UNITSEARCH=%SOURCE%\lib\pas\src;%SOURCE%\lib\delphi\src -set OUTDCU="%TARGET%\dcu" -set LOGFILE=%TARGET%\%SUBDIR%\codegen.log - -rem * create and/or empty target dirs -if not exist "%TARGET%" md "%TARGET%" -if not exist "%TARGET%\%SUBDIR%" md "%TARGET%\%SUBDIR%" -if not exist "%OUTDCU%" md "%OUTDCU%" -if exist "%TARGET%\*.thrift" del "%TARGET%\*.thrift" /Q -if exist "%TARGET%\%SUBDIR%\*.*" del "%TARGET%\%SUBDIR%\*.*" /Q -if exist "%OUTDCU%\*.*" del "%OUTDCU%\*.*" /Q - -rem init logfile -echo Errors > "%LOGFILE%" -echo ---------------- >> "%LOGFILE%" - -rem * recurse through thrift WC and "my thrift files" folder -rem * copies all .thrift files into thrift-testing -call %0 %SOURCE% -if not "%MY_THRIFT_FILES%"=="" call %0 %MY_THRIFT_FILES% - -rem * compile all thrift files, generate PAS and C++ code -echo. -echo Generating code, please wait ... -cd "%TARGET%" -for %%a in (*.thrift) do "%BIN%\thrift.exe" -v --gen delphi:register_types,constprefix,events,xmldoc "%%a" 2>> "%LOGFILE%" -REM * for %%a in (*.thrift) do "%BIN%\thrift.exe" -v --gen cpp "%%a" >> NUL: -cmd /c start notepad "%LOGFILE%" -cd .. - -rem * check for special Delphi testcases being processed -if not exist "%TARGET%\%SUBDIR%\ReservedKeywords.pas" goto TESTCASE_MISSING - - -rem * generate a minimal DPR file that uses all generated pascal units -cd "%TARGET%\%SUBDIR%\" -if exist inherited.* ren inherited.* _inherited.* -echo program %TESTAPP%; > %TESTAPP%.dpr -echo {$APPTYPE CONSOLE} >> %TESTAPP%.dpr -echo. >> %TESTAPP%.dpr -echo uses >> %TESTAPP%.dpr -for %%a in (*.pas) do echo %%~na, >> %TESTAPP%.dpr -echo Windows, Classes, SysUtils; >> %TESTAPP%.dpr -echo. >> %TESTAPP%.dpr -echo begin >> %TESTAPP%.dpr -echo Writeln('Successfully compiled!'); >> %TESTAPP%.dpr -echo Writeln('List of units:'); >> %TESTAPP%.dpr -for %%a in (*.pas) do echo Write('%%~na':30,'':10); >> %TESTAPP%.dpr -echo Writeln; >> %TESTAPP%.dpr -echo end. >> %TESTAPP%.dpr -echo. >> %TESTAPP%.dpr -cd ..\.. - -rem * try to compile the DPR -rem * this should not throw any errors, warnings or hints -"%DCC%" -B "%TARGET%\%SUBDIR%\%TESTAPP%" -U"%UNITSEARCH%" -I"%UNITSEARCH%" -N"%OUTDCU%" -E"%TARGET%\%SUBDIR%" -dir "%TARGET%\%SUBDIR%\%TESTAPP%.exe" -if not exist "%TARGET%\%SUBDIR%\%TESTAPP%.exe" goto CODEGEN_FAILED -echo. -echo ----------------------------------------------------------------- -echo The compiled program is now executed. If it hangs or crashes, we -echo have a serious problem with the generated code. Expected output -echo is "Successfully compiled:" followed by a list of generated units. -echo ----------------------------------------------------------------- -"%TARGET%\%SUBDIR%\%TESTAPP%.exe" -echo ----------------------------------------------------------------- -echo. -pause -GOTO EOF - -REM ----------------------------------------------------- -:DXE_NOT_FOUND -REM ----------------------------------------------------- -echo Delphi Compiler (dcc32.exe) not found. -echo Please check the "DCC" setting in this batch. -echo. -cmd /c start notepad README.MD -cmd /c start notepad %0 -pause -GOTO EOF - - -REM ----------------------------------------------------- -:CONFIG_ERROR -REM ----------------------------------------------------- -echo Missing, incomplete or wrong configuration settings! -cmd /c start notepad README.MD -cmd /c start notepad %0 -pause -GOTO EOF - - -REM ----------------------------------------------------- -:TESTCASE_MISSING -REM ----------------------------------------------------- -echo Missing an expected Delphi testcase! -pause -GOTO EOF - - -REM ----------------------------------------------------- -:CODEGEN_FAILED -REM ----------------------------------------------------- -echo Code generation FAILED! -pause -GOTO EOF - - -REM ----------------------------------------------------- -:HANDLEDIR -REM ----------------------------------------------------- -REM echo %1 -for /D %%a in (%1\*) do call %0 %%a -if exist "%1\*.thrift" copy /b "%1\*.thrift" "%TARGET%\*.*" -GOTO EOF - - -REM ----------------------------------------------------- -:EOF -REM ----------------------------------------------------- diff --git a/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 b/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 new file mode 100644 index 00000000000..66f0b2377e8 --- /dev/null +++ b/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 @@ -0,0 +1,252 @@ +# +# 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. +# + +#---- failing tests -------------------------------------------- + +# expected to fail at Thrift Compiler +$FAIL_THRIFT = @( + "BrokenConstants.thrift", # intended to break + "DuplicateImportsTest.thrift", # subdir includes don't work here + "Include.thrift") # subdir includes don't work here + +# expected to fail at Delphi Compiler +$FAIL_DELPHI = @() + +# unexpected but known bugs (TODO: fix them) +$KNOWN_BUGS = @( + "ConstantsDemo.thrift", + "ConstOptionalField.thrift", + "IgnoreInitialismsTest.thrift", + "JavaTypes.thrift", + "JavaDefinitionOrderB.thrift", + "JavaDeepCopyTest.thrift", + "NameConflictTest.thrift", + "Types.thrift", + "Thrift5320.thrift", + "Service.thrift") + + + +#---- functions -------------------------------------------- + +function FindThriftExe() { + # prefer debug over release over path + write-host -nonewline Looking for thrift.exe ... + $exe = "thrift.exe" + + # if we have a freshly compiled one it might be a better choice + @("Release","Debug") | foreach{ + if( test-path "$ROOTDIR\compiler\cpp\$_\thrift.exe") { $exe = "$ROOTDIR\compiler\cpp\$_\thrift.exe" } + if( test-path "$ROOTDIR\compiler\cpp\compiler\$_\thrift.exe") { $exe = "$ROOTDIR\compiler\cpp\$_\compiler\thrift.exe" } + } + + return $exe +} + + +function FindDcc32Exe() { + # prefer debug over release over path + write-host -nonewline Looking for dcc32.exe ... + $exe = "dcc32.exe" + + # TODO: add arbitraily complex code to locate a suitable dcc32.exe if it is not in the path + + return $exe +} + + +function InitializeFolder([string] $folder, [string] $pattern) { + #write-host $folder\$pattern + if(-not (test-path $folder)) { + new-item $folder -type directory | out-null + } + pushd $folder + remove-item $pattern #-recurse + popd +} + + +function CopyFilesFrom([string] $source, $text) { + #write-host "$source" + if( ($source -ne "") -and (test-path $source)) { + if( $text -ne $null) { + write-host -foregroundcolor yellow Copying $text ... + } + + pushd $source + # recurse dirs + gci . -directory | foreach { + CopyFilesFrom "$_" + } + # files within + gci *.thrift -file | foreach { + #write-host $_ + $name = $_.name + copy-item $_ "$TARGET\$name" + } + popd + } +} + +function TestIdlFile([string] $idl) { + # expected to fail at Thrift Compiler + $filter = $false + $FAIL_THRIFT | foreach { + if( $idl -eq $_) { + $filter = $true + write-host "Skipping $_" + } + } + if( $filter) { return $true } + + # compile IDL + #write-host -nonewline " $idl" + InitializeFolder "$TARGET\gen-delphi" "*.pas" + &$THRIFT_EXE $VERBOSE -r --gen delphi:register_types,constprefix,events,xmldoc $idl | out-file "$TARGET\thrift.log" + if( -not $?) { + get-content "$TARGET\thrift.log" | out-default + write-host -foregroundcolor red "Thrift compilation failed: $idl" + return $false + } + + # generate project dile + $units = gci "$TARGET\gen-delphi\*.pas" + $lines = @() + $lines += "program $TESTAPP;" + $lines += "{`$APPTYPE CONSOLE}" + $lines += "" + $lines += "uses" + $units | foreach { $name = $_.name.Replace(".pas",""); $lines += " $name," } + $lines += " Windows, Classes, SysUtils;" + $lines += "" + $lines += "begin" + $lines += " Writeln('Successfully compiled!');" + $lines += " Writeln('List of units:');" + $units | foreach { $name = $_.name.Replace(".pas",""); $lines += " Writeln('- $name');" } + $lines += " Writeln;" + $lines += "" + $lines += "end." + $lines += "" + $lines | set-content "$TARGET\gen-delphi\$TESTAPP.dpr" + + # try to compile the DPR + # this should not throw any errors, warnings or hints + $exe = "$TARGET\gen-delphi\$TESTAPP.exe" + if( test-path $exe) { remove-item $exe } + &$DCC32_EXE -B "$TARGET\gen-delphi\$TESTAPP" -U"$UNITSEARCH" -I"$UNITSEARCH" -N"$OUTDCU" -E"$TARGET\gen-delphi" | out-file "$TARGET\compile.log" + if( -not (test-path $exe)) { + + # expected to fail at Thrift Compiler + $filter = $false + $FAIL_DELPHI | foreach { + if( $idl -eq $_) { + $filter = $true + write-host ("Delphi compilation failed at "+$idl+" - as expected") + } + } + $KNOWN_BUGS | foreach { + if( $idl -eq $_) { + $filter = $true + write-host ("Delphi compilation failed at "+$idl+" - known issue (TODO)") + } + } + if( $filter) { return $true } + + get-content "$TARGET\compile.log" | out-default + write-host -foregroundcolor red "Delphi compilation failed: $idl" + return $false + } + + # The compiled program is now executed. If it hangs or crashes, we + # have a serious problem with the generated code. Expected output + # is "Successfully compiled:" followed by a list of generated units. + &"$exe" | out-file "$TARGET\exec.log" + if( -not $?) { + get-content "$TARGET\exec.log" | out-default + write-host -foregroundcolor red "Test execution failed: $idl" + return $false + } + return $true +} + +#---- main ------------------------------------------------- +# CONFIGURATION BEGIN +# configuration settings, adjust as necessary to meet your system setup +$MY_THRIFT_FILES = "" +$VERBOSE = "" # set any Thrift compiler debug/verbose flag you want + +# init +$ROOTDIR = $PSScriptRoot + "\..\..\..\.." + +# try to find thrift.exe +$THRIFT_EXE = FindThriftExe +&$THRIFT_EXE -version +if( -not $?) { + write-host -foregroundcolor red Missing thrift.exe + exit 1 +} + +# try to find dcc32.exe +$DCC32_EXE = FindDcc32Exe +&$DCC32_EXE --version +if( -not $?) { + write-host -foregroundcolor red Missing dcc32.exe + exit 1 +} + + +# some helpers +$TARGET = "$ROOTDIR\..\thrift-testing" +$TESTAPP = "TestProject" +$UNITSEARCH = "$ROOTDIR\lib\pas\src;$ROOTDIR\lib\delphi\src" +$OUTDCU = "$TARGET\dcu" + +# create and/or empty target dirs +InitializeFolder "$TARGET" "*.thrift" +InitializeFolder "$TARGET\gen-delphi" "*.pas" +InitializeFolder "$OUTDCU" "*.dcu" + +# recurse through thrift WC and "my thrift files" folder +# copies all .thrift files into thrift-testing +CopyFilesFrom "$ROOTDIR" "Thrift IDL files" +CopyFilesFrom "$MY_THRIFT_FILES" "Custom IDL files" + +# codegen and compile all thrift files, one by one to prevent side effects +$count = 0 +write-host -foregroundcolor yellow Running codegen tests .. +try { + pushd "$TARGET" + gci *.thrift -file | foreach { + $count += 1 + $ok = TestIdlFile $_.name + if( -not $ok) { + throw "TEST FAILED" # automated tests + popd; pause; pushd "$TARGET" # interactive / debug + } + } + write-host -foregroundcolor green "Success ($count tests executed)" + exit 0 +} catch { + write-host -foregroundcolor red $_ + exit 1 +} finally { + popd +} + +#eof From 8b6d29d3ee7fb1bece7be1eb728e2e88e867cc2b Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 11 Oct 2024 01:47:42 +0200 Subject: [PATCH 142/430] THRIFT-5823 Fix illegal uses of exceptions as normal struct type Patch: Jens Geyer This closes #1928 --- .../cpp/src/thrift/generate/t_generator.cc | 8 +++++++ compiler/cpp/src/thrift/parse/t_doc.h | 2 ++ compiler/cpp/src/thrift/parse/t_field.h | 2 +- compiler/cpp/src/thrift/parse/t_function.h | 16 ++++++++++++++ compiler/cpp/src/thrift/parse/t_list.h | 6 ++++++ compiler/cpp/src/thrift/parse/t_map.h | 9 ++++++++ compiler/cpp/src/thrift/parse/t_set.h | 6 ++++++ compiler/cpp/src/thrift/parse/t_struct.h | 21 +++++++++++++++++++ .../test/ClientMiddlewareExceptionTest.thrift | 4 ++-- lib/go/test/ForwardType.thrift | 3 ++- .../Thrift5320.exception.thrift | 7 +++++-- 11 files changed, 78 insertions(+), 6 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_generator.cc b/compiler/cpp/src/thrift/generate/t_generator.cc index 68602377ed5..217cf8ab9ec 100644 --- a/compiler/cpp/src/thrift/generate/t_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_generator.cc @@ -101,35 +101,43 @@ void t_generator::validate(const vector& list) const{ void t_generator::validate(t_function const* f) const { validate_id(f->get_name()); + f->validate(); validate(f->get_arglist()); validate(f->get_xceptions()); } void t_generator::validate(t_service const* s) const { validate_id(s->get_name()); + s->validate(); validate(s->get_functions()); } void t_generator::validate(t_enum const* en) const { validate_id(en->get_name()); + en->validate(); validate(en->get_constants()); } void t_generator::validate(t_struct const* s) const { validate_id(s->get_name()); + s->validate(); validate(s->get_members()); } void t_generator::validate(t_enum_value const* en_val) const { validate_id(en_val->get_name()); + en_val->validate(); } void t_generator::validate(t_typedef const* td) const { validate_id(td->get_name()); + td->validate(); } void t_generator::validate(t_const const* c) const { validate_id(c->get_name()); + c->validate(); } void t_generator::validate(t_field const* f) const { validate_id(f->get_name()); + f->validate(); } void t_generator::validate_id(const string& id) const { diff --git a/compiler/cpp/src/thrift/parse/t_doc.h b/compiler/cpp/src/thrift/parse/t_doc.h index 0df893eb263..4033bc78d68 100644 --- a/compiler/cpp/src/thrift/parse/t_doc.h +++ b/compiler/cpp/src/thrift/parse/t_doc.h @@ -47,6 +47,8 @@ class t_doc { bool has_doc() { return has_doc_; } + virtual void validate() const { ; } + private: std::string doc_; bool has_doc_; diff --git a/compiler/cpp/src/thrift/parse/t_field.h b/compiler/cpp/src/thrift/parse/t_field.h index 928fdcf93ef..3346722646a 100644 --- a/compiler/cpp/src/thrift/parse/t_field.h +++ b/compiler/cpp/src/thrift/parse/t_field.h @@ -41,7 +41,7 @@ class t_field : public t_doc { : type_(type), name_(name), key_(0), - req_(T_OPT_IN_REQ_OUT), + req_(T_OPT_IN_REQ_OUT), value_(nullptr), xsd_optional_(false), xsd_nillable_(false), diff --git a/compiler/cpp/src/thrift/parse/t_function.h b/compiler/cpp/src/thrift/parse/t_function.h index a3b6f48e3e2..57cf5ffce37 100644 --- a/compiler/cpp/src/thrift/parse/t_function.h +++ b/compiler/cpp/src/thrift/parse/t_function.h @@ -83,6 +83,22 @@ class t_function : public t_doc { std::map> annotations_; + void validate() const { + get_returntype()->validate(); + if (get_returntype()->get_true_type()->is_xception()) { + failure("method %s(): exception type \"%s\" cannot be used as function return", get_name().c_str(), get_returntype()->get_name().c_str()); + } + + std::vector::const_iterator it; + std::vector list = get_arglist()->get_members(); + for(it=list.begin(); it != list.end(); ++it) { + (*it)->get_type()->validate(); + if( (*it)->get_type()->get_true_type()->is_xception()) { + failure("method %s(): exception type \"%s\" cannot be used as function argument %s", get_name().c_str(), (*it)->get_type()->get_name().c_str(), (*it)->get_name().c_str()); + } + } + } + private: t_type* returntype_; std::string name_; diff --git a/compiler/cpp/src/thrift/parse/t_list.h b/compiler/cpp/src/thrift/parse/t_list.h index f0b896d0cb0..5daa412bdcf 100644 --- a/compiler/cpp/src/thrift/parse/t_list.h +++ b/compiler/cpp/src/thrift/parse/t_list.h @@ -34,6 +34,12 @@ class t_list : public t_container { bool is_list() const override { return true; } + void validate() const { + if( get_elem_type()->get_true_type()->is_xception()) { + failure("exception type \"%s\" cannot be used inside a list", get_elem_type()->get_name().c_str()); + } + } + private: t_type* elem_type_; }; diff --git a/compiler/cpp/src/thrift/parse/t_map.h b/compiler/cpp/src/thrift/parse/t_map.h index 9614e6849c6..444fca79800 100644 --- a/compiler/cpp/src/thrift/parse/t_map.h +++ b/compiler/cpp/src/thrift/parse/t_map.h @@ -37,6 +37,15 @@ class t_map : public t_container { bool is_map() const override { return true; } + void validate() const { + if( get_key_type()->get_true_type()->is_xception()) { + failure("exception type \"%s\" cannot be used inside a map", get_key_type()->get_name().c_str()); + } + if( get_val_type()->get_true_type()->is_xception()) { + failure("exception type \"%s\" cannot be used inside a map", get_val_type()->get_name().c_str()); + } + } + private: t_type* key_type_; t_type* val_type_; diff --git a/compiler/cpp/src/thrift/parse/t_set.h b/compiler/cpp/src/thrift/parse/t_set.h index c0d4a35c190..4a02dcc08ae 100644 --- a/compiler/cpp/src/thrift/parse/t_set.h +++ b/compiler/cpp/src/thrift/parse/t_set.h @@ -36,6 +36,12 @@ class t_set : public t_container { bool is_set() const override { return true; } + void validate() const { + if( get_elem_type()->get_true_type()->is_xception()) { + failure("exception type \"%s\" cannot be used inside a set", get_elem_type()->get_name().c_str()); + } + } + private: t_type* elem_type_; }; diff --git a/compiler/cpp/src/thrift/parse/t_struct.h b/compiler/cpp/src/thrift/parse/t_struct.h index d990eadd57d..941712d80ef 100644 --- a/compiler/cpp/src/thrift/parse/t_struct.h +++ b/compiler/cpp/src/thrift/parse/t_struct.h @@ -131,6 +131,27 @@ class t_struct : public t_type { return nullptr; } + void validate() const { + std::string what = "struct"; + if( is_union()) { + what = "union"; + } + if( is_xception()) { + what = "exception"; + } + + std::vector::const_iterator it; + std::vector list = get_members(); + for(it=list.begin(); it != list.end(); ++it) { + (*it)->get_type()->validate(); + if (!is_method_xcepts_) { // this is in fact the only legal usage for any exception type + if( (*it)->get_type()->get_true_type()->is_xception()) { + failure("%s %s: exception type \"%s\" cannot be used as member field type %s", what.c_str(), get_name().c_str(), (*it)->get_type()->get_name().c_str(), (*it)->get_name().c_str()); + } + } + } + } + private: members_type members_; members_type members_in_id_order_; diff --git a/lib/go/test/ClientMiddlewareExceptionTest.thrift b/lib/go/test/ClientMiddlewareExceptionTest.thrift index 647c4335939..b48a611fc0a 100644 --- a/lib/go/test/ClientMiddlewareExceptionTest.thrift +++ b/lib/go/test/ClientMiddlewareExceptionTest.thrift @@ -25,11 +25,11 @@ exception Exception2 { // This is a special case, we want to make sure that the middleware don't // accidentally pull result as error. -exception FooResponse { +struct/*exception*/ FooResponse { // returning an exception by any means other than "throws" is illegal } service ClientMiddlewareExceptionTest { - FooResponse foo() throws( + FooResponse foo() throws( // returning an exception by any means other than "throws" is illegal 1: Exception1 error1, 2: Exception2 error2, ) diff --git a/lib/go/test/ForwardType.thrift b/lib/go/test/ForwardType.thrift index 0433c97cfdc..9e3670ef610 100644 --- a/lib/go/test/ForwardType.thrift +++ b/lib/go/test/ForwardType.thrift @@ -25,6 +25,7 @@ struct Struct { 1: optional Exc foo } -exception Exc { +// FIX: Use of "exception" is illegal. An exception is not a normal struct type and cannot be used as such. +struct Exc { 1: optional i32 code } diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.exception.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.exception.thrift index 37421c0acac..d61a3001955 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.exception.thrift +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.exception.thrift @@ -24,7 +24,10 @@ namespace * Thrift5320.exceptions exception Task { - 1: Task left - 2: Task right + 1: ErrorData data // it would be illegal to use exception as struct type +} + +struct ErrorData { + 1: string messitsch } From a5d84e59297bb7c72e6ebe1a5b5df23762f1357f Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 17 Oct 2024 22:56:48 +0200 Subject: [PATCH 143/430] THRIFT-5825 UUID constants lead to uncompileable Delphi code Client: Delphi Patch: Jens Geyer --- .../src/thrift/generate/t_delphi_generator.cc | 47 ++++++++++++------- .../test/codegen/run-Pascal-Codegen-Tests.ps1 | 19 ++++---- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc index 2a428dc1cb1..e6f6579518b 100644 --- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc @@ -216,7 +216,8 @@ class t_delphi_generator : public t_oop_generator { std::ostream& out, std::string name, t_type* type, - t_const_value* value); + t_const_value* value, + bool guidAsLiteral); void print_const_def_value(std::ostream& vars, std::ostream& out, std::string name, @@ -422,8 +423,8 @@ class t_delphi_generator : public t_oop_generator { }; // reserved variables and types (lowercase!) - const std::string DELPHI_RESERVED_NAMES[8] = { - "result", "system", "sysutils", "tbytes", "tclass", "thrift", "tinterfacedobject", "tobject" + const std::string DELPHI_RESERVED_NAMES[10] = { + "result", "system", "sysutils", "types", "tbytes", "tclass", "thrift", "tinterfacedobject", "tobject", "ttask" }; // reserved method names (lowercase!) @@ -687,8 +688,9 @@ void t_delphi_generator::init_generator() { unitname = include->get_name(); nsname = include->get_namespace("delphi"); if ("" != nsname) { - unitname = normalize_name(nsname,false,false,true/*force underscore*/); + unitname = nsname; } + unitname = normalize_name(unitname,false,false,true/*force underscore*/); add_delphi_uses_list(unitname); } @@ -1182,7 +1184,7 @@ void t_delphi_generator::print_const_def_value(std::ostream& vars, if (field_type == nullptr) { throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string(); } - string val = render_const_value(vars, out, name, field_type, v_iter->second); + string val = render_const_value(vars, out, name, field_type, v_iter->second, false); indent_impl(out) << cls_prefix << normalize_name(name) << "." << prop_name(v_iter->first->get_string(), type->is_xception()) << " := " << val << ";" << '\n'; @@ -1193,8 +1195,8 @@ void t_delphi_generator::print_const_def_value(std::ostream& vars, const map& val = value->get_map(); map::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { - string key = render_const_value(vars, out, name, ktype, v_iter->first); - string val = render_const_value(vars, out, name, vtype, v_iter->second); + string key = render_const_value(vars, out, name, ktype, v_iter->first, false); + string val = render_const_value(vars, out, name, vtype, v_iter->second, false); indent_impl(out) << cls_prefix << normalize_name(name) << "[" << key << "]" << " := " << val << ";" << '\n'; } @@ -1209,7 +1211,7 @@ void t_delphi_generator::print_const_def_value(std::ostream& vars, const vector& val = value->get_list(); vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { - string val = render_const_value(vars, out, name, etype, *v_iter); + string val = render_const_value(vars, out, name, etype, *v_iter, false); indent_impl(out) << cls_prefix << normalize_name(name) << ".Add(" << val << ");" << '\n'; } } @@ -1228,7 +1230,13 @@ bool t_delphi_generator::const_needs_var(t_type* type) { while (truetype->is_typedef()) { truetype = ((t_typedef*)truetype)->get_type(); } - return (!truetype->is_base_type()); + + if(!truetype->is_base_type()) { + return true; + } + + t_base_type::t_base tbase = ((t_base_type*)truetype)->get_base(); + return (tbase == t_base_type::TYPE_UUID); } void t_delphi_generator::print_const_prop(std::ostream& out, @@ -1241,7 +1249,7 @@ void t_delphi_generator::print_const_prop(std::ostream& out, << '\n'; } else { std::ostringstream vars; // dummy - string v2 = render_const_value(vars, out, name, type, value); + string v2 = render_const_value(vars, out, name, type, value, true); indent(out) << "const " << name << " = " << v2 << ";" << '\n'; } } @@ -1257,9 +1265,11 @@ void t_delphi_generator::print_const_value(std::ostream& vars, } if (truetype->is_base_type()) { - // already done - // string v2 = render_const_value( vars, out, name, type, value); - // indent_impl(out) << name << " := " << v2 << ";" << '\n'; + t_base_type::t_base tbase = ((t_base_type*)truetype)->get_base(); + if(tbase == t_base_type::TYPE_UUID) { // already done otherwise + string v2 = render_const_value( vars, out, name, type, value, false); + indent_impl(out) << name << " := " << v2 << ";" << '\n'; + } } else if (truetype->is_enum()) { indent_impl(out) << name << " := " << type_name(type) << "." << value->get_identifier_name() << ";" << '\n'; @@ -1295,7 +1305,8 @@ string t_delphi_generator::render_const_value(ostream& vars, ostream& out, string name, t_type* type, - t_const_value* value) { + t_const_value* value, + bool guidAsLiteral) { (void)name; t_type* truetype = type; @@ -1312,7 +1323,11 @@ string t_delphi_generator::render_const_value(ostream& vars, render << "'" << get_escaped_string(value) << "'"; break; case t_base_type::TYPE_UUID: - render << "['{" << value->get_uuid() << "}']"; + if(guidAsLiteral) { + render << "['{" << value->get_uuid() << "}']"; + } else { + render << "StringToGUID('{" << value->get_uuid() << "}')"; + } break; case t_base_type::TYPE_BOOL: render << ((value->get_integer() > 0) ? "True" : "False"); @@ -3102,7 +3117,7 @@ string t_delphi_generator::type_name(t_type* ttype, string nm = normalize_clsnm(ttype->get_name(), type_prefix); if (b_exception_factory) { - nm = nm + "Factory"; + nm = normalize_clsnm(ttype->get_name(), type_prefix, true) + "Factory"; } if (b_cls) { diff --git a/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 b/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 index 66f0b2377e8..5cde19c702f 100644 --- a/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 +++ b/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 @@ -29,17 +29,14 @@ $FAIL_THRIFT = @( $FAIL_DELPHI = @() # unexpected but known bugs (TODO: fix them) -$KNOWN_BUGS = @( - "ConstantsDemo.thrift", - "ConstOptionalField.thrift", - "IgnoreInitialismsTest.thrift", - "JavaTypes.thrift", - "JavaDefinitionOrderB.thrift", - "JavaDeepCopyTest.thrift", - "NameConflictTest.thrift", - "Types.thrift", - "Thrift5320.thrift", - "Service.thrift") +$KNOWN_BUGS = @( "ConstOptionalField.thrift" + , "IgnoreInitialismsTest.thrift" + , "JavaTypes.thrift" + , "JavaDefinitionOrderB.thrift" + , "JavaDeepCopyTest.thrift" + , "NameConflictTest.thrift" + , "Thrift5320.thrift" # this conflicts with Delphi scopes, but it's a bad practice testcase anyway + ) From 665e931278d83bd8c6ff4ce6b01203d7bb452fe4 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sun, 20 Oct 2024 18:32:47 +0200 Subject: [PATCH 144/430] FIX: TException name conflict --- compiler/cpp/src/thrift/generate/t_delphi_generator.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc index e6f6579518b..dc85f6042ea 100644 --- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc @@ -423,8 +423,9 @@ class t_delphi_generator : public t_oop_generator { }; // reserved variables and types (lowercase!) - const std::string DELPHI_RESERVED_NAMES[10] = { - "result", "system", "sysutils", "types", "tbytes", "tclass", "thrift", "tinterfacedobject", "tobject", "ttask" + const std::string DELPHI_RESERVED_NAMES[11] = { + "result", "system", "sysutils", "types", "texception", "tbytes", "tclass", "thrift", "tinterfacedobject", + "tobject", "ttask" }; // reserved method names (lowercase!) From 0f0243e1f0d4a97ad1abf05fa516acf2952811ac Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sun, 20 Oct 2024 17:52:28 +0200 Subject: [PATCH 145/430] THRIFT-5826 binary constants create uncompilable Delphi code Client: Delphi Patch: Jens Geyer --- .../src/thrift/generate/t_delphi_generator.cc | 22 ++++++++++++++----- .../test/codegen/run-Pascal-Codegen-Tests.ps1 | 17 +++++++------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc index dc85f6042ea..b6b3b2864ea 100644 --- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc @@ -1237,7 +1237,14 @@ bool t_delphi_generator::const_needs_var(t_type* type) { } t_base_type::t_base tbase = ((t_base_type*)truetype)->get_base(); - return (tbase == t_base_type::TYPE_UUID); + switch (tbase) { + case t_base_type::TYPE_UUID: + return true; + case t_base_type::TYPE_STRING: + return truetype->is_binary(); + default: + return false; + } } void t_delphi_generator::print_const_prop(std::ostream& out, @@ -1266,10 +1273,9 @@ void t_delphi_generator::print_const_value(std::ostream& vars, } if (truetype->is_base_type()) { - t_base_type::t_base tbase = ((t_base_type*)truetype)->get_base(); - if(tbase == t_base_type::TYPE_UUID) { // already done otherwise - string v2 = render_const_value( vars, out, name, type, value, false); - indent_impl(out) << name << " := " << v2 << ";" << '\n'; + if(const_needs_var(type)) { + string the_value = render_const_value( vars, out, name, type, value, false); + indent_impl(out) << name << " := " << the_value << ";" << '\n'; } } else if (truetype->is_enum()) { indent_impl(out) << name << " := " << type_name(type) << "." << value->get_identifier_name() @@ -1321,7 +1327,11 @@ string t_delphi_generator::render_const_value(ostream& vars, t_base_type::t_base tbase = ((t_base_type*)truetype)->get_base(); switch (tbase) { case t_base_type::TYPE_STRING: - render << "'" << get_escaped_string(value) << "'"; + if (truetype->is_binary()) { + render << "TEncoding.UTF8.GetBytes('" << get_escaped_string(value) << "')"; + } else { + render << "'" << get_escaped_string(value) << "'"; + } break; case t_base_type::TYPE_UUID: if(guidAsLiteral) { diff --git a/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 b/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 index 5cde19c702f..961795b075a 100644 --- a/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 +++ b/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 @@ -26,17 +26,16 @@ $FAIL_THRIFT = @( "Include.thrift") # subdir includes don't work here # expected to fail at Delphi Compiler -$FAIL_DELPHI = @() +$FAIL_DELPHI = @( + "Thrift5320.thrift" # this conflicts with Delphi scopes, but it's a bad practice testcase anyway +) # unexpected but known bugs (TODO: fix them) -$KNOWN_BUGS = @( "ConstOptionalField.thrift" - , "IgnoreInitialismsTest.thrift" - , "JavaTypes.thrift" - , "JavaDefinitionOrderB.thrift" - , "JavaDeepCopyTest.thrift" - , "NameConflictTest.thrift" - , "Thrift5320.thrift" # this conflicts with Delphi scopes, but it's a bad practice testcase anyway - ) +$KNOWN_BUGS = @( + "IgnoreInitialismsTest.thrift", + "JavaDefinitionOrderB.thrift", + "NameConflictTest.thrift" + ) From 7ec41775f2f244741c7c1ef1236a96d71648c498 Mon Sep 17 00:00:00 2001 From: Susanne Lindgren Date: Tue, 8 Oct 2024 08:12:27 +0200 Subject: [PATCH 146/430] Make ssl work with python 3.12 In python 3.12, ssl.match_hostname has been removed. ssl.PROTOCOL_SSSLV23 has been deprecated since python 3.6. --- lib/py/src/transport/TSSLSocket.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/py/src/transport/TSSLSocket.py b/lib/py/src/transport/TSSLSocket.py index 536d2f37a4e..d3263c6c77a 100644 --- a/lib/py/src/transport/TSSLSocket.py +++ b/lib/py/src/transport/TSSLSocket.py @@ -24,10 +24,12 @@ import sys import warnings -from .sslcompat import _match_hostname, _match_has_ipaddress +from .sslcompat import _match_has_ipaddress from thrift.transport import TSocket from thrift.transport.TTransport import TTransportException +_match_hostname = lambda cert, hostname: True + logger = logging.getLogger(__name__) warnings.filterwarnings( 'default', category=DeprecationWarning, module=__name__) @@ -45,7 +47,7 @@ class TSSLBase(object): # SSL 2.0 and 3.0 are disabled via ssl.OP_NO_SSLv2 and ssl.OP_NO_SSLv3. # For python < 2.7.9, use TLS 1.0 since TLSv1_X nor OP_NO_SSLvX is # unavailable. - _default_protocol = ssl.PROTOCOL_SSLv23 if _has_ssl_context else \ + _default_protocol = ssl.PROTOCOL_TLS_CLIENT if _has_ssl_context else \ ssl.PROTOCOL_TLSv1 def _init_context(self, ssl_version): From 61080c673f90429566b5c47d8324b80aba3c4da2 Mon Sep 17 00:00:00 2001 From: "James E. King III" Date: Fri, 4 Oct 2024 18:58:14 +0000 Subject: [PATCH 147/430] THRIFT-5821: support building against AWS-LC --- build/cmake/DefineOptions.cmake | 2 +- lib/cpp/src/thrift/transport/TSSLSocket.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build/cmake/DefineOptions.cmake b/build/cmake/DefineOptions.cmake index b59292cd3b9..b938d7c3542 100644 --- a/build/cmake/DefineOptions.cmake +++ b/build/cmake/DefineOptions.cmake @@ -87,7 +87,7 @@ CMAKE_DEPENDENT_OPTION(BUILD_C_GLIB "Build C (GLib) library" ON # OpenSSL if(WITH_CPP OR WITH_C_GLIB) - find_package(OpenSSL QUIET) + find_package(OpenSSL) CMAKE_DEPENDENT_OPTION(WITH_OPENSSL "Build with OpenSSL support" ON "OPENSSL_FOUND" OFF) endif() diff --git a/lib/cpp/src/thrift/transport/TSSLSocket.cpp b/lib/cpp/src/thrift/transport/TSSLSocket.cpp index 26ae2beda44..da8b027c6c3 100644 --- a/lib/cpp/src/thrift/transport/TSSLSocket.cpp +++ b/lib/cpp/src/thrift/transport/TSSLSocket.cpp @@ -152,10 +152,12 @@ void cleanupOpenSSL() { #if (OPENSSL_VERSION_NUMBER < OPENSSL_ENGINE_CLEANUP_REQUIRED_BEFORE) ENGINE_cleanup(); // https://www.openssl.org/docs/man1.1.0/crypto/ENGINE_cleanup.html - cleanup call is needed before 1.1.0 #endif +#if !defined(OPENSSL_IS_AWSLC) CONF_modules_unload(1); +#endif EVP_cleanup(); CRYPTO_cleanup_all_ex_data(); -#if OPENSSL_VERSION_NUMBER >= 0x10100000 +#if OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(OPENSSL_IS_AWSLC) // https://www.openssl.org/docs/man1.1.1/man3/OPENSSL_thread_stop.html OPENSSL_thread_stop(); #else @@ -393,7 +395,7 @@ void TSSLSocket::close() { SSL_free(ssl_); ssl_ = nullptr; handshakeCompleted_ = false; -#if OPENSSL_VERSION_NUMBER >= 0x10100000 +#if OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(OPENSSL_IS_AWSLC) // https://www.openssl.org/docs/man1.1.1/man3/OPENSSL_thread_stop.html OPENSSL_thread_stop(); #else From bddaaffb456d4797235d1e90c2cff0386349143a Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 25 Oct 2024 00:33:36 +0200 Subject: [PATCH 148/430] Removed superfluous method decls --- .../cpp/src/thrift/generate/t_delphi_generator.cc | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc index b6b3b2864ea..a8ac5061713 100644 --- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc @@ -114,7 +114,6 @@ class t_delphi_generator : public t_oop_generator { void generate_xception(t_struct* txception) override; void generate_service(t_service* tservice) override; void generate_property(ostream& out, t_field* tfield, bool isPublic, bool is_xception); - void generate_property_writer_(ostream& out, t_field* tfield, bool isPublic); void generate_delphi_property(ostream& out, bool struct_is_exception, @@ -252,10 +251,6 @@ class t_delphi_generator : public t_oop_generator { bool in_class = false, bool is_result = false, bool is_x_factory = false); - void generate_delphi_struct_reader(std::ostream& out, t_struct* tstruct); - void generate_delphi_struct_result_writer(std::ostream& out, t_struct* tstruct); - void generate_delphi_struct_writer(std::ostream& out, t_struct* tstruct); - void generate_delphi_struct_tostring(std::ostream& out, t_struct* tstruct); void generate_function_helpers(t_function* tfunction); void generate_service_interface(t_service* tservice); @@ -329,7 +324,6 @@ class t_delphi_generator : public t_oop_generator { std::ostream& local_vars); void delphi_type_usings(std::ostream& out); - std::string delphi_thrift_usings(); std::string type_name(t_type* ttype, bool b_cls = false, @@ -359,12 +353,6 @@ class t_delphi_generator : public t_oop_generator { std::string prop_name(std::string name, bool is_xception = false, std::string prefix = ""); std::string constructor_param_name(string name); - void write_enum(std::string line); - void write_forward_decr(std::string line); - void write_const(std::string line); - void write_struct(std::string line); - void write_service(std::string line); - std::string autogen_comment() override { return std::string("(**\n") + " * Autogenerated by Thrift Compiler (" + THRIFT_VERSION + ")\n" + " *\n" + " * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n" From 56c4b159f885bd931a27f1a8b78b12696638b17f Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 25 Oct 2024 00:33:11 +0200 Subject: [PATCH 149/430] THRIFT-5827 enums in typedefs are not resolved in all cases Client: Delphi Patch: Jens Geyer --- compiler/cpp/src/thrift/generate/t_delphi_generator.cc | 2 ++ lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc index a8ac5061713..670383281f7 100644 --- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc @@ -962,6 +962,8 @@ void t_delphi_generator::generate_enum(t_enum* tenum) { indent_down(); indent(s_enum) << ")" << render_deprecation_attribute(tenum->annotations_, " ", "") << ";" << '\n' << '\n'; indent_down(); + + add_defined_type(tenum); } std::string t_delphi_generator::make_pascal_string_literal(std::string value) { diff --git a/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 b/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 index 961795b075a..f02afba3625 100644 --- a/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 +++ b/lib/delphi/test/codegen/run-Pascal-Codegen-Tests.ps1 @@ -33,7 +33,6 @@ $FAIL_DELPHI = @( # unexpected but known bugs (TODO: fix them) $KNOWN_BUGS = @( "IgnoreInitialismsTest.thrift", - "JavaDefinitionOrderB.thrift", "NameConflictTest.thrift" ) From b2a706493e21851d33facf8f088614d2d1ff3cd7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:06:18 +0000 Subject: [PATCH 150/430] Bump elliptic from 6.5.4 to 6.6.0 in /lib/js Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.4 to 6.6.0. - [Commits](https://github.com/indutny/elliptic/compare/v6.5.4...v6.6.0) --- updated-dependencies: - dependency-name: elliptic dependency-type: indirect ... Signed-off-by: dependabot[bot] --- lib/js/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/js/package-lock.json b/lib/js/package-lock.json index ab908ac1d58..715cbde8775 100644 --- a/lib/js/package-lock.json +++ b/lib/js/package-lock.json @@ -1060,9 +1060,9 @@ } }, "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", + "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", "dev": true, "dependencies": { "bn.js": "^4.11.9", From 0b760d48ba7b9039c1db0ffbce1f47db9c5c1107 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 06:03:08 +0000 Subject: [PATCH 151/430] Bump jvm from 2.0.20 to 2.0.21 in /lib/kotlin Bumps [jvm](https://github.com/JetBrains/kotlin) from 2.0.20 to 2.0.21. - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.0.20...v2.0.21) --- updated-dependencies: - dependency-name: jvm dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lib/kotlin/settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/kotlin/settings.gradle.kts b/lib/kotlin/settings.gradle.kts index 97fab34e835..1141390503d 100644 --- a/lib/kotlin/settings.gradle.kts +++ b/lib/kotlin/settings.gradle.kts @@ -18,7 +18,7 @@ */ pluginManagement { plugins { - kotlin("jvm") version "2.0.20" + kotlin("jvm") version "2.0.21" id("com.ncorti.ktfmt.gradle") version "0.20.1" } } From 6669ca24a259146eda27e4de32e464920c66a732 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Oct 2024 18:02:58 +0000 Subject: [PATCH 152/430] Bump elliptic from 6.5.4 to 6.6.0 in /lib/ts Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.4 to 6.6.0. - [Commits](https://github.com/indutny/elliptic/compare/v6.5.4...v6.6.0) --- updated-dependencies: - dependency-name: elliptic dependency-type: indirect ... Signed-off-by: dependabot[bot] --- lib/ts/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ts/package-lock.json b/lib/ts/package-lock.json index a523ef42b9f..70052b4096f 100644 --- a/lib/ts/package-lock.json +++ b/lib/ts/package-lock.json @@ -1270,9 +1270,9 @@ } }, "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", + "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", "dev": true, "dependencies": { "bn.js": "^4.11.9", From 607cd54e1d68174a7e0351a4b2eafdeb375093d5 Mon Sep 17 00:00:00 2001 From: Huang Yang Date: Wed, 4 Sep 2024 11:11:18 +0800 Subject: [PATCH 153/430] update ax_boost_base.m4 from http://www.gnu.org/software/autoconf-archive/ for adding loongarch information --- aclocal/ax_boost_base.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aclocal/ax_boost_base.m4 b/aclocal/ax_boost_base.m4 index d5403957637..4065af0d760 100644 --- a/aclocal/ax_boost_base.m4 +++ b/aclocal/ax_boost_base.m4 @@ -113,7 +113,7 @@ AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[ dnl are found, e.g. when only header-only libraries are installed! AS_CASE([${host_cpu}], [x86_64],[libsubdirs="lib64 libx32 lib lib64"], - [ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64],[libsubdirs="lib64 lib lib64"], + [ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64|loongarch64],[libsubdirs="lib64 lib lib64"], [libsubdirs="lib"] ) From 8f9fba8a94b088ea274bd8c544ff997ffee74c9c Mon Sep 17 00:00:00 2001 From: Alexandre Detiste Date: Wed, 28 Aug 2024 14:28:39 +0200 Subject: [PATCH 154/430] remove dependency on Six --- .github/workflows/build.yml | 2 +- build/appveyor/MSVC-appveyor-full.bat | 1 - build/docker/ubuntu-focal/Dockerfile | 1 - build/docker/ubuntu-jammy/Dockerfile | 1 - contrib/Vagrantfile | 2 +- debian/control | 4 ++-- lib/nodejs/examples/httpServer.py | 2 +- lib/py/setup.py | 2 -- lib/py/src/TSCons.py | 1 - lib/py/src/protocol/TProtocol.py | 6 ++---- lib/py/src/server/THttpServer.py | 2 +- lib/py/src/server/TNonblockingServer.py | 2 +- lib/py/src/server/TServer.py | 2 +- lib/py/src/transport/THttpClient.py | 16 ++++++++-------- 14 files changed, 18 insertions(+), 26 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 63ad16d1951..5fadc274e8d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -483,7 +483,7 @@ jobs: - name: Python setup run: | - python -m pip install --upgrade pip setuptools wheel flake8 six tornado twisted zope.interface + python -m pip install --upgrade pip setuptools wheel flake8 tornado twisted zope.interface python --version pip --version diff --git a/build/appveyor/MSVC-appveyor-full.bat b/build/appveyor/MSVC-appveyor-full.bat index d0f03477183..dcdf8434963 100644 --- a/build/appveyor/MSVC-appveyor-full.bat +++ b/build/appveyor/MSVC-appveyor-full.bat @@ -131,7 +131,6 @@ call build-libevent.bat || EXIT /B pip.exe ^ install backports.ssl_match_hostname ^ ipaddress ^ - six ^ tornado ^ twisted || EXIT /B diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile index a29ec69531f..84bbee1beae 100644 --- a/build/docker/ubuntu-focal/Dockerfile +++ b/build/docker/ubuntu-focal/Dockerfile @@ -260,7 +260,6 @@ RUN apt-get install -y --no-install-recommends \ python3-all-dev \ python3-pip \ python3-setuptools \ - python3-six \ python3-tornado \ python3-twisted \ python3-wheel \ diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile index 5fa6e6f889d..0505bf5bde1 100644 --- a/build/docker/ubuntu-jammy/Dockerfile +++ b/build/docker/ubuntu-jammy/Dockerfile @@ -259,7 +259,6 @@ RUN apt-get install -y --no-install-recommends \ python3-all-dev \ python3-pip \ python3-setuptools \ - python3-six \ python3-tornado \ python3-twisted \ python3-wheel \ diff --git a/contrib/Vagrantfile b/contrib/Vagrantfile index d4a7b82c921..a5371dd82d0 100644 --- a/contrib/Vagrantfile +++ b/contrib/Vagrantfile @@ -46,7 +46,7 @@ sudo apt-get install -qq libboost-dev libboost-test-dev libboost-program-options sudo apt-get install -qq ant openjdk-8-jdk maven # Python dependencies -sudo apt-get install -qq python-all python-all-dev python-all-dbg python-setuptools python-support python-six python3-six +sudo apt-get install -qq python-all python-all-dev python-all-dbg python-setuptools python-support # Ruby dependencies sudo apt-get install -qq ruby ruby-dev diff --git a/debian/control b/debian/control index 1b41991c3ec..06c0d483416 100644 --- a/debian/control +++ b/debian/control @@ -32,7 +32,7 @@ Description: Compiler for Thrift definition files Package: python-thrift Architecture: any Section: python -Depends: ${python:Depends}, ${shlibs:Depends}, ${misc:Depends}, python-six +Depends: ${python:Depends}, ${shlibs:Depends}, ${misc:Depends} Recommends: python-twisted-web, python-backports.ssl-match-hostname, python-ipaddress Provides: ${python:Provides} Description: Python bindings for Thrift (Python 2) @@ -65,7 +65,7 @@ Description: Python bindings for Thrift (debug version) Package: python3-thrift Architecture: any Section: python -Depends: ${python3:Depends}, ${shlibs:Depends}, ${misc:Depends}, python3-six +Depends: ${python3:Depends}, ${shlibs:Depends}, ${misc:Depends} Recommends: python3-twisted-web Provides: ${python:Provides} Description: Python bindings for Thrift (Python 3) diff --git a/lib/nodejs/examples/httpServer.py b/lib/nodejs/examples/httpServer.py index 76e9f4aa3c8..bf3ef14a247 100644 --- a/lib/nodejs/examples/httpServer.py +++ b/lib/nodejs/examples/httpServer.py @@ -16,5 +16,5 @@ def hello_func(self): protoFactory = TJSONProtocol.TJSONProtocolFactory() port = 9090 server = THttpServer.THttpServer(processor, ("localhost", port), protoFactory) -print "Python server running on port " + str(port) +print("Python server running on port " + str(port)) server.serve() diff --git a/lib/py/setup.py b/lib/py/setup.py index 3e10f01bb76..066483e19de 100644 --- a/lib/py/setup.py +++ b/lib/py/setup.py @@ -113,7 +113,6 @@ def run_setup(with_binary): author_email='dev@thrift.apache.org', url='http://thrift.apache.org', license='Apache License 2.0', - install_requires=['six>=1.7.2'], extras_require={ 'ssl': ssl_deps, 'tornado': tornado_deps, @@ -132,7 +131,6 @@ def run_setup(with_binary): 'Environment :: Console', 'Intended Audience :: Developers', 'Programming Language :: Python', - 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 3', 'Topic :: Software Development :: Libraries', 'Topic :: System :: Networking' diff --git a/lib/py/src/TSCons.py b/lib/py/src/TSCons.py index bc67d7069b6..633f67ab008 100644 --- a/lib/py/src/TSCons.py +++ b/lib/py/src/TSCons.py @@ -19,7 +19,6 @@ from os import path from SCons.Builder import Builder -from six.moves import map def scons_env(env, add=''): diff --git a/lib/py/src/protocol/TProtocol.py b/lib/py/src/protocol/TProtocol.py index 339a2839d71..bac54aece9d 100644 --- a/lib/py/src/protocol/TProtocol.py +++ b/lib/py/src/protocol/TProtocol.py @@ -21,10 +21,8 @@ from thrift.transport.TTransport import TTransportException from ..compat import binary_to_str, str_to_binary -import six import sys from itertools import islice -from six.moves import zip class TProtocolException(TException): @@ -373,8 +371,8 @@ def writeContainerSet(self, val, spec): def writeContainerMap(self, val, spec): ktype, kspec, vtype, vspec, _ = spec self.writeMapBegin(ktype, vtype, len(val)) - for _ in zip(self._write_by_ttype(ktype, six.iterkeys(val), spec, kspec), - self._write_by_ttype(vtype, six.itervalues(val), spec, vspec)): + for _ in zip(self._write_by_ttype(ktype, val.keys(), spec, kspec), + self._write_by_ttype(vtype, val.values(), spec, vspec)): pass self.writeMapEnd() diff --git a/lib/py/src/server/THttpServer.py b/lib/py/src/server/THttpServer.py index 47e817df773..21f2c869149 100644 --- a/lib/py/src/server/THttpServer.py +++ b/lib/py/src/server/THttpServer.py @@ -19,7 +19,7 @@ import ssl -from six.moves import BaseHTTPServer +import http.server as BaseHTTPServer from thrift.Thrift import TMessageType from thrift.server import TServer diff --git a/lib/py/src/server/TNonblockingServer.py b/lib/py/src/server/TNonblockingServer.py index 76947608f56..a7a40cafb53 100644 --- a/lib/py/src/server/TNonblockingServer.py +++ b/lib/py/src/server/TNonblockingServer.py @@ -32,7 +32,7 @@ import threading from collections import deque -from six.moves import queue +import queue from thrift.transport import TTransport from thrift.protocol.TBinaryProtocol import TBinaryProtocolFactory diff --git a/lib/py/src/server/TServer.py b/lib/py/src/server/TServer.py index 8b2f938a62a..81144f14a9b 100644 --- a/lib/py/src/server/TServer.py +++ b/lib/py/src/server/TServer.py @@ -17,7 +17,7 @@ # under the License. # -from six.moves import queue +import queue import logging import os import threading diff --git a/lib/py/src/transport/THttpClient.py b/lib/py/src/transport/THttpClient.py index 82ca3d12dfb..d545ce56d1f 100644 --- a/lib/py/src/transport/THttpClient.py +++ b/lib/py/src/transport/THttpClient.py @@ -24,11 +24,11 @@ import warnings import base64 -from six.moves import urllib -from six.moves import http_client +import urllib.parse +import urllib.request +import http.client from .TTransport import TTransportBase -import six class THttpClient(TTransportBase): @@ -60,9 +60,9 @@ def __init__(self, uri_or_host, port=None, path=None, cafile=None, cert_file=Non self.scheme = parsed.scheme assert self.scheme in ('http', 'https') if self.scheme == 'http': - self.port = parsed.port or http_client.HTTP_PORT + self.port = parsed.port or http.client.HTTP_PORT elif self.scheme == 'https': - self.port = parsed.port or http_client.HTTPS_PORT + self.port = parsed.port or http.client.HTTPS_PORT self.certfile = cert_file self.keyfile = key_file self.context = ssl.create_default_context(cafile=cafile) if (cafile and not ssl_context) else ssl_context @@ -107,10 +107,10 @@ def using_proxy(self): def open(self): if self.scheme == 'http': - self.__http = http_client.HTTPConnection(self.host, self.port, + self.__http = http.client.HTTPConnection(self.host, self.port, timeout=self.__timeout) elif self.scheme == 'https': - self.__http = http_client.HTTPSConnection(self.host, self.port, + self.__http = http.client.HTTPSConnection(self.host, self.port, key_file=self.keyfile, cert_file=self.certfile, timeout=self.__timeout, @@ -173,7 +173,7 @@ def flush(self): self.__http.putheader('User-Agent', user_agent) if self.__custom_headers: - for key, val in six.iteritems(self.__custom_headers): + for key, val in self.__custom_headers.items(): self.__http.putheader(key, val) # Saves the cookie sent by the server in the previous response. From 5d0205d43d28ff88194f711156ed3a562e636afc Mon Sep 17 00:00:00 2001 From: thomasbruggink Date: Tue, 5 Nov 2024 15:33:18 +0900 Subject: [PATCH 155/430] THRIFT-5775 Kotlin build failed for broken toolchain in docker (#3043) * THRIFT-5775 Kotlin build failed for broken toolchain in docker This PR adds JDK 8 to both docker containers to support the kotlin build. Kotlin requires toolchain 8 and cant build this without the JDK for that language level being present. Also correct readme since docker desktop on Mac also fixes the permissions with volume sharing automatically. * Remove gradle toolchains from kotlin and set source/target to java 8 * Manually set the release target for kotlin, remove overwrites from cross-test-client/server * Set toolchain to 17 on the kotlin lib module --- build/docker/README.md | 4 ++-- lib/kotlin/build.gradle.kts | 14 +++++++++++--- lib/kotlin/cross-test-client/build.gradle.kts | 6 ------ lib/kotlin/cross-test-server/build.gradle.kts | 8 +------- 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/build/docker/README.md b/build/docker/README.md index 2a338b4b4c1..9e972b8d1d8 100644 --- a/build/docker/README.md +++ b/build/docker/README.md @@ -135,11 +135,11 @@ If you do not want to use the same scripts Travis CI does, you can do it manuall Build the image: -Linux/Mac: +Linux: thrift$ docker build --build-arg uid=$(id -u) --build-arg gid=$(id -g) -t thrift build/docker/ubuntu-jammy -Windows: +Windows/Mac: thrift$ docker build -t thrift build/docker/ubuntu-jammy diff --git a/lib/kotlin/build.gradle.kts b/lib/kotlin/build.gradle.kts index df4a2c13184..16d745bac82 100644 --- a/lib/kotlin/build.gradle.kts +++ b/lib/kotlin/build.gradle.kts @@ -16,6 +16,8 @@ * specific language governing permissions and limitations * under the License. */ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") @@ -36,13 +38,19 @@ dependencies { kotlin { jvmToolchain { - (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(8)) + languageVersion.set(JavaLanguageVersion.of(17)) } } -tasks.withType { +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +tasks.withType { compilerOptions { - jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8 + jvmTarget = JvmTarget.JVM_1_8 + freeCompilerArgs = listOf("-Xjdk-release=1.8") } } diff --git a/lib/kotlin/cross-test-client/build.gradle.kts b/lib/kotlin/cross-test-client/build.gradle.kts index 8a2c234b823..c68f393ac26 100644 --- a/lib/kotlin/cross-test-client/build.gradle.kts +++ b/lib/kotlin/cross-test-client/build.gradle.kts @@ -50,12 +50,6 @@ dependencies { testImplementation("org.jetbrains.kotlin:kotlin-test-junit") } -kotlin { - jvmToolchain { - (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(8)) - } -} - tasks { application { applicationName = "TestClient" diff --git a/lib/kotlin/cross-test-server/build.gradle.kts b/lib/kotlin/cross-test-server/build.gradle.kts index eda1ebd0c39..57fef4f66d0 100644 --- a/lib/kotlin/cross-test-server/build.gradle.kts +++ b/lib/kotlin/cross-test-server/build.gradle.kts @@ -48,12 +48,6 @@ dependencies { testImplementation("org.jetbrains.kotlin:kotlin-test-junit") } -kotlin { - jvmToolchain { - (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(8)) - } -} - tasks { application { applicationName = "TestServer" @@ -68,7 +62,7 @@ tasks { task("compileThrift") { val thriftBin = if (hasProperty("thrift.compiler")) { - file(property("thrift.compiler")) + file(property("thrift.compiler")!!) } else { project.rootDir.resolve("../../compiler/cpp/thrift") } From ff1596046876f9d9a5a18a6b67983d0253c07db8 Mon Sep 17 00:00:00 2001 From: Gehu Pierre Date: Tue, 29 Oct 2024 12:40:58 -0400 Subject: [PATCH 156/430] Update TConstant.php to remove deprecated PHP code remove deprecated use of static callables --- lib/php/lib/Type/TConstant.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/php/lib/Type/TConstant.php b/lib/php/lib/Type/TConstant.php index 215da4a3d24..9e3dd62672b 100644 --- a/lib/php/lib/Type/TConstant.php +++ b/lib/php/lib/Type/TConstant.php @@ -41,12 +41,12 @@ protected function __construct() */ public static function get($constant) { - if (is_null(static::$$constant)) { - static::$$constant = call_user_func( - sprintf('static::init_%s', $constant) + if (is_null(static::class::$$constant)) { + static::class::$$constant = call_user_func( + sprintf(static::class . '::init_%s', $constant) ); } - return static::$$constant; + return static::class::$$constant; } } From 617c4e7cee2ae25decb8dbcd62daf5acc507e2a3 Mon Sep 17 00:00:00 2001 From: Gehu Pierre Date: Mon, 4 Nov 2024 10:01:04 -0500 Subject: [PATCH 157/430] Fix update in TConstant.php for PHP 7 compatibility --- lib/php/lib/Type/TConstant.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/php/lib/Type/TConstant.php b/lib/php/lib/Type/TConstant.php index 9e3dd62672b..e16066c3381 100644 --- a/lib/php/lib/Type/TConstant.php +++ b/lib/php/lib/Type/TConstant.php @@ -41,12 +41,12 @@ protected function __construct() */ public static function get($constant) { - if (is_null(static::class::$$constant)) { - static::class::$$constant = call_user_func( + if (is_null(static::$$constant)) { + static::$$constant = call_user_func( sprintf(static::class . '::init_%s', $constant) ); } - return static::class::$$constant; + return static::$$constant; } } From e7f1a26a9579ee00311ed4d5b1dd0e1553e516c0 Mon Sep 17 00:00:00 2001 From: Jiayu Liu <622789+jimexist@users.noreply.github.com> Date: Wed, 6 Nov 2024 11:37:25 +0800 Subject: [PATCH 158/430] use 24.04 for github ci jobs (#3044) --- .github/workflows/build.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5fadc274e8d..4fcdabbc586 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -67,9 +67,9 @@ jobs: - name: Run thrift version run: /usr/local/bin/thrift -version - # only upload while building ubuntu-22.04 + # only upload while building ubuntu-24.04 - name: Archive built thrift compiler - if: matrix.os == 'ubuntu-22.04' + if: matrix.os == 'ubuntu-24.04' uses: actions/upload-artifact@v4 with: name: thrift-compiler @@ -78,7 +78,7 @@ jobs: lib-php: needs: compiler - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: matrix: php-version: [7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2, 8.3] @@ -131,7 +131,7 @@ jobs: lib-go: needs: compiler - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: matrix: go: @@ -191,7 +191,7 @@ jobs: lib-java-kotlin: needs: compiler - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 env: GRADLE_VERSION: "8.4" steps: @@ -299,7 +299,7 @@ jobs: lib-netstd: needs: compiler - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: fail-fast: false steps: @@ -360,7 +360,7 @@ jobs: lib-swift: needs: compiler - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 @@ -396,7 +396,7 @@ jobs: lib-rust: needs: compiler - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 env: TOOLCHAIN_VERSION: 1.65.0 steps: @@ -461,7 +461,7 @@ jobs: lib-python: needs: compiler - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: matrix: python-version: @@ -524,7 +524,7 @@ jobs: - lib-rust - lib-go - lib-python - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: matrix: server_lang: ['java', 'kotlin', 'go', 'rs', 'swift'] From b65ec607db09f2efdb7397acde88fd53cfb97f6b Mon Sep 17 00:00:00 2001 From: Jiayu Liu <622789+jimexist@users.noreply.github.com> Date: Wed, 6 Nov 2024 11:39:01 +0800 Subject: [PATCH 159/430] GitHub cmake workflow to build libraries as well [skip ci] (#2679) * cmake to build with java and kotlin * add kotlin * turn off python in cmake * cmake and cpack --------- Co-authored-by: Jiayu Liu --- .github/workflows/cmake.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index c4ff747b549..551c6c44b05 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -27,14 +27,24 @@ jobs: run: | mkdir cmake_build cd cmake_build - cmake .. -DBUILD_LIBRARIES=OFF + cmake .. \ + -DBUILD_COMPILER=ON \ + -DBUILD_LIBRARIES=ON \ + -DWITH_JAVA=ON \ + -DWITH_PYTHON=OFF \ + -DWITH_NODEJS=OFF - name: Run make run: | cd cmake_build cmake --build . + - name: Run pack + run: | + cd cmake_build + cpack + - name: Run test run: | cd cmake_build - ctest -j$(nproc) + ctest -VV From a085b0ecee74cf2102496264fe51a0dfe026f6f5 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 14 Nov 2024 23:03:46 +0100 Subject: [PATCH 160/430] Revert "GitHub cmake workflow to build libraries as well [skip ci] (#2679)" This reverts commit b65ec607db09f2efdb7397acde88fd53cfb97f6b. --- .github/workflows/cmake.yml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 551c6c44b05..c4ff747b549 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -27,24 +27,14 @@ jobs: run: | mkdir cmake_build cd cmake_build - cmake .. \ - -DBUILD_COMPILER=ON \ - -DBUILD_LIBRARIES=ON \ - -DWITH_JAVA=ON \ - -DWITH_PYTHON=OFF \ - -DWITH_NODEJS=OFF + cmake .. -DBUILD_LIBRARIES=OFF - name: Run make run: | cd cmake_build cmake --build . - - name: Run pack - run: | - cd cmake_build - cpack - - name: Run test run: | cd cmake_build - ctest -VV + ctest -j$(nproc) From c8cf304919f31c2132e1aa64fea4dfa08fe1bed9 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Thu, 14 Nov 2024 15:25:18 -0800 Subject: [PATCH 161/430] THRIFT-5833: Add ProcessorError Client: go Provide ProcessorError as the combined error of write i/o error and original error returned by the endpoint implementation, and update compiler to use that in Process functions. --- .../cpp/src/thrift/generate/t_go_generator.cc | 32 +++++++++--- .../test/tests/processor_middleware_test.go | 32 +++++++++--- lib/go/thrift/processor_factory.go | 52 ++++++++++++++++++- lib/go/thrift/simple_server_test.go | 1 + 4 files changed, 103 insertions(+), 14 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc index 8ed914009db..8839dde2003 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc @@ -2988,7 +2988,7 @@ void t_go_generator::generate_process_function(t_service* tservice, t_function* string write_err; if (!tfunction->is_oneway()) { write_err = tmp("_write_err"); - f_types_ << indent() << "var " << write_err << " error" << '\n'; + f_types_ << indent() << "var " << write_err << " thrift.TException" << '\n'; } f_types_ << indent() << "args := " << argsname << "{}" << '\n'; f_types_ << indent() << "if err2 := args." << read_method_name_ << "(ctx, iprot); err2 != nil {" << '\n'; @@ -3120,14 +3120,24 @@ void t_go_generator::generate_process_function(t_service* tservice, t_function* // Avoid writing the error to the wire if it's ErrAbandonRequest f_types_ << indent() << "if errors.Is(err2, thrift.ErrAbandonRequest) {" << '\n'; indent_up(); - f_types_ << indent() << "return false, thrift.WrapTException(err2)" << '\n'; + f_types_ << indent() << "return false, &thrift.ProcessorError{" << '\n'; + indent_up(); + f_types_ << indent() << "WriteError: thrift.WrapTException(err2)," << '\n'; + f_types_ << indent() << "EndpointError: err," << '\n'; + indent_down(); + f_types_ << indent() << "}" << '\n'; indent_down(); f_types_ << indent() << "}" << '\n'; f_types_ << indent() << "if errors.Is(err2, context.Canceled) {" << '\n'; indent_up(); - f_types_ << indent() << "if err := context.Cause(ctx); errors.Is(err, thrift.ErrAbandonRequest) {" << '\n'; + f_types_ << indent() << "if err3 := context.Cause(ctx); errors.Is(err3, thrift.ErrAbandonRequest) {" << '\n'; indent_up(); - f_types_ << indent() << "return false, thrift.WrapTException(err)" << '\n'; + f_types_ << indent() << "return false, &thrift.ProcessorError{" << '\n'; + indent_up(); + f_types_ << indent() << "WriteError: thrift.WrapTException(err3)," << '\n'; + f_types_ << indent() << "EndpointError: err," << '\n'; + indent_down(); + f_types_ << indent() << "}" << '\n'; indent_down(); f_types_ << indent() << "}" << '\n'; indent_down(); @@ -3168,7 +3178,12 @@ void t_go_generator::generate_process_function(t_service* tservice, t_function* f_types_ << indent() << "if " << write_err << " != nil {" << '\n'; indent_up(); - f_types_ << indent() << "return false, thrift.WrapTException(" << write_err << ")" << '\n'; + f_types_ << indent() << "return false, &thrift.ProcessorError{" << '\n'; + indent_up(); + f_types_ << indent() << "WriteError: " << write_err << "," << '\n'; + f_types_ << indent() << "EndpointError: err," << '\n'; + indent_down(); + f_types_ << indent() << "}" << '\n'; indent_down(); f_types_ << indent() << "}" << '\n'; @@ -3230,7 +3245,12 @@ void t_go_generator::generate_process_function(t_service* tservice, t_function* f_types_ << indent() << "if " << write_err << " != nil {" << '\n'; indent_up(); - f_types_ << indent() << "return false, thrift.WrapTException(" << write_err << ")" << '\n'; + f_types_ << indent() << "return false, &thrift.ProcessorError{" << '\n'; + indent_up(); + f_types_ << indent() << "WriteError: " << write_err << "," << '\n'; + f_types_ << indent() << "EndpointError: err," << '\n'; + indent_down(); + f_types_ << indent() << "}" << '\n'; indent_down(); f_types_ << indent() << "}" << '\n'; diff --git a/lib/go/test/tests/processor_middleware_test.go b/lib/go/test/tests/processor_middleware_test.go index 1bd911cfe60..aedd93f2279 100644 --- a/lib/go/test/tests/processor_middleware_test.go +++ b/lib/go/test/tests/processor_middleware_test.go @@ -32,9 +32,12 @@ import ( const errorMessage = "foo error" -type serviceImpl struct{} +type serviceImpl struct { + sleepTime time.Duration +} -func (serviceImpl) Ping(_ context.Context) (err error) { +func (s serviceImpl) Ping(_ context.Context) (err error) { + time.Sleep(s.sleepTime) return &processormiddlewaretest.Error{ Foo: thrift.StringPtr(errorMessage), } @@ -67,9 +70,14 @@ func checkError(tb testing.TB, err error) { } func TestProcessorMiddleware(t *testing.T) { - const timeout = time.Second + const ( + sleepTime = 10 * time.Millisecond + timeout = sleepTime / 5 + ) - processor := processormiddlewaretest.NewServiceProcessor(&serviceImpl{}) + processor := processormiddlewaretest.NewServiceProcessor(&serviceImpl{ + sleepTime: sleepTime, + }) serverTransport, err := thrift.NewTServerSocket("127.0.0.1:0") if err != nil { t.Fatalf("Could not find available server port: %v", err) @@ -80,7 +88,9 @@ func TestProcessorMiddleware(t *testing.T) { thrift.NewTHeaderTransportFactoryConf(nil, nil), thrift.NewTHeaderProtocolFactoryConf(nil), ) - defer server.Stop() + t.Cleanup(func() { + server.Stop() + }) var wg sync.WaitGroup wg.Add(1) go func() { @@ -103,6 +113,14 @@ func TestProcessorMiddleware(t *testing.T) { client := processormiddlewaretest.NewServiceClient(thrift.NewTStandardClient(protocol, protocol)) - err = client.Ping(context.Background()) - checkError(t, err) + for label, timeout := range map[string]time.Duration{ + "enough-time": sleepTime * 10, + "not-enough-time": sleepTime / 2, + } { + t.Run(label, func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + t.Cleanup(cancel) + client.Ping(ctx) + }) + } } diff --git a/lib/go/thrift/processor_factory.go b/lib/go/thrift/processor_factory.go index 245a3ccfc98..64f89141336 100644 --- a/lib/go/thrift/processor_factory.go +++ b/lib/go/thrift/processor_factory.go @@ -19,7 +19,11 @@ package thrift -import "context" +import ( + "context" + "fmt" + "strings" +) // A processor is a generic object which operates upon an input stream and // writes to some output stream. @@ -78,3 +82,49 @@ func NewTProcessorFunctionFactory(p TProcessorFunction) TProcessorFunctionFactor func (p *tProcessorFunctionFactory) GetProcessorFunction(trans TTransport) TProcessorFunction { return p.processor } + +// ProcessorError is the combined original error returned by the endpoint +// implementation, and I/O error when writing the response back to the client. +// +// This type will be returned by Process function if there's an error happened +// during writing the response back to the client. ProcessorMiddlewares can +// check for this type (use errors.As) to get the underlying write and endpoint +// errors. +type ProcessorError struct { + // WriteError is the error happened during writing the response to the + // client, always set. + WriteError TException + + // EndpointError is the original error returned by the endpoint + // implementation, might be nil. + EndpointError TException +} + +func (pe *ProcessorError) Unwrap() []error { + if pe.EndpointError != nil { + return []error{ + pe.WriteError, + pe.EndpointError, + } + } + return []error{pe.WriteError} +} + +func (pe *ProcessorError) Error() string { + var sb strings.Builder + sb.WriteString("thrift.ProcessorError: ") + sb.WriteString(fmt.Sprintf("write response to client: %v", pe.WriteError)) + if pe.EndpointError != nil { + sb.WriteString(fmt.Sprintf("; original error from endpoint: %v", pe.EndpointError)) + } + return sb.String() +} + +func (pe *ProcessorError) TExceptionType() TExceptionType { + return pe.WriteError.TExceptionType() +} + +var ( + _ error = (*ProcessorError)(nil) + _ TException = (*ProcessorError)(nil) +) diff --git a/lib/go/thrift/simple_server_test.go b/lib/go/thrift/simple_server_test.go index f3a59ee18ea..0fcb01bd8b8 100644 --- a/lib/go/thrift/simple_server_test.go +++ b/lib/go/thrift/simple_server_test.go @@ -294,6 +294,7 @@ func TestErrAbandonRequest(t *testing.T) { if !errors.Is(ErrAbandonRequest, context.Canceled) { t.Error("errors.Is(ErrAbandonRequest, context.Canceled) returned false") } + //lint:ignore SA1032 Intentional order for this test. if errors.Is(context.Canceled, ErrAbandonRequest) { t.Error("errors.Is(context.Canceled, ErrAbandonRequest) returned true") } From 0f027530d7d46ae25f3ed6d6ee453ca18ca43eb6 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sun, 17 Nov 2024 01:55:38 +0100 Subject: [PATCH 162/430] THRIFT-5836 No rule to make target 'Thrift5272.thrift', needed by 'gen-cpp/Thrift5272_types.h' Patch: Jens Geyer --- lib/cpp/test/Makefile.am | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/cpp/test/Makefile.am b/lib/cpp/test/Makefile.am index d9ab09208c9..b4f6055722b 100644 --- a/lib/cpp/test/Makefile.am +++ b/lib/cpp/test/Makefile.am @@ -471,4 +471,6 @@ EXTRA_DIST = \ CMakeLists.txt \ DebugProtoTest_extras.cpp \ ThriftTest_extras.cpp \ - OneWayTest.thrift + OneWayTest.thrift \ + Thrift5272.thrift + From 23e0e5ce75300451f49727ee438edbc76fcbb372 Mon Sep 17 00:00:00 2001 From: Susanne Lindgren Date: Tue, 19 Nov 2024 09:44:37 +0100 Subject: [PATCH 163/430] Don't use legacy ssl hostname validation for python >= 3.12 --- lib/py/src/transport/sslcompat.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/py/src/transport/sslcompat.py b/lib/py/src/transport/sslcompat.py index 60616db8273..54235ec6d1d 100644 --- a/lib/py/src/transport/sslcompat.py +++ b/lib/py/src/transport/sslcompat.py @@ -92,8 +92,15 @@ def _optional_dependencies(): logger.debug('ssl.match_hostname is available') match = match_hostname except ImportError: - logger.warning('using legacy validation callback') - match = legacy_validate_callback + # https://docs.python.org/3/whatsnew/3.12.html: + # "Remove the ssl.match_hostname() function. It was deprecated in Python + # 3.7. OpenSSL performs hostname matching since Python 3.7, Python no + # longer uses the ssl.match_hostname() function."" + if sys.version_info[0] > 3 or (sys.version_info[0] == 3 and sys.version_info[1] >= 12): + match = lambda cert, hostname: True + else: + logger.warning('using legacy validation callback') + match = legacy_validate_callback return ipaddr, match From e26b4a83847175db15b08cd51fc796f5e39e37fe Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 12 Nov 2024 23:53:04 +0100 Subject: [PATCH 164/430] THRIFT-5832 Drop net6 support and add net9 instead Client: netstd Patch: Jens Geyer --- .github/workflows/build.yml | 2 +- build/docker/README.md | 2 +- build/docker/ubuntu-focal/Dockerfile | 8 +- build/docker/ubuntu-jammy/Dockerfile | 8 +- build/veralign.sh | 2 +- .../src/thrift/generate/t_netstd_generator.cc | 30 +++++--- .../src/thrift/generate/t_netstd_generator.h | 2 +- debian/copyright | 5 +- .../Thrift.Benchmarks.csproj | 4 +- lib/netstd/Makefile.am | 8 +- .../Thrift.Compile.net8.csproj | 2 +- .../Impl/Thrift5253/MyService.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../Thrift.Compile.net9.csproj} | 30 ++++---- .../Thrift.Compile.Tests/Thrift5794.thrift | 2 +- .../Thrift.IntegrationTests.csproj | 10 +-- .../Tests/Thrift.Tests/Thrift.Tests.csproj | 12 +-- lib/netstd/Thrift.sln | 30 ++++---- lib/netstd/Thrift/.editorconfig | 6 +- lib/netstd/Thrift/GlobalSuppressions.cs | 3 + lib/netstd/Thrift/Protocol/TJSONProtocol.cs | 2 + lib/netstd/Thrift/Thrift.csproj | 38 +++++----- .../Transport/Client/TTlsSocketTransport.cs | 5 ++ test/netstd/Client/Client.csproj | 12 +-- test/netstd/Client/TestClient.cs | 5 +- test/netstd/Server/Server.csproj | 12 +-- test/netstd/Server/TestServer.cs | 8 +- test/netstd/ThriftTest.sln | 28 +++---- tutorial/netstd/Client/Client.csproj | 5 +- tutorial/netstd/Client/Program.cs | 60 +++++++-------- tutorial/netstd/Interfaces/Interfaces.csproj | 11 +-- tutorial/netstd/Server/Program.cs | 73 +++++++++---------- tutorial/netstd/Server/Server.csproj | 3 +- 33 files changed, 226 insertions(+), 206 deletions(-) rename lib/netstd/Tests/Thrift.Compile.Tests/{Thrift.Compile.net6 => Thrift.Compile.net9}/Impl/Thrift5253/MyService.cs (98%) rename lib/netstd/Tests/Thrift.Compile.Tests/{Thrift.Compile.net6 => Thrift.Compile.net9}/Properties/AssemblyInfo.cs (96%) rename lib/netstd/Tests/Thrift.Compile.Tests/{Thrift.Compile.net6/Thrift.Compile.net6.csproj => Thrift.Compile.net9/Thrift.Compile.net9.csproj} (85%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4fcdabbc586..a740507448a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -314,7 +314,7 @@ jobs: # the sdk is installed by default, but keep this step for reference # - name: Set up .NET SDK # run: | -# sudo apt-get install -y --no-install-recommends dotnet-sdk-8.0 +# sudo apt-get install -y --no-install-recommends dotnet-sdk-9.0 - name: Run bootstrap run: ./bootstrap.sh diff --git a/build/docker/README.md b/build/docker/README.md index 9e972b8d1d8..6b535df1b8a 100644 --- a/build/docker/README.md +++ b/build/docker/README.md @@ -188,7 +188,7 @@ Last updated: March 5, 2024 | java | 17 | 17 | | | js | Node.js 16.20.2, npm 8.19.4 | Node.js 16.20.2, npm 8.19.4 | | | lua | 5.2.4 | 5.2.4 | Lua 5.3: see THRIFT-4386 | -| netstd | 8.0.200 | 8.0.200 | | +| netstd | 9.0 | 9.0 | | | nodejs | 16.20.2 | 16.20.2 | | | ocaml | 4.08.1 | 4.13.1 | | | perl | 5.30.0 | 5.34.0 | | diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile index 84bbee1beae..02f84c673d5 100644 --- a/build/docker/ubuntu-focal/Dockerfile +++ b/build/docker/ubuntu-focal/Dockerfile @@ -139,10 +139,10 @@ ENV PATH /usr/lib/dart/bin:$PATH RUN apt-get install -y --no-install-recommends \ `# dotnet core dependencies` \ - dotnet-sdk-8.0 \ - dotnet-runtime-8.0 \ - aspnetcore-runtime-8.0 \ - dotnet-apphost-pack-8.0 + dotnet-sdk-9.0 \ + dotnet-runtime-9.0 \ + aspnetcore-runtime-9.0 \ + dotnet-apphost-pack-9.0 # Erlang dependencies ARG ERLANG_OTP_VERSION=23.3.4.11 diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile index 0505bf5bde1..c6176a8feae 100644 --- a/build/docker/ubuntu-jammy/Dockerfile +++ b/build/docker/ubuntu-jammy/Dockerfile @@ -138,10 +138,10 @@ ENV PATH /usr/lib/dart/bin:$PATH RUN apt-get install -y --no-install-recommends \ `# dotnet core dependencies` \ - dotnet-sdk-8.0 \ - dotnet-runtime-8.0 \ - aspnetcore-runtime-8.0 \ - dotnet-apphost-pack-8.0 + dotnet-sdk-9.0 \ + dotnet-runtime-9.0 \ + aspnetcore-runtime-9.0 \ + dotnet-apphost-pack-9.0 # Erlang dependencies ARG ERLANG_OTP_VERSION=25.3.2.9 diff --git a/build/veralign.sh b/build/veralign.sh index 8664a4605f1..b929f1f49e9 100755 --- a/build/veralign.sh +++ b/build/veralign.sh @@ -72,8 +72,8 @@ FILES[lib/js/package-lock.json]=simpleReplace FILES[lib/lua/Thrift.lua]=simpleReplace FILES[lib/netstd/Thrift/Properties/AssemblyInfo.cs]=simpleReplace FILES[lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj]=simpleReplace -FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj]=simpleReplace FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj]=simpleReplace +FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj]=simpleReplace FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj]=simpleReplace FILES[lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj]=simpleReplace FILES[lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj]=simpleReplace diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc index 95c91180f6e..c35ce563907 100644 --- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc @@ -82,8 +82,8 @@ t_netstd_generator::t_netstd_generator(t_program* program, const mapfirst.compare("no_deepcopy") == 0) { suppress_deepcopy = true; } - else if (iter->first.compare("net6") == 0) { - target_net_version = 6; + else if (iter->first.compare("net9") == 0) { + target_net_version = 9; } else if (iter->first.compare("net8") == 0) { target_net_version = 8; @@ -202,12 +202,12 @@ void t_netstd_generator::reset_indent() { void t_netstd_generator::pragmas_and_directives(ostream& out) { - if( target_net_version >= 8) { + if( target_net_version >= 9) { + out << "// targeting net 9" << '\n'; + out << "#if( !NET9_0_OR_GREATER)" << '\n'; + } else if( target_net_version >= 8) { out << "// targeting net 8" << '\n'; - out << "#if( !NET8_0_OR_GREATER)" << '\n'; - } else if( target_net_version >= 6) { - out << "// targeting net 6" << '\n'; - out << "#if( NET8_0_OR_GREATER || !NET6_0_OR_GREATER)" << '\n'; + out << "#if( NET9_0_OR_GREATER || !NET8_0_OR_GREATER)" << '\n'; } else { out << "// targeting netstandard 2.x" << '\n'; out << "#if(! NETSTANDARD2_0_OR_GREATER)" << '\n'; @@ -224,12 +224,20 @@ void t_netstd_generator::pragmas_and_directives(ostream& out) // this one must be first out << "#pragma warning disable IDE0079 // remove unnecessary pragmas" << '\n'; - if( target_net_version >= 8) { - out << "#pragma warning disable IDE0290 // use primary CTOR" << '\n'; - } else { + if( target_net_version >= 9) { + out << "#pragma warning disable IDE0130 // unexpected folder structure" << '\n'; + } + + if( target_net_version < 8) { out << "#pragma warning disable IDE0017 // object init can be simplified" << '\n'; out << "#pragma warning disable IDE0028 // collection init can be simplified" << '\n'; + out << "#pragma warning disable IDE0305 // collection init can be simplified" << '\n'; + out << "#pragma warning disable IDE0034 // simplify default expression" << '\n'; + out << "#pragma warning disable IDE0066 // use switch expression" << '\n'; + out << "#pragma warning disable IDE0090 // simplify new expression" << '\n'; } + + out << "#pragma warning disable IDE0290 // use primary CTOR" << '\n'; out << "#pragma warning disable IDE1006 // parts of the code use IDL spelling" << '\n'; out << "#pragma warning disable CA1822 // empty " << DEEP_COPY_METHOD_NAME << "() methods still non-static" << '\n'; @@ -3992,8 +4000,8 @@ THRIFT_REGISTER_GENERATOR( " serial: Add serialization support to generated classes.\n" " union: Use new union typing, which includes a static read function for union types.\n" " pascal: Generate Pascal Case property names according to Microsoft naming convention.\n" - " net6: Enable features that require net6 and C# 8 or higher.\n" " net8: Enable features that require net8 and C# 12 or higher.\n" + " net9: Enable features that require net9 and C# 13 or higher.\n" " no_deepcopy: Suppress generation of " + DEEP_COPY_METHOD_NAME + "() method.\n" " async_postfix: Append \"Async\" to all service methods (maintains compatibility with existing code).\n" ) diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.h b/compiler/cpp/src/thrift/generate/t_netstd_generator.h index c65414a4cdc..4623b122862 100644 --- a/compiler/cpp/src/thrift/generate/t_netstd_generator.h +++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.h @@ -175,7 +175,7 @@ class t_netstd_generator : public t_oop_generator bool wcf_; bool use_pascal_case_properties; bool suppress_deepcopy; - int target_net_version; // 0 = any, 6 = net6, 8 = net8 + int target_net_version; // 0 = any, 6 = net6, 8 = net8, etc. bool add_async_postfix; const std::string CSHARP_KEYWORDS[101] = { diff --git a/debian/copyright b/debian/copyright index 76212b9d12f..7245167c173 100644 --- a/debian/copyright +++ b/debian/copyright @@ -74,11 +74,10 @@ under the Apache 2.0 License: lib/netstd/Thrift/Transport/TTransportFactory.cs lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Properties/AssemblyInfo.cs lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj - lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Properties/AssemblyInfo.cs - lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Properties/AssemblyInfo.cs lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj - lib/rb/lib/thrift.rb + lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Properties/AssemblyInfo.cs + lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj lib/st/README.md lib/st/thrift.st lib/cpp/test/OptionalRequiredTest.cpp diff --git a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj index 7877e6bf93b..9d25c7271c6 100644 --- a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj +++ b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj @@ -20,7 +20,7 @@ Exe - net8.0 + net9.0 0.22.0 latestMajor false @@ -29,7 +29,7 @@ - + diff --git a/lib/netstd/Makefile.am b/lib/netstd/Makefile.am index e7142b00569..ed855e45f3f 100644 --- a/lib/netstd/Makefile.am +++ b/lib/netstd/Makefile.am @@ -24,7 +24,7 @@ all-local: check-local: $(DOTNETCORE) test Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj - $(DOTNETCORE) test Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj + $(DOTNETCORE) test Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj $(DOTNETCORE) test Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj $(DOTNETCORE) test Tests/Thrift.Tests/Thrift.Tests.csproj $(DOTNETCORE) test Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj @@ -40,8 +40,8 @@ clean-local: $(RM) -r Tests/Thrift.IntegrationTests/obj $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net8/bin $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net8/obj - $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net6/bin - $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net6/obj + $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net9/bin + $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net9/obj $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/bin $(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/obj @@ -58,7 +58,7 @@ EXTRA_DIST = \ Tests/Thrift.Compile.Tests/CassandraTest.thrift \ Tests/Thrift.Compile.Tests/optional_required_default.thrift \ Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj \ - Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj \ + Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj \ Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj \ Tests/Thrift.Tests/Collections \ Tests/Thrift.Tests/DataModel \ diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj index 49fc8288dbc..2695ddee1e4 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj @@ -38,7 +38,7 @@ - + diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Impl/Thrift5253/MyService.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Impl/Thrift5253/MyService.cs similarity index 98% rename from lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Impl/Thrift5253/MyService.cs rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Impl/Thrift5253/MyService.cs index 4a2f40dc126..86a7617e80e 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Impl/Thrift5253/MyService.cs +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Impl/Thrift5253/MyService.cs @@ -22,7 +22,7 @@ using System.Threading.Tasks; using Thrift5253; -namespace Thrift.Compile.net6.Impl.Thrift5253 +namespace Thrift.Compile.net9.Impl.Thrift5253 { class MyServiceImpl : MyService.IAsync { diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Properties/AssemblyInfo.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Properties/AssemblyInfo.cs similarity index 96% rename from lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Properties/AssemblyInfo.cs rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Properties/AssemblyInfo.cs index 1d612f645fb..5bd3c6fb603 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Properties/AssemblyInfo.cs +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Properties/AssemblyInfo.cs @@ -37,4 +37,4 @@ // The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("dbc2c69a-93f1-45f4-8ecf-36ef13fc3482")] \ No newline at end of file +[assembly: Guid("1b468b7a-a53b-46de-90da-5f9ad7707ef4")] \ No newline at end of file diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj similarity index 85% rename from lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj index 6228aab98be..cb6c4653e5e 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj @@ -21,11 +21,11 @@ 0.22.0 Thrift version $(ThriftVersion) - net6.0 + net9.0 latestMajor $(ThriftVersion).0 - Thrift.Compile.net6 - Thrift.Compile.net6 + Thrift.Compile.net9 + Thrift.Compile.net9 false false false @@ -38,9 +38,7 @@ - - - + @@ -74,17 +72,17 @@ - - - - - - - - - + + + + + + + + + - + diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5794.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5794.thrift index 7263360703e..6a73a9be0bf 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5794.thrift +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5794.thrift @@ -19,7 +19,7 @@ // Testcase for THRIFT-5794 uncompilable code generated w/o net8 option -namespace * Thrift5794.net6 +namespace * Thrift5794 struct foo { 1: double a; diff --git a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj index d7d52c82b78..ebf684322b5 100644 --- a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj +++ b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj @@ -19,7 +19,7 @@ --> - net8.0 + net9.0 latestMajor Thrift.IntegrationTests Thrift.IntegrationTests @@ -36,10 +36,10 @@ - - - - + + + + diff --git a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj index c66558cca3d..30e3208baef 100644 --- a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj +++ b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj @@ -19,7 +19,7 @@ --> - net8.0 + net9.0 latestMajor 0.22.0.0 enable @@ -27,15 +27,15 @@ - - - - + + + + - + diff --git a/lib/netstd/Thrift.sln b/lib/netstd/Thrift.sln index dbd4b675031..feae3fed931 100644 --- a/lib/netstd/Thrift.sln +++ b/lib/netstd/Thrift.sln @@ -14,12 +14,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmarks", "Benchmarks", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Benchmarks", "Benchmarks\Thrift.Benchmarks\Thrift.Benchmarks.csproj", "{D0559DFF-6632-446C-9EFC-C750DA20B1D9}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.net6", "Tests\Thrift.Compile.Tests\Thrift.Compile.net6\Thrift.Compile.net6.csproj", "{2AFCF575-381C-46CA-8006-D5762365F0E3}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.netstd2", "Tests\Thrift.Compile.Tests\Thrift.Compile.netstd2\Thrift.Compile.netstd2.csproj", "{58F72FB9-09F5-4D0F-B0B4-36605670BF72}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.net8", "Tests\Thrift.Compile.Tests\Thrift.Compile.net8\Thrift.Compile.net8.csproj", "{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.net9", "Tests\Thrift.Compile.Tests\Thrift.Compile.net9\Thrift.Compile.net9.csproj", "{967C48D1-1807-41E5-B4BF-DFA6414CC9F2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -78,18 +78,6 @@ Global {D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Release|x64.Build.0 = Release|Any CPU {D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Release|x86.ActiveCfg = Release|Any CPU {D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Release|x86.Build.0 = Release|Any CPU - {2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|x64.ActiveCfg = Debug|Any CPU - {2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|x64.Build.0 = Debug|Any CPU - {2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|x86.ActiveCfg = Debug|Any CPU - {2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|x86.Build.0 = Debug|Any CPU - {2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|Any CPU.Build.0 = Release|Any CPU - {2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|x64.ActiveCfg = Release|Any CPU - {2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|x64.Build.0 = Release|Any CPU - {2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|x86.ActiveCfg = Release|Any CPU - {2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|x86.Build.0 = Release|Any CPU {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|Any CPU.Build.0 = Debug|Any CPU {58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -114,6 +102,18 @@ Global {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|x64.Build.0 = Release|Any CPU {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|x86.ActiveCfg = Release|Any CPU {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|x86.Build.0 = Release|Any CPU + {967C48D1-1807-41E5-B4BF-DFA6414CC9F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {967C48D1-1807-41E5-B4BF-DFA6414CC9F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {967C48D1-1807-41E5-B4BF-DFA6414CC9F2}.Debug|x64.ActiveCfg = Debug|Any CPU + {967C48D1-1807-41E5-B4BF-DFA6414CC9F2}.Debug|x64.Build.0 = Debug|Any CPU + {967C48D1-1807-41E5-B4BF-DFA6414CC9F2}.Debug|x86.ActiveCfg = Debug|Any CPU + {967C48D1-1807-41E5-B4BF-DFA6414CC9F2}.Debug|x86.Build.0 = Debug|Any CPU + {967C48D1-1807-41E5-B4BF-DFA6414CC9F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {967C48D1-1807-41E5-B4BF-DFA6414CC9F2}.Release|Any CPU.Build.0 = Release|Any CPU + {967C48D1-1807-41E5-B4BF-DFA6414CC9F2}.Release|x64.ActiveCfg = Release|Any CPU + {967C48D1-1807-41E5-B4BF-DFA6414CC9F2}.Release|x64.Build.0 = Release|Any CPU + {967C48D1-1807-41E5-B4BF-DFA6414CC9F2}.Release|x86.ActiveCfg = Release|Any CPU + {967C48D1-1807-41E5-B4BF-DFA6414CC9F2}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -122,9 +122,9 @@ Global {837F4084-AAD7-45F5-BC96-10E05A669DB4} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA} {0790D388-1A3C-4423-8CF2-C97074A8B68B} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA} {D0559DFF-6632-446C-9EFC-C750DA20B1D9} = {BF7B896B-8BB6-447C-84F8-26871882A14A} - {2AFCF575-381C-46CA-8006-D5762365F0E3} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA} {58F72FB9-09F5-4D0F-B0B4-36605670BF72} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA} {9A3E11C0-72FD-4DA0-8E61-C7746E751DF7} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA} + {967C48D1-1807-41E5-B4BF-DFA6414CC9F2} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {FD20BC4A-0109-41D8-8C0C-893E784D7EF9} diff --git a/lib/netstd/Thrift/.editorconfig b/lib/netstd/Thrift/.editorconfig index 82ff4a36058..5f43ecf1b2e 100644 --- a/lib/netstd/Thrift/.editorconfig +++ b/lib/netstd/Thrift/.editorconfig @@ -4,6 +4,6 @@ dotnet_diagnostic.CS1591.severity = silent # silence certain yet unfixed false positives for net8 -dotnet_diagnostic.IDE0290.severity = silent -dotnet_diagnostic.CA1510.severity = silent -dotnet_diagnostic.CA1513.severity = silent +#dotnet_diagnostic.IDE0290.severity = silent +#dotnet_diagnostic.CA1510.severity = silent +#dotnet_diagnostic.CA1513.severity = silent diff --git a/lib/netstd/Thrift/GlobalSuppressions.cs b/lib/netstd/Thrift/GlobalSuppressions.cs index eb7d3d789fa..cb5fc0109d4 100644 --- a/lib/netstd/Thrift/GlobalSuppressions.cs +++ b/lib/netstd/Thrift/GlobalSuppressions.cs @@ -28,4 +28,7 @@ [assembly: SuppressMessage("Style", "IDE0066", Justification = "compatibility", Scope = "module")] [assembly: SuppressMessage("Style", "IDE0090", Justification = "compatibility", Scope = "module")] [assembly: SuppressMessage("Style", "IDE0063", Justification = "compatibility", Scope = "module")] +[assembly: SuppressMessage("Style", "IDE0130", Justification = "compatibility", Scope = "module")] +[assembly: SuppressMessage("Style", "IDE0290", Justification = "compatibility", Scope = "module")] +[assembly: SuppressMessage("Style", "CS0114", Justification = "known issue, see JIRA ticket", Scope = "module")] diff --git a/lib/netstd/Thrift/Protocol/TJSONProtocol.cs b/lib/netstd/Thrift/Protocol/TJSONProtocol.cs index 64308d60be6..02cf3ed4e7f 100644 --- a/lib/netstd/Thrift/Protocol/TJSONProtocol.cs +++ b/lib/netstd/Thrift/Protocol/TJSONProtocol.cs @@ -29,6 +29,8 @@ #pragma warning disable IDE0079 // net20 - unneeded suppression #pragma warning disable IDE0290 // net8 - primary CTOR +#pragma warning disable IDE0305 // net9 - collection init +#pragma warning disable IDE0300 // net9 - collection init namespace Thrift.Protocol { diff --git a/lib/netstd/Thrift/Thrift.csproj b/lib/netstd/Thrift/Thrift.csproj index 8c2e6b91968..9279918e21b 100644 --- a/lib/netstd/Thrift/Thrift.csproj +++ b/lib/netstd/Thrift/Thrift.csproj @@ -19,7 +19,7 @@ --> - netstandard2.1;netstandard2.0;net6.0;net8.0 + netstandard2.1;netstandard2.0;net8.0;net9.0 Thrift ApacheThrift true @@ -60,16 +60,18 @@ - - - - + + + - - - - - + + @@ -84,18 +86,18 @@ - - - 7.0.9 - - - - + - 8.0.7 + 8.0.10 + + + 9.0.0 + + + $(IntermediateOutputPath)$(TargetFrameworkMoniker).AssemblyAttributes$(DefaultLanguageSourceExtension) diff --git a/lib/netstd/Thrift/Transport/Client/TTlsSocketTransport.cs b/lib/netstd/Thrift/Transport/Client/TTlsSocketTransport.cs index 0a51c9a2378..df18124dfa4 100644 --- a/lib/netstd/Thrift/Transport/Client/TTlsSocketTransport.cs +++ b/lib/netstd/Thrift/Transport/Client/TTlsSocketTransport.cs @@ -82,6 +82,10 @@ public TTlsSocketTransport(TcpClient client, TConfiguration config, } } + #if NET9_0_OR_GREATER + [Obsolete("SYSLIB0057: X509Certificate2 and X509Certificate constructors for binary and file content are obsolete")] + #pragma warning disable SYSLIB0057 + #endif public TTlsSocketTransport(IPAddress host, int port, TConfiguration config, string certificatePath, RemoteCertificateValidationCallback certValidator = null, @@ -94,6 +98,7 @@ public TTlsSocketTransport(IPAddress host, int port, TConfiguration config, sslProtocols) { } + #pragma warning restore SYSLIB0057 public TTlsSocketTransport(IPAddress host, int port, TConfiguration config, X509Certificate2 certificate = null, diff --git a/test/netstd/Client/Client.csproj b/test/netstd/Client/Client.csproj index 78cc22a0155..d9f61f8eee4 100644 --- a/test/netstd/Client/Client.csproj +++ b/test/netstd/Client/Client.csproj @@ -19,7 +19,7 @@ --> - net8.0 + net9.0 latestMajor Client Client @@ -35,9 +35,9 @@ - + - + @@ -49,8 +49,8 @@ - - - + + + diff --git a/test/netstd/Client/TestClient.cs b/test/netstd/Client/TestClient.cs index 74867122951..26bd120c46f 100644 --- a/test/netstd/Client/TestClient.cs +++ b/test/netstd/Client/TestClient.cs @@ -225,7 +225,8 @@ private static X509Certificate2 GetClientCert() throw new FileNotFoundException($"Cannot find file: {clientCertName}"); } - var cert = new X509Certificate2(existingPath, "thrift"); + //var cert = new X509Certificate2(existingPath, "thrift"); + var cert = X509CertificateLoader.LoadPkcs12FromFile(existingPath, "thrift"); return cert; } @@ -444,7 +445,7 @@ public static Task Execute(List args) public static string BytesToHex(byte[] data) { - return BitConverter.ToString(data).Replace("-", string.Empty); + return Convert.ToHexString(data); } diff --git a/test/netstd/Server/Server.csproj b/test/netstd/Server/Server.csproj index 766b7a9f1a8..130b466f99d 100644 --- a/test/netstd/Server/Server.csproj +++ b/test/netstd/Server/Server.csproj @@ -19,7 +19,7 @@ --> - net8.0 + net9.0 latestMajor Server Server @@ -36,9 +36,9 @@ - + - + @@ -50,8 +50,8 @@ - - - + + + diff --git a/test/netstd/Server/TestServer.cs b/test/netstd/Server/TestServer.cs index 2dea4182477..54654c85967 100644 --- a/test/netstd/Server/TestServer.cs +++ b/test/netstd/Server/TestServer.cs @@ -37,6 +37,7 @@ #pragma warning disable IDE0063 // using can be simplified, we don't #pragma warning disable IDE0057 // substr can be simplified, we don't +#pragma warning disable IDE0130 // unexpected folder structure namespace ThriftTest { @@ -554,9 +555,10 @@ private static X509Certificate2 GetServerCert() { throw new FileNotFoundException($"Cannot find file: {serverCertName}"); } - - var cert = new X509Certificate2(existingPath, "thrift"); - + + //var cert = new X509Certificate2(existingPath, "thrift"); + var cert = X509CertificateLoader.LoadPkcs12FromFile(existingPath, "thrift"); + return cert; } diff --git a/test/netstd/ThriftTest.sln b/test/netstd/ThriftTest.sln index d0a3fa8ec5e..45bc1f01c4c 100644 --- a/test/netstd/ThriftTest.sln +++ b/test/netstd/ThriftTest.sln @@ -17,10 +17,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Benchmarks", "..\..\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.net8", "..\..\lib\netstd\Tests\Thrift.Compile.Tests\Thrift.Compile.net8\Thrift.Compile.net8.csproj", "{05FAA75C-06BE-462F-999F-63823D08C75A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.net6", "..\..\lib\netstd\Tests\Thrift.Compile.Tests\Thrift.Compile.net6\Thrift.Compile.net6.csproj", "{761EB615-D476-4423-888E-7D7665E769B1}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.netstd2", "..\..\lib\netstd\Tests\Thrift.Compile.Tests\Thrift.Compile.netstd2\Thrift.Compile.netstd2.csproj", "{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Thrift.Compile.net9", "..\..\lib\netstd\Tests\Thrift.Compile.Tests\Thrift.Compile.net9\Thrift.Compile.net9.csproj", "{BB512CA7-D013-4CDC-AD2B-1E5EA121ED59}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -115,18 +115,6 @@ Global {05FAA75C-06BE-462F-999F-63823D08C75A}.Release|x64.Build.0 = Release|Any CPU {05FAA75C-06BE-462F-999F-63823D08C75A}.Release|x86.ActiveCfg = Release|Any CPU {05FAA75C-06BE-462F-999F-63823D08C75A}.Release|x86.Build.0 = Release|Any CPU - {761EB615-D476-4423-888E-7D7665E769B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {761EB615-D476-4423-888E-7D7665E769B1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {761EB615-D476-4423-888E-7D7665E769B1}.Debug|x64.ActiveCfg = Debug|Any CPU - {761EB615-D476-4423-888E-7D7665E769B1}.Debug|x64.Build.0 = Debug|Any CPU - {761EB615-D476-4423-888E-7D7665E769B1}.Debug|x86.ActiveCfg = Debug|Any CPU - {761EB615-D476-4423-888E-7D7665E769B1}.Debug|x86.Build.0 = Debug|Any CPU - {761EB615-D476-4423-888E-7D7665E769B1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {761EB615-D476-4423-888E-7D7665E769B1}.Release|Any CPU.Build.0 = Release|Any CPU - {761EB615-D476-4423-888E-7D7665E769B1}.Release|x64.ActiveCfg = Release|Any CPU - {761EB615-D476-4423-888E-7D7665E769B1}.Release|x64.Build.0 = Release|Any CPU - {761EB615-D476-4423-888E-7D7665E769B1}.Release|x86.ActiveCfg = Release|Any CPU - {761EB615-D476-4423-888E-7D7665E769B1}.Release|x86.Build.0 = Release|Any CPU {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|Any CPU.Build.0 = Debug|Any CPU {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -139,6 +127,18 @@ Global {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|x64.Build.0 = Release|Any CPU {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|x86.ActiveCfg = Release|Any CPU {F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|x86.Build.0 = Release|Any CPU + {BB512CA7-D013-4CDC-AD2B-1E5EA121ED59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB512CA7-D013-4CDC-AD2B-1E5EA121ED59}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB512CA7-D013-4CDC-AD2B-1E5EA121ED59}.Debug|x64.ActiveCfg = Debug|Any CPU + {BB512CA7-D013-4CDC-AD2B-1E5EA121ED59}.Debug|x64.Build.0 = Debug|Any CPU + {BB512CA7-D013-4CDC-AD2B-1E5EA121ED59}.Debug|x86.ActiveCfg = Debug|Any CPU + {BB512CA7-D013-4CDC-AD2B-1E5EA121ED59}.Debug|x86.Build.0 = Debug|Any CPU + {BB512CA7-D013-4CDC-AD2B-1E5EA121ED59}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB512CA7-D013-4CDC-AD2B-1E5EA121ED59}.Release|Any CPU.Build.0 = Release|Any CPU + {BB512CA7-D013-4CDC-AD2B-1E5EA121ED59}.Release|x64.ActiveCfg = Release|Any CPU + {BB512CA7-D013-4CDC-AD2B-1E5EA121ED59}.Release|x64.Build.0 = Release|Any CPU + {BB512CA7-D013-4CDC-AD2B-1E5EA121ED59}.Release|x86.ActiveCfg = Release|Any CPU + {BB512CA7-D013-4CDC-AD2B-1E5EA121ED59}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/tutorial/netstd/Client/Client.csproj b/tutorial/netstd/Client/Client.csproj index 732943f12be..df3f6c929d5 100644 --- a/tutorial/netstd/Client/Client.csproj +++ b/tutorial/netstd/Client/Client.csproj @@ -19,12 +19,13 @@ --> - net8.0 + net9.0 latestMajor Client Client Exe 0.22.0.0 + enable false false false @@ -32,7 +33,7 @@ - + diff --git a/tutorial/netstd/Client/Program.cs b/tutorial/netstd/Client/Program.cs index f1c5236e1af..93175fd46af 100644 --- a/tutorial/netstd/Client/Program.cs +++ b/tutorial/netstd/Client/Program.cs @@ -15,8 +15,8 @@ // specific language governing permissions and limitations // under the License. +using Microsoft.Extensions.Logging; using System; -using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; @@ -25,16 +25,12 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.DependencyInjection; using Thrift; using Thrift.Protocol; using Thrift.Transport; using Thrift.Transport.Client; using tutorial; -using shared; -#pragma warning disable IDE0063 // using #pragma warning disable IDE0057 // substr namespace Client @@ -58,7 +54,7 @@ public static void ConfigureLogging(ILoggingBuilder logging) public class Program { private static readonly ILogger Logger = LoggingHelper.CreateLogger(); - private static readonly TConfiguration Configuration = null; // new TConfiguration() if needed + private static readonly TConfiguration Configuration = new(); private static void DisplayHelp() { @@ -97,11 +93,12 @@ will run client with specified arguments (tcp transport and binary protocol by d "); } - public static void Main(string[] args) + public static async Task Main(string[] args) { - args ??= Array.Empty(); + args ??= []; - if (args.Any(x => x.StartsWith("-help", StringComparison.OrdinalIgnoreCase))) + // -help is rather unusual but we leave it for compatibility + if (args.Any(x => x.Equals("-help") || x.Equals("--help") || x.Equals("-h") || x.Equals("-?"))) { DisplayHelp(); return; @@ -109,10 +106,8 @@ public static void Main(string[] args) Logger.LogInformation("Starting client..."); - using (var source = new CancellationTokenSource()) - { - RunAsync(args, source.Token).GetAwaiter().GetResult(); - } + using var source = new CancellationTokenSource(); + await RunAsync(args, source.Token); } @@ -150,7 +145,7 @@ private static bool GetMultiplex(string[] args) private static Protocol GetProtocol(string[] args) { - var protocol = args.FirstOrDefault(x => x.StartsWith("-pr"))?.Split(':')?[1]; + var protocol = args.FirstOrDefault(x => x.StartsWith("-pr"))?.Split(':').Skip(1).Take(1).FirstOrDefault(); if (string.IsNullOrEmpty(protocol)) return Protocol.Binary; @@ -163,7 +158,7 @@ private static Protocol GetProtocol(string[] args) private static Buffering GetBuffering(string[] args) { - var buffering = args.FirstOrDefault(x => x.StartsWith("-bf"))?.Split(":")?[1]; + var buffering = args.FirstOrDefault(x => x.StartsWith("-bf"))?.Split(':').Skip(1).Take(1).FirstOrDefault(); if (string.IsNullOrEmpty(buffering)) return Buffering.None; @@ -176,7 +171,7 @@ private static Buffering GetBuffering(string[] args) private static Transport GetTransport(string[] args) { - var transport = args.FirstOrDefault(x => x.StartsWith("-tr"))?.Split(':')?[1]; + var transport = args.FirstOrDefault(x => x.StartsWith("-tr"))?.Split(':').Skip(1).Take(1).FirstOrDefault(); if (string.IsNullOrEmpty(transport)) return Transport.Tcp; @@ -191,7 +186,7 @@ private static Transport GetTransport(string[] args) private static TTransport MakeTransport(string[] args) { // construct endpoint transport - TTransport transport = null; + TTransport? transport = null; Transport selectedTransport = GetTransport(args); { switch (selectedTransport) @@ -241,7 +236,7 @@ private static TTransport MakeTransport(string[] args) private static int GetNumberOfClients(string[] args) { - var numClients = args.FirstOrDefault(x => x.StartsWith("-mc"))?.Split(':')?[1]; + var numClients = args.FirstOrDefault(x => x.StartsWith("-mc"))?.Split(':').Skip(1).Take(1).FirstOrDefault(); Logger.LogInformation("Selected # of clients: {numClients}", numClients); @@ -254,35 +249,42 @@ private static int GetNumberOfClients(string[] args) private static X509Certificate2 GetCertificate() { // due to files location in net core better to take certs from top folder - var certFile = GetCertPath(Directory.GetParent(Directory.GetCurrentDirectory())); - return new X509Certificate2(certFile, "ThriftTest"); + var dir = Directory.GetParent(Directory.GetCurrentDirectory()); + if (dir != null) + { + var certFile = GetCertPath(dir); + //return new X509Certificate2(certFile, "ThriftTest"); + return X509CertificateLoader.LoadPkcs12FromFile(certFile, "ThriftTest"); + } + else + { + Logger.LogError("Root path of {path} not found", Directory.GetCurrentDirectory()); + throw new Exception($"Root path of {Directory.GetCurrentDirectory()} not found"); + } } - private static string GetCertPath(DirectoryInfo di, int maxCount = 6) + private static string GetCertPath(DirectoryInfo? di, int maxCount = 6) { var topDir = di; - var certFile = - topDir.EnumerateFiles("ThriftTest.pfx", SearchOption.AllDirectories) - .FirstOrDefault(); + var certFile = topDir?.EnumerateFiles("ThriftTest.pfx", SearchOption.AllDirectories).FirstOrDefault(); if (certFile == null) { if (maxCount == 0) throw new FileNotFoundException("Cannot find file in directories"); - return GetCertPath(di.Parent, maxCount - 1); + return GetCertPath(di?.Parent, --maxCount); } return certFile.FullName; } - private static X509Certificate LocalCertificateSelectionCallback(object sender, + private static X509Certificate2 LocalCertificateSelectionCallback(object sender, string targetHost, X509CertificateCollection localCertificates, - X509Certificate remoteCertificate, string[] acceptableIssuers) + X509Certificate? remoteCertificate, string[] acceptableIssuers) { return GetCertificate(); } - private static bool CertValidator(object sender, X509Certificate certificate, - X509Chain chain, SslPolicyErrors sslPolicyErrors) + private static bool CertValidator(object sender, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslPolicyErrors) { return true; } diff --git a/tutorial/netstd/Interfaces/Interfaces.csproj b/tutorial/netstd/Interfaces/Interfaces.csproj index 2791dc8d5cc..9a243ea2ed8 100644 --- a/tutorial/netstd/Interfaces/Interfaces.csproj +++ b/tutorial/netstd/Interfaces/Interfaces.csproj @@ -19,10 +19,11 @@ --> - net8.0 + net9.0 Interfaces Interfaces 0.22.0.0 + enable false false false @@ -34,15 +35,15 @@ - + - - - + + + diff --git a/tutorial/netstd/Server/Program.cs b/tutorial/netstd/Server/Program.cs index 01e7336c50f..a3b12fca95b 100644 --- a/tutorial/netstd/Server/Program.cs +++ b/tutorial/netstd/Server/Program.cs @@ -15,6 +15,12 @@ // specific language governing permissions and limitations // under the License. +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using shared; using System; using System.Collections.Generic; using System.IO; @@ -23,20 +29,13 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using Thrift; +using Thrift.Processor; using Thrift.Protocol; using Thrift.Server; using Thrift.Transport; using Thrift.Transport.Server; using tutorial; -using shared; -using Thrift.Processor; -using System.Diagnostics; #pragma warning disable IDE0057 // substr @@ -61,27 +60,25 @@ public static void ConfigureLogging(ILoggingBuilder logging) public class Program { private static readonly ILogger Logger = LoggingHelper.CreateLogger(); - private static readonly TConfiguration Configuration = null; // new TConfiguration() if needed + private static readonly TConfiguration Configuration = new(); - public static void Main(string[] args) + public static async Task Main(string[] args) { - args ??= Array.Empty(); + args ??= []; - if (args.Any(x => x.StartsWith("-help", StringComparison.OrdinalIgnoreCase))) + // -help is rather unusual but we leave it for compatibility + if (args.Any(x => x.Equals("-help") || x.Equals("--help") || x.Equals("-h") || x.Equals("-?"))) { DisplayHelp(); return; } - using (var source = new CancellationTokenSource()) - { - RunAsync(args, source.Token).GetAwaiter().GetResult(); - - Logger.LogInformation("Press any key to stop..."); + using var source = new CancellationTokenSource(); + await RunAsync(args, source.Token); - Console.ReadLine(); - source.Cancel(); - } + Logger.LogInformation("Press any key to stop..."); + Console.ReadLine(); + source.Cancel(); Logger.LogInformation("Server stopped"); } @@ -149,7 +146,7 @@ private static bool GetMultiplex(string[] args) private static Protocol GetProtocol(string[] args) { - var protocol = args.FirstOrDefault(x => x.StartsWith("-pr"))?.Split(':')?[1]; + var protocol = args.FirstOrDefault(x => x.StartsWith("-pr"))?.Split(':').Skip(1).Take(1).FirstOrDefault(); if (string.IsNullOrEmpty(protocol)) return Protocol.Binary; @@ -162,7 +159,7 @@ private static Protocol GetProtocol(string[] args) private static Buffering GetBuffering(string[] args) { - var buffering = args.FirstOrDefault(x => x.StartsWith("-bf"))?.Split(":")?[1]; + var buffering = args.FirstOrDefault(x => x.StartsWith("-bf"))?.Split(':').Skip(1).Take(1).FirstOrDefault(); if (string.IsNullOrEmpty(buffering)) return Buffering.None; @@ -175,7 +172,7 @@ private static Buffering GetBuffering(string[] args) private static Transport GetTransport(string[] args) { - var transport = args.FirstOrDefault(x => x.StartsWith("-tr"))?.Split(':')?[1]; + var transport = args.FirstOrDefault(x => x.StartsWith("-tr"))?.Split(':').Skip(1).Take(1).FirstOrDefault(); if (string.IsNullOrEmpty(transport)) return Transport.Tcp; @@ -196,7 +193,7 @@ private static async Task RunSelectedConfigurationAsync(Transport transport, Buf _ => throw new ArgumentException("unsupported value $transport", nameof(transport)), }; - TTransportFactory transportFactory = buffering switch + TTransportFactory? transportFactory = buffering switch { Buffering.Buffered => new TBufferedTransport.Factory(), Buffering.Framed => new TFramedTransport.Factory(), @@ -258,34 +255,32 @@ private static X509Certificate2 GetCertificate() { // due to files location in net core better to take certs from top folder var certFile = GetCertPath(Directory.GetParent(Directory.GetCurrentDirectory())); - return new X509Certificate2(certFile, "ThriftTest"); + //return new X509Certificate2(certFile, "ThriftTest"); + return X509CertificateLoader.LoadPkcs12FromFile(certFile, "ThriftTest"); } - private static string GetCertPath(DirectoryInfo di, int maxCount = 6) + private static string GetCertPath(DirectoryInfo? di, int maxCount = 6) { var topDir = di; - var certFile = - topDir.EnumerateFiles("ThriftTest.pfx", SearchOption.AllDirectories) - .FirstOrDefault(); + var certFile = topDir?.EnumerateFiles("ThriftTest.pfx", SearchOption.AllDirectories).FirstOrDefault(); if (certFile == null) { if (maxCount == 0) throw new FileNotFoundException("Cannot find file in directories"); - return GetCertPath(di.Parent, maxCount - 1); + return GetCertPath(di?.Parent, --maxCount); } return certFile.FullName; } - private static X509Certificate LocalCertificateSelectionCallback(object sender, + private static X509Certificate2 LocalCertificateSelectionCallback(object sender, string targetHost, X509CertificateCollection localCertificates, - X509Certificate remoteCertificate, string[] acceptableIssuers) + X509Certificate? remoteCertificate, string[] acceptableIssuers) { return GetCertificate(); } - private static bool ClientCertValidator(object sender, X509Certificate certificate, - X509Chain chain, SslPolicyErrors sslPolicyErrors) + private static bool ClientCertValidator(object sender, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslPolicyErrors) { return true; } @@ -369,7 +364,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerF public class CalculatorAsyncHandler : Calculator.IAsync { - private readonly Dictionary _log = new(); + private readonly Dictionary _log = []; public CalculatorAsyncHandler() { @@ -394,12 +389,12 @@ public async Task add(int num1, int num2, CancellationToken cancellationTok return await Task.FromResult(num1 + num2); } - public async Task calculate(int logid, Work w, CancellationToken cancellationToken) + public async Task calculate(int logid, Work? w, CancellationToken cancellationToken) { - Logger.LogInformation("Calculate({logid}, [{w.Op},{w.Num1},{w.Num2}])", logid, w.Op, w.Num1, w.Num2); + Logger.LogInformation("Calculate({logid}, [{w.Op},{w.Num1},{w.Num2}])", logid, w?.Op, w?.Num1, w?.Num2); int val; - switch (w.Op) + switch (w?.Op) { case Operation.ADD: val = w.Num1 + w.Num2; @@ -431,7 +426,7 @@ public async Task calculate(int logid, Work w, CancellationToken cancellati { var io = new InvalidOperation { - WhatOp = (int) w.Op, + WhatOp = ((int?)w?.Op) ?? -1, Why = "Unknown operation" }; diff --git a/tutorial/netstd/Server/Server.csproj b/tutorial/netstd/Server/Server.csproj index 16b72e281b5..b50b69c04e5 100644 --- a/tutorial/netstd/Server/Server.csproj +++ b/tutorial/netstd/Server/Server.csproj @@ -19,12 +19,13 @@ --> - net8.0 + net9.0 latestMajor Server Server Exe 0.22.0.0 + enable false false false From 3a37d15341d648ca48538d6897eae819de648a89 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 14 Nov 2024 23:03:25 +0100 Subject: [PATCH 165/430] net9 sdk is NOT YET installed by default --- .github/workflows/build.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a740507448a..1e953b6ebba 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -312,9 +312,11 @@ jobs: sudo apt-get install -y --no-install-recommends curl openssl ca-certificates # the sdk is installed by default, but keep this step for reference -# - name: Set up .NET SDK -# run: | -# sudo apt-get install -y --no-install-recommends dotnet-sdk-9.0 +# caveat: net9 is (currently?) NOT installed, so manually again + - name: Set up .NET SDK + run: | + sudo apt-get install -y --no-install-recommends dotnet-sdk-9.0 +# end - name: Run bootstrap run: ./bootstrap.sh From 58d9ff5afbed3602bd7edfc0d1c038be67d06ab7 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Wed, 20 Nov 2024 22:54:46 -0800 Subject: [PATCH 166/430] Include license and notice files in published crate [skip ci] --- lib/rs/LICENSE | 1 + lib/rs/NOTICE | 1 + 2 files changed, 2 insertions(+) create mode 120000 lib/rs/LICENSE create mode 120000 lib/rs/NOTICE diff --git a/lib/rs/LICENSE b/lib/rs/LICENSE new file mode 120000 index 00000000000..30cff7403da --- /dev/null +++ b/lib/rs/LICENSE @@ -0,0 +1 @@ +../../LICENSE \ No newline at end of file diff --git a/lib/rs/NOTICE b/lib/rs/NOTICE new file mode 120000 index 00000000000..fb376cfaa47 --- /dev/null +++ b/lib/rs/NOTICE @@ -0,0 +1 @@ +../../NOTICE \ No newline at end of file From 39ce210f66e3a642590030559b4afc306db896fb Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sat, 16 Nov 2024 10:40:55 +0100 Subject: [PATCH 167/430] THRIFT-5835 Allow exceptions to be used as regular struct datatype Initial feature testcase added, compiler checks disabled. Patch: Jens Geyer --- compiler/cpp/src/thrift/parse/t_function.h | 6 +++ compiler/cpp/src/thrift/parse/t_list.h | 2 + compiler/cpp/src/thrift/parse/t_map.h | 2 + compiler/cpp/src/thrift/parse/t_set.h | 2 + compiler/cpp/src/thrift/parse/t_struct.h | 6 ++- compiler/cpp/src/thrift/parse/t_type.h | 3 ++ test/ExceptionStruct.thrift | 56 ++++++++++++++++++++++ 7 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 test/ExceptionStruct.thrift diff --git a/compiler/cpp/src/thrift/parse/t_function.h b/compiler/cpp/src/thrift/parse/t_function.h index 57cf5ffce37..d2cb19bbc3a 100644 --- a/compiler/cpp/src/thrift/parse/t_function.h +++ b/compiler/cpp/src/thrift/parse/t_function.h @@ -85,17 +85,23 @@ class t_function : public t_doc { void validate() const { get_returntype()->validate(); + +#ifndef ALLOW_EXCEPTIONS_AS_TYPE if (get_returntype()->get_true_type()->is_xception()) { failure("method %s(): exception type \"%s\" cannot be used as function return", get_name().c_str(), get_returntype()->get_name().c_str()); } +#endif std::vector::const_iterator it; std::vector list = get_arglist()->get_members(); for(it=list.begin(); it != list.end(); ++it) { (*it)->get_type()->validate(); + +#ifndef ALLOW_EXCEPTIONS_AS_TYPE if( (*it)->get_type()->get_true_type()->is_xception()) { failure("method %s(): exception type \"%s\" cannot be used as function argument %s", get_name().c_str(), (*it)->get_type()->get_name().c_str(), (*it)->get_name().c_str()); } +#endif } } diff --git a/compiler/cpp/src/thrift/parse/t_list.h b/compiler/cpp/src/thrift/parse/t_list.h index 5daa412bdcf..162281cc088 100644 --- a/compiler/cpp/src/thrift/parse/t_list.h +++ b/compiler/cpp/src/thrift/parse/t_list.h @@ -35,9 +35,11 @@ class t_list : public t_container { bool is_list() const override { return true; } void validate() const { +#ifndef ALLOW_EXCEPTIONS_AS_TYPE if( get_elem_type()->get_true_type()->is_xception()) { failure("exception type \"%s\" cannot be used inside a list", get_elem_type()->get_name().c_str()); } +#endif } private: diff --git a/compiler/cpp/src/thrift/parse/t_map.h b/compiler/cpp/src/thrift/parse/t_map.h index 444fca79800..30a8b06c9b9 100644 --- a/compiler/cpp/src/thrift/parse/t_map.h +++ b/compiler/cpp/src/thrift/parse/t_map.h @@ -38,12 +38,14 @@ class t_map : public t_container { bool is_map() const override { return true; } void validate() const { +#ifndef ALLOW_EXCEPTIONS_AS_TYPE if( get_key_type()->get_true_type()->is_xception()) { failure("exception type \"%s\" cannot be used inside a map", get_key_type()->get_name().c_str()); } if( get_val_type()->get_true_type()->is_xception()) { failure("exception type \"%s\" cannot be used inside a map", get_val_type()->get_name().c_str()); } +#endif } private: diff --git a/compiler/cpp/src/thrift/parse/t_set.h b/compiler/cpp/src/thrift/parse/t_set.h index 4a02dcc08ae..88de93f44c4 100644 --- a/compiler/cpp/src/thrift/parse/t_set.h +++ b/compiler/cpp/src/thrift/parse/t_set.h @@ -37,9 +37,11 @@ class t_set : public t_container { bool is_set() const override { return true; } void validate() const { +#ifndef ALLOW_EXCEPTIONS_AS_TYPE if( get_elem_type()->get_true_type()->is_xception()) { failure("exception type \"%s\" cannot be used inside a set", get_elem_type()->get_name().c_str()); } +#endif } private: diff --git a/compiler/cpp/src/thrift/parse/t_struct.h b/compiler/cpp/src/thrift/parse/t_struct.h index 941712d80ef..3aa67c0e16a 100644 --- a/compiler/cpp/src/thrift/parse/t_struct.h +++ b/compiler/cpp/src/thrift/parse/t_struct.h @@ -112,9 +112,8 @@ class t_struct : public t_type { const members_type& get_sorted_members() const { return members_in_id_order_; } bool is_struct() const override { return !is_xception_; } - bool is_xception() const override { return is_xception_; } - + bool is_method_xcepts() const override { return is_method_xcepts_; } bool is_union() const { return is_union_; } t_field* get_field_by_name(std::string field_name) { @@ -144,11 +143,14 @@ class t_struct : public t_type { std::vector list = get_members(); for(it=list.begin(); it != list.end(); ++it) { (*it)->get_type()->validate(); + +#ifndef ALLOW_EXCEPTIONS_AS_TYPE if (!is_method_xcepts_) { // this is in fact the only legal usage for any exception type if( (*it)->get_type()->get_true_type()->is_xception()) { failure("%s %s: exception type \"%s\" cannot be used as member field type %s", what.c_str(), get_name().c_str(), (*it)->get_type()->get_name().c_str(), (*it)->get_name().c_str()); } } +#endif } } diff --git a/compiler/cpp/src/thrift/parse/t_type.h b/compiler/cpp/src/thrift/parse/t_type.h index f4082426c8e..d087601aeca 100644 --- a/compiler/cpp/src/thrift/parse/t_type.h +++ b/compiler/cpp/src/thrift/parse/t_type.h @@ -26,6 +26,8 @@ #include #include +#define ALLOW_EXCEPTIONS_AS_TYPE + class t_program; /** @@ -54,6 +56,7 @@ class t_type : public t_doc { virtual bool is_enum() const { return false; } virtual bool is_struct() const { return false; } virtual bool is_xception() const { return false; } + virtual bool is_method_xcepts() const { return false; } virtual bool is_container() const { return false; } virtual bool is_list() const { return false; } virtual bool is_set() const { return false; } diff --git a/test/ExceptionStruct.thrift b/test/ExceptionStruct.thrift new file mode 100644 index 00000000000..b962209b3d1 --- /dev/null +++ b/test/ExceptionStruct.thrift @@ -0,0 +1,56 @@ +/* + * 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 * test.ExceptionStruct + +enum ErrorCode { + GenericError, + ServerOverload, + InvalidData +} + +struct GetRequest { + 1: string id + 2: binary data // some arbitrary data +} + +struct GetResponse { + 1: i32 job_nr + 2: binary data // some arbitrary data +} + +struct BatchGetRequest { + 1: list requests +} + +struct BatchGetResponse { + 1: map responses, // key is id + 2: map errors, // key is id +} + +exception SomeException { + 2: ErrorCode error +} + +service Foo { + GetResponse get(1: GetRequest request) throws(1: SomeException error); + BatchGetResponse batchGet(1: BatchGetRequest request) throws(1: SomeException error); // may or may not be the same exception type, only throw exception when full request failed +} + +# eof From e9f63e0bbdc9316f57dd2458c27ff18ed1df60fe Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sat, 23 Nov 2024 01:01:13 +0100 Subject: [PATCH 168/430] THRIFT-5837 Delphi implementation for THRIFT-5835 Client: Delphi Patch: Jens Geyer This closes #3068 --- .../src/thrift/generate/t_delphi_generator.cc | 984 ++++++++---------- lib/delphi/test/serializer/SerializerData.dpr | 19 +- .../test/serializer/SerializerData.dproj | 33 +- .../test/serializer/SimpleException.thrift | 32 + .../test/serializer/TestSerializer.Data.pas | 49 + .../test/serializer/TestSerializer.Tests.pas | 116 ++- lib/delphi/test/serializer/TestSerializer.dpr | 2 + .../test/serializer/TestSerializer.dproj | 28 +- 8 files changed, 652 insertions(+), 611 deletions(-) create mode 100644 lib/delphi/test/serializer/SimpleException.thrift diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc index 670383281f7..ca371f74935 100644 --- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc @@ -118,8 +118,7 @@ class t_delphi_generator : public t_oop_generator { void generate_delphi_property(ostream& out, bool struct_is_exception, t_field* tfield, - bool isPublic, - std::string fieldPrefix = ""); + bool isPublic); void generate_delphi_isset_reader_writer_definition(ostream& out, t_field* tfield, bool is_xception); void generate_delphi_property_reader_definition(ostream& out, t_field* tfield, @@ -141,9 +140,7 @@ class t_delphi_generator : public t_oop_generator { t_field* tfield, std::string fieldPrefix, bool is_xception_class, - bool is_union, - bool is_xception_factory, - std::string xception_factory_name); + bool is_union); void generate_delphi_clear_union_value(ostream& out, std::string cls_prefix, std::string name, @@ -151,40 +148,30 @@ class t_delphi_generator : public t_oop_generator { t_field* tfield, std::string fieldPrefix, bool is_xception_class, - bool is_union, - bool is_xception_factory, - std::string xception_factory_name); + bool is_union); void generate_delphi_isset_reader_writer_impl(ostream& out, - std::string cls_prefix, - std::string name, - t_type* type, - t_field* tfield, - std::string fieldPrefix, - bool is_xception); + std::string cls_prefix, + std::string name, + t_type* type, + t_field* tfield, + std::string fieldPrefix, + bool is_xception_class); void generate_delphi_struct_writer_impl(ostream& out, std::string cls_prefix, t_struct* tstruct, - bool is_exception, - bool is_x_factory); - void generate_delphi_struct_result_writer_impl(ostream& out, - std::string cls_prefix, - t_struct* tstruct, - bool is_exception, - bool is_x_factory); + bool is_exception); void generate_delphi_struct_tostring_impl(ostream& out, std::string cls_prefix, t_struct* tstruct, - bool is_exception, - bool is_x_factory); + bool is_exception); void add_delphi_uses_list(string unitname); void generate_delphi_struct_reader_impl(ostream& out, std::string cls_prefix, t_struct* tstruct, - bool is_exception, - bool is_x_factory); + bool is_exception); void generate_delphi_create_exception_impl(ostream& out, string cls_prefix, t_struct* tstruct, @@ -200,12 +187,14 @@ class t_delphi_generator : public t_oop_generator { std::ostream& out, std::string name, t_type* type, - t_const_value* value); + t_const_value* value, + bool is_const_class); void initialize_field(std::ostream& vars, std::ostream& out, std::string name, t_type* type, - t_const_value* value); + t_const_value* value, + bool is_const_class); void finalize_field(std::ostream& out, std::string name, t_type* type, @@ -213,7 +202,6 @@ class t_delphi_generator : public t_oop_generator { std::string cls_nm = ""); std::string render_const_value(std::ostream& local_vars, std::ostream& out, - std::string name, t_type* type, t_const_value* value, bool guidAsLiteral); @@ -225,32 +213,27 @@ class t_delphi_generator : public t_oop_generator { std::string cls_nm = ""); std::string make_constants_classname(); - void generate_delphi_struct(t_struct* tstruct, bool is_exception); + void generate_delphi_struct(t_struct* tstruct); + void generate_delphi_exception(t_struct* tstruct); void generate_delphi_struct_impl(ostream& out, std::string cls_prefix, t_struct* tstruct, - bool is_exception, - bool is_result = false, - bool is_x_factory = false); + bool is_result, + bool is_const_class); + void generate_delphi_exception_impl(ostream& out, + std::string cls_prefix, + t_struct* tstruct); void print_delphi_struct_type_factory_func(ostream& out, t_struct* tstruct); void generate_delphi_struct_type_factory(ostream& out, std::string cls_prefix, - t_struct* tstruct, - bool is_exception, - bool is_result = false, - bool is_x_factory = false); + t_struct* tstruct); void generate_delphi_struct_type_factory_registration(ostream& out, std::string cls_prefix, - t_struct* tstruct, - bool is_exception, - bool is_result = false, - bool is_x_factory = false); + t_struct* tstruct); void generate_delphi_struct_definition(std::ostream& out, - t_struct* tstruct, - bool is_xception = false, - bool in_class = false, - bool is_result = false, - bool is_x_factory = false); + t_struct* tstruct); + void generate_delphi_exception_definition(std::ostream& out, + t_struct* tstruct); void generate_function_helpers(t_function* tfunction); void generate_service_interface(t_service* tservice); @@ -327,9 +310,7 @@ class t_delphi_generator : public t_oop_generator { std::string type_name(t_type* ttype, bool b_cls = false, - bool b_no_postfix = false, - bool b_exception_factory = false, - bool b_full_exception_factory = false); + bool b_no_postfix = false); std::string normalize_clsnm(std::string name, std::string prefix, bool b_no_check_keyword = false); @@ -339,7 +320,6 @@ class t_delphi_generator : public t_oop_generator { std::string base_type_name(t_base_type* tbase); std::string declare_field(t_field* tfield, - bool init = false, std::string prefix = "", bool is_xception_class = false); std::string function_signature(t_function* tfunction, @@ -369,10 +349,7 @@ class t_delphi_generator : public t_oop_generator { void generate_delphi_docstring_comment(std::ostream& out, string contents); bool type_can_be_null(t_type* ttype) { - while (ttype->is_typedef()) { - ttype = ((t_typedef*)ttype)->get_type(); - } - + ttype = ttype->get_true_type(); return ttype->is_container() || ttype->is_struct() || ttype->is_xception(); } @@ -426,10 +403,10 @@ class t_delphi_generator : public t_oop_generator { }; // reserved exception class method names (lowercase!) - const std::string DELPHI_RESERVED_METHOD_EXCEPTION[23] = { + const std::string DELPHI_RESERVED_METHOD_EXCEPTION[24] = { "setinnerexception", "setstackinfo", "getstacktrace", "raisingexception", "createfmt", "createres", "createresfmt", "createhelp", "createfmthelp", "createreshelp", "createresfmthelp", "getbaseexception", - "baseexception", "helpcontext", "innerexception", "message", "stacktrace", "stackinfo", + "baseexception", "helpcontext", "innerexception", "exceptiondata", "message", "stacktrace", "stackinfo", "getexceptionstackinfoproc", "getstackinfostringproc", "cleanupstackinfoproc", "raiseouterexception", "throwouterexception" }; @@ -830,11 +807,11 @@ void t_delphi_generator::generate_forward_declaration(t_struct* tstruct) { has_forward = true; pdebug("forward declaration of %s\n", type_name(tstruct).c_str()); - string what = tstruct->is_xception() ? "class" : "interface"; - indent_up(); - indent(s_forward_decr) << type_name(tstruct, tstruct->is_xception(), true) << " = " << what << ";" - << '\n'; + indent(s_forward_decr) << type_name(tstruct, false, true) << " = interface;" << '\n'; + if( tstruct->is_xception()) { + indent(s_forward_decr) << type_name(tstruct, true, true) << " = class;" << '\n'; + } indent_down(); add_defined_type(tstruct); @@ -1070,7 +1047,8 @@ void t_delphi_generator::generate_consts(std::vector consts) { code, prop_name((*c_iter)->get_name(), false, "F"), (*c_iter)->get_type(), - (*c_iter)->get_value()); + (*c_iter)->get_value(), + true); } indent_down_impl(); @@ -1114,7 +1092,8 @@ void t_delphi_generator::generate_consts(std::vector consts) { code, constants_class + "." + prop_name((*c_iter)->get_name(), false, "F"), (*c_iter)->get_type(), - (*c_iter)->get_value()); + (*c_iter)->get_value(), + true); } } indent_down_impl(); @@ -1175,7 +1154,7 @@ void t_delphi_generator::print_const_def_value(std::ostream& vars, if (field_type == nullptr) { throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string(); } - string val = render_const_value(vars, out, name, field_type, v_iter->second, false); + string val = render_const_value(vars, out, field_type, v_iter->second, false); indent_impl(out) << cls_prefix << normalize_name(name) << "." << prop_name(v_iter->first->get_string(), type->is_xception()) << " := " << val << ";" << '\n'; @@ -1186,8 +1165,8 @@ void t_delphi_generator::print_const_def_value(std::ostream& vars, const map& val = value->get_map(); map::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { - string key = render_const_value(vars, out, name, ktype, v_iter->first, false); - string val = render_const_value(vars, out, name, vtype, v_iter->second, false); + string key = render_const_value(vars, out, ktype, v_iter->first, false); + string val = render_const_value(vars, out, vtype, v_iter->second, false); indent_impl(out) << cls_prefix << normalize_name(name) << "[" << key << "]" << " := " << val << ";" << '\n'; } @@ -1202,7 +1181,7 @@ void t_delphi_generator::print_const_def_value(std::ostream& vars, const vector& val = value->get_list(); vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { - string val = render_const_value(vars, out, name, etype, *v_iter, false); + string val = render_const_value(vars, out, etype, *v_iter, false); indent_impl(out) << cls_prefix << normalize_name(name) << ".Add(" << val << ");" << '\n'; } } @@ -1217,10 +1196,7 @@ void t_delphi_generator::print_private_field(std::ostream& out, } bool t_delphi_generator::const_needs_var(t_type* type) { - t_type* truetype = type; - while (truetype->is_typedef()) { - truetype = ((t_typedef*)truetype)->get_type(); - } + t_type* truetype = type->get_true_type(); if(!truetype->is_base_type()) { return true; @@ -1247,7 +1223,7 @@ void t_delphi_generator::print_const_prop(std::ostream& out, << '\n'; } else { std::ostringstream vars; // dummy - string v2 = render_const_value(vars, out, name, type, value, true); + string v2 = render_const_value(vars, out, type, value, true); indent(out) << "const " << name << " = " << v2 << ";" << '\n'; } } @@ -1256,23 +1232,20 @@ void t_delphi_generator::print_const_value(std::ostream& vars, std::ostream& out, string name, t_type* type, - t_const_value* value) { - t_type* truetype = type; - while (truetype->is_typedef()) { - truetype = ((t_typedef*)truetype)->get_type(); - } + t_const_value* value, + bool is_const_class) { + t_type* truetype = type->get_true_type(); if (truetype->is_base_type()) { - if(const_needs_var(type)) { - string the_value = render_const_value( vars, out, name, type, value, false); + if(const_needs_var(type) || (!is_const_class)) { + string the_value = render_const_value( vars, out, type, value, false); indent_impl(out) << name << " := " << the_value << ";" << '\n'; } } else if (truetype->is_enum()) { indent_impl(out) << name << " := " << type_name(type) << "." << value->get_identifier_name() << ";" << '\n'; } else { - string typname; - typname = type_name(truetype, true, false, type->is_xception(), type->is_xception()); + string typname = type_name(truetype, true, false/*, type->is_xception(), type->is_xception()*/); indent_impl(out) << name << " := " << typname << ".Create;" << '\n'; print_const_def_value(vars, out, name, truetype, value); } @@ -1282,8 +1255,9 @@ void t_delphi_generator::initialize_field(std::ostream& vars, std::ostream& out, string name, t_type* type, - t_const_value* value) { - print_const_value(vars, out, name, type, value); + t_const_value* value, + bool is_const_class) { + print_const_value(vars, out, name, type, value, is_const_class); } void t_delphi_generator::finalize_field(std::ostream& out, @@ -1300,16 +1274,10 @@ void t_delphi_generator::finalize_field(std::ostream& out, string t_delphi_generator::render_const_value(ostream& vars, ostream& out, - string name, t_type* type, t_const_value* value, bool guidAsLiteral) { - (void)name; - - t_type* truetype = type; - while (truetype->is_typedef()) { - truetype = ((t_typedef*)truetype)->get_type(); - } + t_type* truetype = type->get_true_type(); std::ostringstream render; @@ -1360,7 +1328,7 @@ string t_delphi_generator::render_const_value(ostream& vars, } else { string t = tmp("tmp"); vars << " " << t << " : " << type_name(type) << ";" << '\n'; - print_const_value(vars, out, t, type, value); + print_const_value(vars, out, t, type, value, true); render << t; } @@ -1368,54 +1336,53 @@ string t_delphi_generator::render_const_value(ostream& vars, } void t_delphi_generator::generate_struct(t_struct* tstruct) { - generate_delphi_struct(tstruct, false); + generate_delphi_struct(tstruct); } void t_delphi_generator::generate_xception(t_struct* txception) { - generate_delphi_struct(txception, true); + generate_delphi_exception(txception); } -void t_delphi_generator::generate_delphi_struct(t_struct* tstruct, bool is_exception) { +void t_delphi_generator::generate_delphi_struct(t_struct* tstruct) { indent_up(); - generate_delphi_struct_definition(s_struct, tstruct, is_exception); + generate_delphi_struct_definition(s_struct, tstruct); indent_down(); add_defined_type(tstruct); - generate_delphi_struct_impl(s_struct_impl, "", tstruct, is_exception); + generate_delphi_struct_impl(s_struct_impl, "", tstruct, false, false/*?*/); if (register_types_) { - generate_delphi_struct_type_factory(s_type_factory_funcs, "", tstruct, is_exception); - generate_delphi_struct_type_factory_registration(s_type_factory_registration, - "", - tstruct, - is_exception); + generate_delphi_struct_type_factory(s_type_factory_funcs, "", tstruct); + generate_delphi_struct_type_factory_registration(s_type_factory_registration, "", tstruct); } } -void t_delphi_generator::generate_delphi_struct_impl(ostream& out, - string cls_prefix, - t_struct* tstruct, - bool is_exception, - bool is_result, - bool is_x_factory) { - - if (is_exception && (!is_x_factory)) { - generate_delphi_struct_impl(out, cls_prefix, tstruct, is_exception, is_result, true); - } +void t_delphi_generator::generate_delphi_exception(t_struct* tstruct) { + // generate exception data class first + generate_delphi_struct(tstruct); - string cls_nm; + indent_up(); + generate_delphi_exception_definition(s_struct, tstruct); + indent_down(); - string exception_factory_name; + add_defined_type(tstruct); - if (is_exception) { - exception_factory_name = normalize_clsnm(tstruct->get_name(), "", true) + "Factory"; + generate_delphi_exception_impl(s_struct_impl, "", tstruct); + /* + if (register_types_) { + generate_delphi_exception_type_factory(s_type_factory_funcs, "", tstruct); + generate_delphi_exception_type_factory_registration(s_type_factory_registration, "", tstruct); } + */ +} - if (is_exception) { - cls_nm = type_name(tstruct, true, (!is_x_factory), is_x_factory, true); - } else { - cls_nm = type_name(tstruct, true, false); - } +void t_delphi_generator::generate_delphi_struct_impl(ostream& out, + string cls_prefix, + t_struct* tstruct, + bool is_result, + bool is_const_class) { + + string cls_nm = type_name(tstruct, true, false); std::ostringstream vars, code; @@ -1424,26 +1391,22 @@ void t_delphi_generator::generate_delphi_struct_impl(ostream& out, indent_up_impl(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - t_type* t = (*m_iter)->get_type(); - while (t->is_typedef()) { - t = ((t_typedef*)t)->get_type(); - } + t_type* truetype = (*m_iter)->get_type()->get_true_type(); if ((*m_iter)->get_value() != nullptr) { initialize_field(vars, code, - prop_name((*m_iter)->get_name(), is_exception, ""), - t, - (*m_iter)->get_value()); + prop_name((*m_iter)->get_name(), false, "F"), + truetype, + (*m_iter)->get_value(), + is_const_class); if ((*m_iter)->get_req() != t_field::T_REQUIRED) { - indent_impl(code) << prop_name((*m_iter), is_exception, "F__isset_") << " := True;" - << '\n'; + indent_impl(code) << prop_name((*m_iter), false, "F__isset_") << " := True;" << '\n'; } } } indent_down_impl(); - indent_impl(out) << "constructor " << cls_prefix << cls_nm << "." - << "Create;" << '\n'; + indent_impl(out) << "constructor " << cls_prefix << cls_nm << ".Create;" << '\n'; if (!vars.str().empty()) { out << "var" << '\n'; @@ -1452,11 +1415,7 @@ void t_delphi_generator::generate_delphi_struct_impl(ostream& out, indent_impl(out) << "begin" << '\n'; indent_up_impl(); - if (is_exception && (!is_x_factory)) { - indent_impl(out) << "inherited Create('');" << '\n'; - } else { - indent_impl(out) << "inherited;" << '\n'; - } + indent_impl(out) << "inherited;" << '\n'; if (!code.str().empty()) { out << code.str(); @@ -1465,82 +1424,25 @@ void t_delphi_generator::generate_delphi_struct_impl(ostream& out, indent_down_impl(); indent_impl(out) << "end;" << '\n' << '\n'; - if ((members.size() > 0) && is_exception && (!is_x_factory)) { - indent_impl(out) << "constructor " << cls_prefix << cls_nm << "." - << "Create(" << constructor_argument_list(tstruct, indent_impl()) << ");" - << '\n'; - indent_impl(out) << "begin" << '\n'; - indent_up_impl(); - indent_impl(out) << "Create;" << '\n'; - for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - string propname = prop_name((*m_iter)->get_name(), is_exception); - string param_name = constructor_param_name((*m_iter)->get_name()); - indent_impl(out) << propname << " := " << param_name << ";" << '\n'; - } - indent_impl(out) << "UpdateMessageProperty;" << '\n'; - indent_down_impl(); - indent_impl(out) << "end;" << '\n' << '\n'; - } - - indent_impl(out) << "destructor " << cls_prefix << cls_nm << "." - << "Destroy;" << '\n'; + indent_impl(out) << "destructor " << cls_prefix << cls_nm << ".Destroy;" << '\n'; indent_impl(out) << "begin" << '\n'; indent_up_impl(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - t_type* t = (*m_iter)->get_type(); - while (t->is_typedef()) { - t = ((t_typedef*)t)->get_type(); - } - finalize_field(out, prop_name(*m_iter, is_exception), t, (*m_iter)->get_value()); + t_type* t = (*m_iter)->get_type()->get_true_type(); + finalize_field(out, prop_name(*m_iter, false), t, (*m_iter)->get_value()); } indent_impl(out) << "inherited;" << '\n'; indent_down_impl(); indent_impl(out) << "end;" << '\n' << '\n'; - if (is_exception && (!is_x_factory)) { - indent_impl(out) << "function " << cls_prefix << cls_nm << "." << exception_factory_name - << ": I" << exception_factory_name << ";" << '\n'; - indent_impl(out) << "begin" << '\n'; - indent_up_impl(); - indent_impl(out) << "if F" << exception_factory_name << " = nil" << '\n'; - indent_impl(out) << "then F" << exception_factory_name << " := T" << exception_factory_name << "Impl.Create;" << '\n' << '\n'; - indent_impl(out) << "result := F" << exception_factory_name << ";" << '\n'; - indent_down_impl(); - indent_impl(out) << "end;" << '\n' << '\n'; - indent_impl(out) << "function " << cls_prefix << cls_nm << ".QueryInterface(const IID: TGUID; out Obj): HRESULT;" << '\n'; - indent_impl(out) << "begin" << '\n'; - indent_up_impl(); - indent_impl(out) << "if GetInterface(IID, Obj)" << '\n'; - indent_impl(out) << "then result := S_OK" << '\n'; - indent_impl(out) << "else result := E_NOINTERFACE;" << '\n'; - indent_down_impl(); - indent_impl(out) << "end;" << '\n' << '\n'; - indent_impl(out) << "function " << cls_prefix << cls_nm << "._AddRef: Integer;" << '\n'; - indent_impl(out) << "begin" << '\n'; - indent_up_impl(); - indent_impl(out) << "result := -1; // not refcounted" << '\n'; - indent_down_impl(); - indent_impl(out) << "end;" << '\n' << '\n'; - indent_impl(out) << "function " << cls_prefix << cls_nm << "._Release: Integer;" << '\n'; - indent_impl(out) << "begin" << '\n'; - indent_up_impl(); - indent_impl(out) << "result := -1; // not refcounted" << '\n'; - indent_down_impl(); - indent_impl(out) << "end;" << '\n' << '\n'; - } - if (tstruct->is_union()) { - indent_impl(out) << "procedure " << cls_prefix << cls_nm << "." - << "ClearUnionValues;" << '\n'; + indent_impl(out) << "procedure " << cls_prefix << cls_nm << ".ClearUnionValues;" << '\n'; indent_impl(out) << "begin" << '\n'; indent_up_impl(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - t_type* t = (*m_iter)->get_type(); - while (t->is_typedef()) { - t = ((t_typedef*)t)->get_type(); - } + t_type* t = (*m_iter)->get_type()->get_true_type(); generate_delphi_clear_union_value(out, cls_prefix, @@ -1548,47 +1450,138 @@ void t_delphi_generator::generate_delphi_struct_impl(ostream& out, t, *m_iter, "F", - is_exception, - tstruct->is_union(), - is_x_factory, - exception_factory_name); + false, + tstruct->is_union()); } indent_down_impl(); indent_impl(out) << "end;" << '\n' << '\n'; } for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - t_type* t = (*m_iter)->get_type(); - while (t->is_typedef()) { - t = ((t_typedef*)t)->get_type(); - } - generate_delphi_property_reader_impl(out, cls_prefix, cls_nm, t, *m_iter, "F", is_exception); + t_type* t = (*m_iter)->get_type()->get_true_type(); + generate_delphi_property_reader_impl(out, cls_prefix, cls_nm, t, *m_iter, "F", false); generate_delphi_property_writer_impl(out, cls_prefix, cls_nm, t, *m_iter, "F", - is_exception, - tstruct->is_union(), - is_x_factory, - exception_factory_name); + false, + tstruct->is_union()); if ((*m_iter)->get_req() != t_field::T_REQUIRED) { - generate_delphi_isset_reader_writer_impl(out, cls_prefix, cls_nm, t, *m_iter, "F", is_exception); + generate_delphi_isset_reader_writer_impl(out, cls_prefix, cls_nm, t, *m_iter, "F", false); } } - generate_delphi_struct_reader_impl(out, cls_prefix, tstruct, is_exception, is_x_factory); - if (is_result) { - generate_delphi_struct_result_writer_impl(out, cls_prefix, tstruct, is_exception, is_x_factory); - } else { - generate_delphi_struct_writer_impl(out, cls_prefix, tstruct, is_exception, is_x_factory); + generate_delphi_struct_reader_impl(out, cls_prefix, tstruct, false); + generate_delphi_struct_writer_impl(out, cls_prefix, tstruct, false); + generate_delphi_struct_tostring_impl(out, cls_prefix, tstruct, false); +} + +void t_delphi_generator::generate_delphi_exception_impl(ostream& out, + string cls_prefix, + t_struct* tstruct) { + + string cls_nm = type_name(tstruct, true, true/*, false, true*/); + + const vector& members = tstruct->get_members(); + vector::const_iterator m_iter; + + indent_impl(out) << "constructor " << cls_prefix << cls_nm << ".Create;" << '\n'; + indent_impl(out) << "begin" << '\n'; + indent_up_impl(); + indent_impl(out) << "inherited Create('');" << '\n'; + indent_impl(out) << "FData := " << type_name(tstruct, true, false) << ".Create;" << '\n'; + indent_down_impl(); + indent_impl(out) << "end;" << '\n' << '\n'; + + if (members.size() > 0) { + indent_impl(out) << "constructor " << cls_prefix << cls_nm << "." + << "Create(" << constructor_argument_list(tstruct, indent_impl()) << ");" + << '\n'; + indent_impl(out) << "begin" << '\n'; + indent_up_impl(); + indent_impl(out) << "Create;" << '\n'; + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + string propname = prop_name((*m_iter)->get_name(), true); + string param_name = constructor_param_name((*m_iter)->get_name()); + indent_impl(out) << propname << " := " << param_name << ";" << '\n'; + } + indent_impl(out) << "UpdateMessageProperty;" << '\n'; + indent_down_impl(); + indent_impl(out) << "end;" << '\n' << '\n'; + } + + indent_impl(out) << "constructor " << cls_prefix << cls_nm << "." + << "Create(const aData: " << type_name(tstruct, false, false) << ");" + << '\n'; + indent_impl(out) << "begin" << '\n'; + indent_up_impl(); + indent_impl(out) << "inherited Create('');" << '\n'; + indent_impl(out) << "if aData <> nil" << '\n'; + indent_impl(out) << "then FData := aData" << '\n'; + indent_impl(out) << "else ASSERT(FALSE,'Invalid argument');" << '\n'; + indent_impl(out) << "UpdateMessageProperty;" << '\n'; + indent_down_impl(); + indent_impl(out) << "end;" << '\n' << '\n'; + + indent_impl(out) << "destructor " << cls_prefix << cls_nm << "." + << "Destroy;" << '\n'; + indent_impl(out) << "begin" << '\n'; + indent_up_impl(); + + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + t_type* t = (*m_iter)->get_type()->get_true_type(); + finalize_field(out, prop_name(*m_iter, true), t, (*m_iter)->get_value()); } - generate_delphi_struct_tostring_impl(out, cls_prefix, tstruct, is_exception, is_x_factory); - if (is_exception && is_x_factory) { - generate_delphi_create_exception_impl(out, cls_prefix, tstruct, is_exception); + indent_impl(out) << "inherited;" << '\n'; + indent_down_impl(); + indent_impl(out) << "end;" << '\n' << '\n'; + + // non-refcounted IUnknown impl + indent_impl(out) << "function " << cls_prefix << cls_nm << ".QueryInterface(const IID: TGUID; out Obj): HRESULT;" << '\n'; + indent_impl(out) << "begin" << '\n'; + indent_up_impl(); + indent_impl(out) << "if GetInterface(IID, Obj)" << '\n'; + indent_impl(out) << "then result := S_OK" << '\n'; + indent_impl(out) << "else result := E_NOINTERFACE;" << '\n'; + indent_down_impl(); + indent_impl(out) << "end;" << '\n' << '\n'; + indent_impl(out) << "function " << cls_prefix << cls_nm << "._AddRef: Integer;" << '\n'; + indent_impl(out) << "begin" << '\n'; + indent_up_impl(); + indent_impl(out) << "result := -1; // not refcounted" << '\n'; + indent_down_impl(); + indent_impl(out) << "end;" << '\n' << '\n'; + indent_impl(out) << "function " << cls_prefix << cls_nm << "._Release: Integer;" << '\n'; + indent_impl(out) << "begin" << '\n'; + indent_up_impl(); + indent_impl(out) << "result := -1; // not refcounted" << '\n'; + indent_down_impl(); + indent_impl(out) << "end;" << '\n' << '\n'; + + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + t_type* t = (*m_iter)->get_type()->get_true_type(); + generate_delphi_property_reader_impl(out, cls_prefix, cls_nm, t, *m_iter, "", true); + generate_delphi_property_writer_impl(out, + cls_prefix, + cls_nm, + t, + *m_iter, + "", + true, + tstruct->is_union()); + if ((*m_iter)->get_req() != t_field::T_REQUIRED) { + generate_delphi_isset_reader_writer_impl(out, cls_prefix, cls_nm, t, *m_iter, "", true); + } } + + generate_delphi_struct_reader_impl(out, cls_prefix, tstruct, true); + generate_delphi_struct_writer_impl(out, cls_prefix, tstruct, true); + generate_delphi_struct_tostring_impl(out, cls_prefix, tstruct, true); + + generate_delphi_create_exception_impl(out, cls_prefix, tstruct, true); } void t_delphi_generator::print_delphi_struct_type_factory_func(ostream& out, t_struct* tstruct) { @@ -1600,17 +1593,8 @@ void t_delphi_generator::print_delphi_struct_type_factory_func(ostream& out, t_s void t_delphi_generator::generate_delphi_struct_type_factory(ostream& out, string cls_prefix, - t_struct* tstruct, - bool is_exception, - bool is_result, - bool is_x_factory) { + t_struct* tstruct) { (void)cls_prefix; - if (is_exception) - return; - if (is_result) - return; - if (is_x_factory) - return; string struct_intf_name = type_name(tstruct); string cls_nm = type_name(tstruct, true, false); @@ -1629,17 +1613,8 @@ void t_delphi_generator::generate_delphi_struct_type_factory(ostream& out, void t_delphi_generator::generate_delphi_struct_type_factory_registration(ostream& out, string cls_prefix, - t_struct* tstruct, - bool is_exception, - bool is_result, - bool is_x_factory) { + t_struct* tstruct) { (void)cls_prefix; - if (is_exception) - return; - if (is_result) - return; - if (is_x_factory) - return; string struct_intf_name = type_name(tstruct); @@ -1649,12 +1624,8 @@ void t_delphi_generator::generate_delphi_struct_type_factory_registration(ostrea out << '\n'; } -void t_delphi_generator::generate_delphi_struct_definition(ostream& out, - t_struct* tstruct, - bool is_exception, - bool in_class, - bool is_result, - bool is_x_factory) { +void t_delphi_generator::generate_delphi_struct_definition(ostream& out, + t_struct* tstruct) { bool is_final = (tstruct->annotations_.find("final") != tstruct->annotations_.end()); string struct_intf_name; string struct_name; @@ -1662,121 +1633,77 @@ void t_delphi_generator::generate_delphi_struct_definition(ostream& out, const vector& members = tstruct->get_members(); vector::const_iterator m_iter; - string exception_factory_name = normalize_clsnm(tstruct->get_name(), "", true) + "Factory"; - - if (is_exception) { - struct_intf_name = type_name(tstruct, false, false, true); - } else { - struct_intf_name = type_name(tstruct); - } + struct_intf_name = type_name(tstruct, false, false); + struct_name = type_name(tstruct, true); - if (is_exception) { - struct_name = type_name(tstruct, true, (!is_x_factory), is_x_factory); + generate_delphi_doc(out, tstruct); + if(rtti_) { + indent(out) << "{$TYPEINFO ON}" << '\n'; + indent(out) << "{$RTTI EXPLICIT METHODS([vcPublic, vcPublished]) PROPERTIES([vcPublic, vcPublished])}" << '\n'; + indent(out) << struct_intf_name << " = interface(IBaseWithTypeInfo)" << '\n'; } else { - struct_name = type_name(tstruct, true); + indent(out) << struct_intf_name << " = interface(IBase)" << '\n'; } + indent_up(); - if ((!is_exception) || is_x_factory) { - - generate_delphi_doc(out, tstruct); - if(rtti_) { - indent(out) << "{$TYPEINFO ON}" << '\n'; - indent(out) << "{$RTTI EXPLICIT METHODS([vcPublic, vcPublished]) PROPERTIES([vcPublic, vcPublished])}" << '\n'; - indent(out) << struct_intf_name << " = interface(IBaseWithTypeInfo)" << '\n'; - } else { - indent(out) << struct_intf_name << " = interface(IBase)" << '\n'; - } - indent_up(); + generate_guid(out); - generate_guid(out); + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + generate_delphi_property_reader_definition(out, *m_iter, false); + generate_delphi_property_writer_definition(out, *m_iter, false); + } + if (members.size() > 0) { + out << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - generate_delphi_property_reader_definition(out, *m_iter, is_exception); - generate_delphi_property_writer_definition(out, *m_iter, is_exception); - } - - if (is_x_factory) { - out << '\n'; - indent(out) << "// Create Exception Object" << '\n'; - indent(out) << "function CreateException: " << type_name(tstruct, true, true) << ";" << '\n'; - } - - if (members.size() > 0) { - out << '\n'; - for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - generate_property(out, *m_iter, true, is_exception); - } + generate_property(out, *m_iter, true, false); } - if (members.size() > 0) { - out << '\n'; - for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - if ((*m_iter)->get_req() != t_field::T_REQUIRED) { - generate_delphi_isset_reader_writer_definition(out, *m_iter, is_exception); - } + out << '\n'; + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + if ((*m_iter)->get_req() != t_field::T_REQUIRED) { + generate_delphi_isset_reader_writer_definition(out, *m_iter, false); } } - if (members.size() > 0) { - out << '\n'; - for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - if ((*m_iter)->get_req() != t_field::T_REQUIRED) { - isset_name = prop_name(*m_iter, is_exception, "__isset_"); - indent(out) << "property " << isset_name << ": System.Boolean read Get" << isset_name << " write Set" << isset_name << ";" - << '\n'; - } + out << '\n'; + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + if ((*m_iter)->get_req() != t_field::T_REQUIRED) { + isset_name = prop_name(*m_iter, false, "__isset_"); + indent(out) << "property " << isset_name << ": System.Boolean read Get" << isset_name << " write Set" << isset_name << ";" + << '\n'; } } + } - indent_down(); - indent(out) << "end;" - << render_deprecation_attribute(tstruct->annotations_, " {", "}") - << '\n'; - if(rtti_) { - indent(out) << "{$IFNDEF TYPEINFO_WAS_ON} {$TYPEINFO OFF} {$ENDIF}" << '\n'; - } - indent(out) << '\n'; + indent_down(); + indent(out) << "end;" + << render_deprecation_attribute(tstruct->annotations_, " {", "}") + << '\n'; + if(rtti_) { + indent(out) << "{$IFNDEF TYPEINFO_WAS_ON} {$TYPEINFO OFF} {$ENDIF}" << '\n'; } + indent(out) << '\n'; generate_delphi_doc(out, tstruct); indent(out) << struct_name << " = "; if (is_final) { out << "sealed "; } - out << "class("; - if (is_exception && (!is_x_factory)) { - out << "TException, IInterface, IBase, ISupportsToString"; - } else { - out << "TInterfacedObject, IBase, ISupportsToString, " << struct_intf_name; - } - out << ")" << '\n'; - - if (is_exception && (!is_x_factory)) { - indent(out) << "public" << '\n'; - indent_up(); - indent(out) << "type" << '\n'; - indent_up(); - generate_delphi_struct_definition(out, tstruct, is_exception, in_class, is_result, true); - indent_down(); - indent_down(); - } + out << "class(TInterfacedObject, IBase, ISupportsToString, " << struct_intf_name << ")" << '\n'; indent(out) << "private" << '\n'; indent_up(); - if (is_exception && (!is_x_factory)) { - indent(out) << "F" << exception_factory_name << " :" << struct_intf_name << ";" << '\n' << '\n'; - } - for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - indent(out) << declare_field(*m_iter, false, "F", is_exception) << '\n'; + indent(out) << declare_field(*m_iter, "F", false) << '\n'; } if (members.size() > 0) { indent(out) << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() != t_field::T_REQUIRED) { - isset_name = prop_name(*m_iter, is_exception, "F__isset_"); + isset_name = prop_name(*m_iter, false, "F__isset_"); indent(out) << isset_name << ": System.Boolean;" << '\n'; } } @@ -1785,8 +1712,8 @@ void t_delphi_generator::generate_delphi_struct_definition(ostream& out, indent(out) << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - generate_delphi_property_reader_definition(out, *m_iter, is_exception); - generate_delphi_property_writer_definition(out, *m_iter, is_exception); + generate_delphi_property_reader_definition(out, *m_iter, false); + generate_delphi_property_writer_definition(out, *m_iter, false); } if (tstruct->is_union()) { @@ -1799,72 +1726,134 @@ void t_delphi_generator::generate_delphi_struct_definition(ostream& out, out << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() != t_field::T_REQUIRED) { - isset_name = prop_name(*m_iter, is_exception, "__isset_"); + isset_name = prop_name(*m_iter, false, "__isset_"); indent(out) << "function Get" << isset_name << ": System.Boolean;" << '\n'; indent(out) << "procedure Set" << isset_name << "( const value : System.Boolean);" << '\n'; } } } - if (is_exception && (!is_x_factory)) { + indent_down(); + indent(out) << "public" << '\n'; + indent_up(); + indent(out) << "constructor Create;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n'; + indent(out) << "destructor Destroy; override;" << '\n'; + + out << '\n'; + indent(out) << "function ToString: string; override;" << '\n'; + + out << '\n'; + indent(out) << "// IBase" << '\n'; + indent(out) << "procedure Read( const iprot: IProtocol);" << '\n'; + indent(out) << "procedure Write( const oprot: IProtocol);" << '\n'; + + if (members.size() > 0) { out << '\n'; - indent_down(); - indent(out) << "strict protected" << '\n'; - indent_up(); - indent(out) << "function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;" << '\n'; - indent(out) << "function _AddRef: Integer; stdcall;" << '\n'; - indent(out) << "function _Release: Integer; stdcall;" << '\n'; + indent(out) << "// Properties" << '\n'; + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + generate_property(out, *m_iter, true, false); + } + out << '\n'; + indent(out) << "// isset" << '\n'; + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + if ((*m_iter)->get_req() != t_field::T_REQUIRED) { + isset_name = prop_name(*m_iter, false, "__isset_"); + indent(out) << "property " << isset_name << ": System.Boolean read Get" << isset_name << " write Set" << isset_name << ";" + << '\n'; + } + } } + indent_down(); + indent(out) << "end;" << '\n' << '\n'; +} + +void t_delphi_generator::generate_delphi_exception_definition(ostream& out, + t_struct* tstruct) { + bool is_final = (tstruct->annotations_.find("final") != tstruct->annotations_.end()); + string struct_intf_name; + string struct_name; + string isset_name; + const vector& members = tstruct->get_members(); + vector::const_iterator m_iter; + + struct_intf_name = type_name(tstruct, false, false); + struct_name = type_name(tstruct, true, true); + + generate_delphi_doc(out, tstruct); + indent(out) << struct_name << " = "; + if (is_final) { + out << "sealed "; + } + out << "class(TException, IInterface, IBase, ISupportsToString)" << '\n'; + + indent(out) << "private" << '\n'; + indent_up(); + indent(out) << "FData : " << struct_intf_name << ';' << '\n'; + indent(out) << '\n'; + + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + generate_delphi_property_reader_definition(out, *m_iter, true); + generate_delphi_property_writer_definition(out, *m_iter, true); + } + + if (members.size() > 0) { + out << '\n'; + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + if ((*m_iter)->get_req() != t_field::T_REQUIRED) { + isset_name = prop_name(*m_iter, true, "__isset_"); + indent(out) << "function Get" << isset_name << ": System.Boolean;" << '\n'; + indent(out) << "procedure Set" << isset_name << "( const value : System.Boolean);" << '\n'; + } + } + } + + out << '\n'; + indent_down(); + indent(out) << "strict protected" << '\n'; + indent_up(); + indent(out) << "// non-refcounted instance" << '\n'; + indent(out) << "function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;" << '\n'; + indent(out) << "function _AddRef: Integer; stdcall;" << '\n'; + indent(out) << "function _Release: Integer; stdcall;" << '\n'; + out << '\n'; + indent_down(); indent(out) << "public" << '\n'; indent_up(); - if ((members.size() > 0) && is_exception && (!is_x_factory)) { - indent(out) << "constructor Create; overload;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n'; + indent(out) << "constructor Create; overload;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n'; + if (members.size() > 0) { indent(out) << "constructor Create(" << constructor_argument_list(tstruct, indent()) << "); overload;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n'; - } else { - indent(out) << "constructor Create;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n'; } + indent(out) << "constructor Create( const aData: " << struct_intf_name + << "); overload;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n'; indent(out) << "destructor Destroy; override;" << '\n'; out << '\n'; + indent(out) << "property ExceptionData : " << struct_intf_name << " read FData;" << '\n'; indent(out) << "function ToString: string; override;" << '\n'; - if (is_exception && (!is_x_factory)) { - out << '\n'; - indent(out) << "// Exception Factory" << '\n'; - indent(out) << "function " << exception_factory_name << ": " << struct_intf_name << ";" << '\n'; - } - out << '\n'; indent(out) << "// IBase" << '\n'; indent(out) << "procedure Read( const iprot: IProtocol);" << '\n'; indent(out) << "procedure Write( const oprot: IProtocol);" << '\n'; - if (is_exception && is_x_factory) { - out << '\n'; - indent(out) << "// Create Exception Object" << '\n'; - indent(out) << "function CreateException: " << type_name(tstruct, true, true) << ";" << '\n'; - } - if (members.size() > 0) { out << '\n'; indent(out) << "// Properties" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - generate_property(out, *m_iter, true, is_exception); + generate_property(out, *m_iter, true, true); } - } - if (members.size() > 0) { out << '\n'; indent(out) << "// isset" << '\n'; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() != t_field::T_REQUIRED) { - isset_name = prop_name(*m_iter, is_exception, "__isset_"); + isset_name = prop_name(*m_iter, true, "__isset_"); indent(out) << "property " << isset_name << ": System.Boolean read Get" << isset_name << " write Set" << isset_name << ";" << '\n'; } @@ -1957,11 +1946,11 @@ void t_delphi_generator::generate_service_helpers(t_service* tservice) { for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { t_struct* ts = (*f_iter)->get_arglist(); - generate_delphi_struct_definition(s_service, ts, false, true); + generate_delphi_struct_definition(s_service, ts); generate_delphi_struct_impl(s_service_impl, normalize_clsnm(service_name_, "T") + ".", ts, - false); + false, false); generate_function_helpers(*f_iter); } } @@ -2076,7 +2065,7 @@ void t_delphi_generator::generate_service_client(t_service* tservice) { // Delphi forces us to specify a type with IFuture, so we use Integer=0 for void methods indent_impl(s_service_impl) << "result := TTask.Future(function: System.Integer" << '\n'; } else { - string rettype = type_name(ttype, false, true, false, true); + string rettype = type_name(ttype, false, true/*, false, true*/); indent_impl(s_service_impl) << "result := TTask.Future<" << rettype << ">(function: " << rettype << '\n'; } indent_impl(s_service_impl) << "begin" << '\n'; @@ -2227,8 +2216,10 @@ void t_delphi_generator::generate_service_client(t_service* tservice) { indent_impl(s_service_impl) << "if (" << retvar << "." << prop_name(*x_iter, false, "__isset_") << ") then begin" << '\n'; indent_up_impl(); - indent_impl(s_service_impl) << exceptvar << " := " << retvar << "." << prop_name(*x_iter) - << ".CreateException;" << '\n'; + indent_impl(s_service_impl) << exceptvar + << " := " << type_name((*x_iter)->get_type(),true,true/*,false,true*/) + << ".Create(" << retvar << "." << prop_name(*x_iter) << ");" + << '\n'; indent_impl(s_service_impl) << "raise " << exceptvar << ";" << '\n'; indent_down_impl(); indent_impl(s_service_impl) << "end;" << '\n'; @@ -2434,18 +2425,21 @@ void t_delphi_generator::generate_function_helpers(t_function* tfunction) { result.append(&success); } + int num_excepts = 0; t_struct* xs = tfunction->get_xceptions(); const vector& fields = xs->get_members(); vector::const_iterator f_iter; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { result.append(*f_iter); + ++num_excepts; } + result.set_method_xcepts(num_excepts > 0); - generate_delphi_struct_definition(s_service, &result, false, true, true); + generate_delphi_struct_definition(s_service, &result); generate_delphi_struct_impl(s_service_impl, normalize_clsnm(service_name_, "T") + ".", &result, - false); + true, false); } void t_delphi_generator::generate_process_function(t_service* tservice, t_function* tfunction) { @@ -2543,10 +2537,7 @@ void t_delphi_generator::generate_process_function(t_service* tservice, t_functi << " do begin" << '\n'; indent_up_impl(); if (!tfunction->is_oneway()) { - string factory_name = normalize_clsnm((*x_iter)->get_type()->get_name(), "", true) - + "Factory"; - indent_impl(s_service_impl) << "ret." << prop_name(*x_iter) << " := E." << factory_name << ";" - << '\n'; + indent_impl(s_service_impl) << "ret." << prop_name(*x_iter) << " := E.ExceptionData;" << '\n'; } indent_down_impl(); indent_impl(s_service_impl) << "end;" << '\n'; @@ -2616,10 +2607,7 @@ void t_delphi_generator::generate_deserialize_field(ostream& out, t_field* tfield, string prefix, ostream& local_vars) { - t_type* type = tfield->get_type(); - while (type->is_typedef()) { - type = ((t_typedef*)type)->get_type(); - } + t_type* type = tfield->get_type()->get_true_type(); if (type->is_void()) { throw "CANNOT GENERATE DESERIALIZE CODE FOR void TYPE: " + prefix + tfield->get_name(); @@ -2695,11 +2683,7 @@ void t_delphi_generator::generate_deserialize_struct(ostream& out, string prefix) { string typ_name; - if (tstruct->is_xception()) { - typ_name = type_name(tstruct, true, false, true, true); - } else { - typ_name = type_name(tstruct, true, false); - } + typ_name = type_name(tstruct, true, false); indent_impl(out) << prefix << name << " := " << typ_name << ".Create;" << '\n'; indent_impl(out) << prefix << name << ".Read(iprot);" << '\n'; @@ -2819,10 +2803,7 @@ void t_delphi_generator::generate_serialize_field(ostream& out, ostream& local_vars) { (void)local_vars; - t_type* type = tfield->get_type(); - while (type->is_typedef()) { - type = ((t_typedef*)type)->get_type(); - } + t_type* type = tfield->get_type()->get_true_type(); string name = prefix + prop_name(tfield, is_xception); @@ -2999,22 +2980,21 @@ void t_delphi_generator::generate_property(ostream& out, t_field* tfield, bool isPublic, bool is_xception) { - generate_delphi_property(out, is_xception, tfield, isPublic, "Get"); + generate_delphi_property(out, is_xception, tfield, isPublic); } void t_delphi_generator::generate_delphi_property(ostream& out, bool struct_is_xception, t_field* tfield, - bool isPublic, - std::string fieldPrefix) { + bool isPublic) { (void)isPublic; t_type* ftype = tfield->get_type(); bool is_xception = ftype->is_xception(); generate_delphi_doc(out, tfield); indent(out) << "property " << prop_name(tfield, struct_is_xception) << ": " - << type_name(ftype, false, true, is_xception, true) - << " read " << prop_name(tfield, struct_is_xception, fieldPrefix) + << type_name(ftype, false, true/*, false, true*/) + << " read " << prop_name(tfield, struct_is_xception, "Get") << " write " << prop_name(tfield, struct_is_xception, "Set") << ";" << render_deprecation_attribute(tfield->annotations_, " {", "}") @@ -3050,9 +3030,7 @@ string t_delphi_generator::normalize_clsnm(string clsnm, string prefix, bool b_n string t_delphi_generator::type_name(t_type* ttype, bool b_cls, - bool b_no_postfix, - bool b_exception_factory, - bool b_full_exception_factory) { + bool b_no_postfix) { if (ttype->is_typedef()) { t_typedef* tdef = (t_typedef*)ttype; @@ -3060,9 +3038,7 @@ string t_delphi_generator::type_name(t_type* ttype, if (tdef->get_type() != nullptr) { return type_name(tdef->get_type(), b_cls, - b_no_postfix, - b_exception_factory, - b_full_exception_factory); + b_no_postfix); } else { throw "unresolved forward declaration: " + tdef->get_symbolic(); } @@ -3117,20 +3093,12 @@ string t_delphi_generator::type_name(t_type* ttype, string nm = normalize_clsnm(ttype->get_name(), type_prefix); - if (b_exception_factory) { - nm = normalize_clsnm(ttype->get_name(), type_prefix, true) + "Factory"; - } - if (b_cls) { if (!b_no_postfix) { nm = nm + "Impl"; } } - if (b_exception_factory && b_full_exception_factory) { - return type_name(ttype, true, true, false, false) + "." + nm; - } - return nm; } @@ -3217,16 +3185,14 @@ string t_delphi_generator::base_type_name(t_base_type* tbase) { } string t_delphi_generator::declare_field(t_field* tfield, - bool init, std::string prefix, bool is_xception_class) { - (void)init; - t_type* ftype = tfield->get_type(); bool is_xception = ftype->is_xception(); string result = prop_name(tfield, is_xception_class, prefix) + ": " - + type_name(ftype, false, true, is_xception, true) + ";"; + + type_name(ftype, false, true) + ";"; + return result; } @@ -3251,7 +3217,7 @@ string t_delphi_generator::function_signature(t_function* tfunction, } else { signature = "function " + prefix + normalize_name(tfunction->get_name(), true, is_xception) + "Async(" + argument_list(tfunction->get_arglist()) + "): IFuture<" - + type_name(ttype, false, true, is_xception, true) + ">;"; + + type_name(ttype, false, true/*, is_xception, true*/) + ">;"; } } else { if (is_void(ttype)) { @@ -3260,7 +3226,7 @@ string t_delphi_generator::function_signature(t_function* tfunction, } else { signature = "function " + prefix + normalize_name(tfunction->get_name(), true, is_xception) + "(" + argument_list(tfunction->get_arglist()) + "): " - + type_name(ttype, false, true, is_xception, true) + ";"; + + type_name(ttype, false, true/*, is_xception, true*/) + ";"; } } @@ -3289,7 +3255,7 @@ string t_delphi_generator::argument_list(t_struct* tstruct) { tt = (*f_iter)->get_type(); result += input_arg_prefix(tt); // const? result += normalize_name((*f_iter)->get_name()) + ": " - + type_name(tt, false, true, tt->is_xception(), true); + + type_name(tt, false, true/*, tt->is_xception(), true*/); } return result; } @@ -3326,7 +3292,7 @@ string t_delphi_generator::constructor_argument_list(t_struct* tstruct, string c tt = (*f_iter)->get_type(); line += input_arg_prefix(tt); // const? line += constructor_param_name((*f_iter)->get_name()) + ": " - + type_name(tt, false, true, tt->is_xception(), true); + + type_name(tt, false, true/*, tt->is_xception(), true*/); } if (line.size() > 0) { @@ -3345,9 +3311,7 @@ string t_delphi_generator::constructor_argument_list(t_struct* tstruct, string c } string t_delphi_generator::type_to_enum(t_type* type) { - while (type->is_typedef()) { - type = ((t_typedef*)type)->get_type(); - } + type = type->get_true_type(); if (type->is_base_type()) { t_base_type::t_base tbase = ((t_base_type*)type)->get_base(); @@ -3387,9 +3351,7 @@ string t_delphi_generator::type_to_enum(t_type* type) { } string t_delphi_generator::empty_value(t_type* type) { - while (type->is_typedef()) { - type = ((t_typedef*)type)->get_type(); - } + type = type->get_true_type(); if (type->is_base_type()) { t_base_type::t_base tbase = ((t_base_type*)type)->get_base(); @@ -3436,7 +3398,7 @@ void t_delphi_generator::generate_delphi_property_writer_definition(ostream& out bool is_xception = ftype->is_xception(); indent(out) << "procedure " << prop_name(tfield, is_xception_class, "Set") - << "( const Value: " << type_name(ftype, false, true, is_xception, true) << ");" + << "( const Value: " << type_name(ftype, false, true/*, false, true*/) << ");" << render_deprecation_attribute(tfield->annotations_, " ", ";") << '\n'; } @@ -3448,7 +3410,7 @@ void t_delphi_generator::generate_delphi_property_reader_definition(ostream& out bool is_xception = ftype->is_xception(); indent(out) << "function " << prop_name(tfield, is_xception_class, "Get") << ": " - << type_name(ftype, false, true, is_xception, true) << ";" + << type_name(ftype, false, true/*, false*/) << ";" << render_deprecation_attribute(tfield->annotations_, " ", ";") << '\n'; } @@ -3456,8 +3418,8 @@ void t_delphi_generator::generate_delphi_property_reader_definition(ostream& out void t_delphi_generator::generate_delphi_isset_reader_writer_definition(ostream& out, t_field* tfield, bool is_xception) { - indent(out) << "function " << prop_name(tfield, is_xception,"Get__isset_") << ": System.Boolean;" << '\n'; - indent(out) << "procedure " << prop_name(tfield, is_xception, "Set__isset_") << "( const value : System.Boolean);" << '\n'; + indent(out) << "function " << prop_name(tfield, false,"Get__isset_") << ": System.Boolean;" << '\n'; + indent(out) << "procedure " << prop_name(tfield, false, "Set__isset_") << "( const value : System.Boolean);" << '\n'; } void t_delphi_generator::generate_delphi_clear_union_value(ostream& out, @@ -3467,25 +3429,20 @@ void t_delphi_generator::generate_delphi_clear_union_value(ostream& out, t_field* tfield, std::string fieldPrefix, bool is_xception_class, - bool is_union, - bool is_xception_factory, - std::string xception_factory_name) { + bool is_union) { (void)cls_prefix; (void)name; (void)type; (void)is_union; - (void)is_xception_factory; - (void)xception_factory_name; t_type* ftype = tfield->get_type(); bool is_xception = ftype->is_xception(); - indent_impl(out) << "if " << prop_name(tfield, is_xception_class,"F__isset_") << " then begin" - << '\n'; + indent_impl(out) << "if " << prop_name(tfield, is_xception_class,"F__isset_") << " then begin" << '\n'; indent_up_impl(); indent_impl(out) << prop_name(tfield, is_xception_class,"F__isset_") << " := False;" << '\n'; indent_impl(out) << prop_name(tfield, is_xception_class,fieldPrefix) << " := " - << "Default( " << type_name(ftype, false, true, is_xception, true) << ");" + << "Default( " << type_name(ftype, false, true/*, is_xception, true*/) << ");" << '\n'; indent_down_impl(); indent_impl(out) << "end;" << '\n'; @@ -3498,9 +3455,7 @@ void t_delphi_generator::generate_delphi_property_writer_impl(ostream& out, t_field* tfield, std::string fieldPrefix, bool is_xception_class, - bool is_union, - bool is_xception_factory, - std::string xception_factory_name) { + bool is_union) { (void)type; t_type* ftype = tfield->get_type(); @@ -3508,21 +3463,20 @@ void t_delphi_generator::generate_delphi_property_writer_impl(ostream& out, indent_impl(out) << "procedure " << cls_prefix << name << "." << prop_name(tfield, is_xception_class,"Set") - << "( const Value: " << type_name(ftype, false, true, is_xception, true) << ");" + << "( const Value: " << type_name(ftype, false, true) << ");" << '\n'; indent_impl(out) << "begin" << '\n'; indent_up_impl(); if (is_union) { indent_impl(out) << "ClearUnionValues;" << '\n'; } - if (tfield->get_req() != t_field::T_REQUIRED) { - indent_impl(out) << prop_name(tfield, is_xception_class,"F__isset_") << " := True;" << '\n'; - } - indent_impl(out) << prop_name(tfield, is_xception_class,fieldPrefix) << " := Value;" << '\n'; - - if (is_xception_class && (!is_xception_factory)) { - indent_impl(out) << xception_factory_name << "." << prop_name(tfield, is_xception_class) - << " := Value;" << '\n'; + if(is_xception_class) { + indent_impl(out) << "FData." << prop_name(tfield, false, fieldPrefix) << " := Value;" << '\n'; + } else { + if (tfield->get_req() != t_field::T_REQUIRED) { + indent_impl(out) << prop_name(tfield, is_xception_class, "F__isset_") << " := True;" << '\n'; + } + indent_impl(out) << prop_name(tfield, is_xception_class, fieldPrefix) << " := Value;" << '\n'; } indent_down_impl(); @@ -3543,11 +3497,14 @@ void t_delphi_generator::generate_delphi_property_reader_impl(ostream& out, indent_impl(out) << "function " << cls_prefix << name << "." << prop_name(tfield, is_xception_class,"Get") << ": " - << type_name(ftype, false, true, is_xception, true) << ";" << '\n'; + << type_name(ftype, false, true) << ";" << '\n'; indent_impl(out) << "begin" << '\n'; indent_up_impl(); - indent_impl(out) << "Result := " << prop_name(tfield, is_xception_class,fieldPrefix) << ";" - << '\n'; + if(is_xception_class) { + indent_impl(out) << "Result := FData." << prop_name(tfield, false, fieldPrefix) << ";" << '\n'; + } else { + indent_impl(out) << "Result := " << prop_name(tfield, is_xception_class, fieldPrefix) << ";" << '\n'; + } indent_down_impl(); indent_impl(out) << "end;" << '\n' << '\n'; } @@ -3558,16 +3515,20 @@ void t_delphi_generator::generate_delphi_isset_reader_writer_impl(ostream& out, t_type* type, t_field* tfield, std::string fieldPrefix, - bool is_xception) { + bool is_xception_class) { (void)type; - string isset_name = prop_name(tfield, is_xception, "__isset_"); + string isset_name = prop_name(tfield, false, "__isset_"); indent_impl(out) << "function " << cls_prefix << name << "." << "Get" << isset_name << ": System.Boolean;" << '\n'; indent_impl(out) << "begin" << '\n'; indent_up_impl(); - indent_impl(out) << "Result := " << fieldPrefix << isset_name << ";" << '\n'; + if(is_xception_class) { + indent_impl(out) << "Result := FData." << fieldPrefix << isset_name << ";" << '\n'; + } else { + indent_impl(out) << "Result := " << fieldPrefix << isset_name << ";" << '\n'; + } indent_down_impl(); indent_impl(out) << "end;" << '\n' << '\n'; @@ -3575,7 +3536,11 @@ void t_delphi_generator::generate_delphi_isset_reader_writer_impl(ostream& out, << "Set" << isset_name << "( const value: System.Boolean);" << '\n'; indent_impl(out) << "begin" << '\n'; indent_up_impl(); - indent_impl(out) << fieldPrefix << isset_name << " := value;" << '\n'; + if(is_xception_class) { + indent_impl(out) << "FData." << fieldPrefix << isset_name << " := value;" << '\n'; + } else { + indent_impl(out) << fieldPrefix << isset_name << " := value;" << '\n'; + } indent_down_impl(); indent_impl(out) << "end;" << '\n' << '\n'; } @@ -3587,47 +3552,13 @@ void t_delphi_generator::generate_delphi_create_exception_impl(ostream& out, (void)cls_prefix; string exception_cls_nm = type_name(tstruct, true, true); - string cls_nm = type_name(tstruct, true, false, is_exception, is_exception); - - indent_impl(out) << "function " << cls_nm << ".CreateException: " << exception_cls_nm << ";" - << '\n'; - - indent_impl(out) << "begin" << '\n'; - indent_up_impl(); - - indent_impl(out) << "Result := " << exception_cls_nm << ".Create;" << '\n'; - string factory_name = normalize_clsnm(tstruct->get_name(), "", true) + "Factory"; - indent_impl(out) << "Result.F" << factory_name << " := Self;" << '\n'; - - const vector& fields = tstruct->get_members(); - vector::const_iterator f_iter; - - string propname; - - for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - propname = prop_name(*f_iter, is_exception); - if ((*f_iter)->get_req() != t_field::T_REQUIRED) { - indent_impl(out) << "if " << prop_name(*f_iter, is_exception,"__isset_") << " then begin" << '\n'; - indent_up_impl(); - } - indent_impl(out) << "Result." << propname << " := " << propname << ";" << '\n'; - if ((*f_iter)->get_req() != t_field::T_REQUIRED) { - indent_down_impl(); - indent_impl(out) << "end;" << '\n'; - } - } - - indent_impl(out) << "Result.UpdateMessageProperty;" << '\n'; - - indent_down_impl(); - indent_impl(out) << "end;" << '\n' << '\n'; + string cls_nm = type_name(tstruct, true, false/*, is_exception, is_exception*/); } void t_delphi_generator::generate_delphi_struct_reader_impl(ostream& out, string cls_prefix, t_struct* tstruct, - bool is_exception, - bool is_x_factory) { + bool is_exception) { ostringstream local_vars; ostringstream code_block; @@ -3746,7 +3677,7 @@ void t_delphi_generator::generate_delphi_struct_reader_impl(ostream& out, } } - if( is_exception && (!is_x_factory)) { + if( is_exception) { code_block << '\n'; indent_impl(code_block) << "UpdateMessageProperty;" << '\n'; } @@ -3755,10 +3686,9 @@ void t_delphi_generator::generate_delphi_struct_reader_impl(ostream& out, string cls_nm; - cls_nm = type_name(tstruct, true, is_exception && (!is_x_factory), is_x_factory, is_x_factory); + cls_nm = type_name(tstruct, true, is_exception); - indent_impl(out) << "procedure " << cls_prefix << cls_nm << ".Read( const iprot: IProtocol);" - << '\n'; + indent_impl(out) << "procedure " << cls_prefix << cls_nm << ".Read( const iprot: IProtocol);" << '\n'; indent_impl(out) << "var" << '\n'; indent_up_impl(); indent_impl(out) << "field_ : TThriftField;" << '\n'; @@ -3768,76 +3698,10 @@ void t_delphi_generator::generate_delphi_struct_reader_impl(ostream& out, out << code_block.str(); } -void t_delphi_generator::generate_delphi_struct_result_writer_impl(ostream& out, - string cls_prefix, - t_struct* tstruct, - bool is_exception, - bool is_x_factory) { - - ostringstream local_vars; - ostringstream code_block; - - string name = tstruct->get_name(); - const vector& fields = tstruct->get_sorted_members(); - vector::const_iterator f_iter; - - indent_impl(code_block) << "begin" << '\n'; - indent_up_impl(); - - indent_impl(local_vars) << "tracker : IProtocolRecursionTracker;" << '\n'; - indent_impl(code_block) << "tracker := oprot.NextRecursionLevel;" << '\n'; - - indent_impl(code_block) << "Thrift.Protocol.Init( struc, '" << name << "');" << '\n'; - indent_impl(code_block) << "oprot.WriteStructBegin(struc);" << '\n'; - - if (fields.size() > 0) { - indent_impl(code_block) << "Thrift.Protocol.Init( field_);" << '\n'; - for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { - indent_impl(code_block) << "if (" << prop_name(*f_iter, is_exception,"__isset_") << ") then" - << '\n'; - indent_impl(code_block) << "begin" << '\n'; - indent_up_impl(); - indent_impl(code_block) << "field_.Name := '" << (*f_iter)->get_name() << "';" << '\n'; - indent_impl(code_block) << "field_.Type_ := " << type_to_enum((*f_iter)->get_type()) << ";" - << '\n'; - indent_impl(code_block) << "field_.ID := " << (*f_iter)->get_key() << ";" << '\n'; - indent_impl(code_block) << "oprot.WriteFieldBegin(field_);" << '\n'; - generate_serialize_field(code_block, is_exception, *f_iter, "Self.", local_vars); - indent_impl(code_block) << "oprot.WriteFieldEnd();" << '\n'; - indent_down_impl(); - } - } - - indent_impl(code_block) << "oprot.WriteFieldStop();" << '\n'; - indent_impl(code_block) << "oprot.WriteStructEnd();" << '\n'; - - indent_down_impl(); - indent_impl(code_block) << "end;" << '\n' << '\n'; - - string cls_nm; - - cls_nm = type_name(tstruct, true, is_exception && (!is_x_factory), is_x_factory, is_x_factory); - - indent_impl(out) << "procedure " << cls_prefix << cls_nm << ".Write( const oprot: IProtocol);" - << '\n'; - indent_impl(out) << "var" << '\n'; - indent_up_impl(); - indent_impl(out) << "struc : TThriftStruct;" << '\n'; - - if (fields.size() > 0) { - indent_impl(out) << "field_ : TThriftField;" << '\n'; - } - - out << local_vars.str(); - indent_down_impl(); - out << code_block.str(); -} - void t_delphi_generator::generate_delphi_struct_writer_impl(ostream& out, string cls_prefix, t_struct* tstruct, - bool is_exception, - bool is_x_factory) { + bool is_exception) { ostringstream local_vars; ostringstream code_block; @@ -3906,7 +3770,7 @@ void t_delphi_generator::generate_delphi_struct_writer_impl(ostream& out, string cls_nm; - cls_nm = type_name(tstruct, true, is_exception && (!is_x_factory), is_x_factory, is_x_factory); + cls_nm = type_name(tstruct, true, is_exception); indent_impl(out) << "procedure " << cls_prefix << cls_nm << ".Write( const oprot: IProtocol);" << '\n'; @@ -3924,8 +3788,7 @@ void t_delphi_generator::generate_delphi_struct_writer_impl(ostream& out, void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, string cls_prefix, t_struct* tstruct, - bool is_exception, - bool is_x_factory) { + bool is_exception) { const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; @@ -3933,7 +3796,7 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, string cls_nm; if (is_exception) { - cls_nm = type_name(tstruct, true, (!is_x_factory), is_x_factory, true); + cls_nm = type_name(tstruct, true, true/*, false, true*/); } else { cls_nm = type_name(tstruct, true, false); } @@ -3998,10 +3861,7 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, << '\n'; } - t_type* ttype = (*f_iter)->get_type(); - while (ttype->is_typedef()) { - ttype = ((t_typedef*)ttype)->get_type(); - } + t_type* ttype = (*f_iter)->get_type()->get_true_type(); if (ttype->is_xception() || ttype->is_struct()) { indent_impl(out) << "if (Self." << prop_name((*f_iter), is_exception) << " = nil) then " << tmp_sb @@ -4009,7 +3869,7 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, << prop_name((*f_iter), is_exception) << ".ToString());" << '\n'; } else if (ttype->is_enum()) { indent_impl(out) << tmp_sb << ".Append(EnumUtils<" - << type_name(ttype, false, true, false, false) + << type_name(ttype, false, true) << ">.ToString( System.Ord( Self." << prop_name((*f_iter), is_exception) << ")));" << '\n'; } else if (ttype->is_uuid()) { @@ -4048,9 +3908,7 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, } bool t_delphi_generator::is_void(t_type* type) { - while (type->is_typedef()) { - type = ((t_typedef*)type)->get_type(); - } + type = type->get_true_type(); if (type->is_base_type()) { t_base_type::t_base tbase = ((t_base_type*)type)->get_base(); diff --git a/lib/delphi/test/serializer/SerializerData.dpr b/lib/delphi/test/serializer/SerializerData.dpr index 92ed00b0094..637e4ed9925 100644 --- a/lib/delphi/test/serializer/SerializerData.dpr +++ b/lib/delphi/test/serializer/SerializerData.dpr @@ -40,6 +40,8 @@ uses Thrift.TypeRegistry in '..\..\src\Thrift.TypeRegistry.pas', System_ in 'gen-delphi\System_.pas', SysUtils_ in 'gen-delphi\SysUtils_.pas', + test.ExceptionStruct in 'gen-delphi\test.ExceptionStruct.pas', + test.SimpleException in 'gen-delphi\test.SimpleException.pas', DebugProtoTest in 'gen-delphi\DebugProtoTest.pas', TestSerializer.Data in 'TestSerializer.Data.pas'; @@ -69,11 +71,26 @@ begin end; +function CreateBatchGetResponse : IBatchGetResponse; stdcall; +begin + result := Fixtures.CreateBatchGetResponse; +end; + + +function CreateSimpleException : IError; stdcall; +begin + result := Fixtures.CreateSimpleException; +end; + + exports CreateOneOfEach, CreateNesting, CreateHolyMoley, - CreateCompactProtoTestStruct; + CreateCompactProtoTestStruct, + CreateBatchGetResponse, + CreateSimpleException; + begin IsMultiThread := TRUE; diff --git a/lib/delphi/test/serializer/SerializerData.dproj b/lib/delphi/test/serializer/SerializerData.dproj index cfc27f8781d..cdad3120517 100644 --- a/lib/delphi/test/serializer/SerializerData.dproj +++ b/lib/delphi/test/serializer/SerializerData.dproj @@ -1,22 +1,4 @@ - - + {B523D1D7-2C9A-4B39-A6CF-69EF536D5079} SerializerData.dpr @@ -85,6 +67,8 @@ + + @@ -100,10 +84,12 @@ - + - + Delphi.Personality.12 @@ -140,6 +126,9 @@ thrift.exe -r -gen delphi:com_types ..\..\..\..\test\DebugProtoTest.thrift]]>

SerializerData.dpr + + bin\Debug\Win32\TestSerializer.exe + True diff --git a/lib/delphi/test/serializer/SimpleException.thrift b/lib/delphi/test/serializer/SimpleException.thrift new file mode 100644 index 00000000000..c13876c8d74 --- /dev/null +++ b/lib/delphi/test/serializer/SimpleException.thrift @@ -0,0 +1,32 @@ +/* + * 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 * test.SimpleException + +exception Error { + 1: i32 ErrorCode = 42 + /** test name collision with Exception class */ + 2: Error InnerException + /** test name collisions with Thrift Delphi implementation details */ + 3: uuid ExceptionData = '00000000-4444-CCCC-ffff-0123456789ab' +} + + + +// EOF diff --git a/lib/delphi/test/serializer/TestSerializer.Data.pas b/lib/delphi/test/serializer/TestSerializer.Data.pas index 24f850d2f61..ddf4ba243eb 100644 --- a/lib/delphi/test/serializer/TestSerializer.Data.pas +++ b/lib/delphi/test/serializer/TestSerializer.Data.pas @@ -27,6 +27,8 @@ interface ComObj, Thrift.Protocol, Thrift.Collections, + test.ExceptionStruct, + test.SimpleException, DebugProtoTest; @@ -37,6 +39,8 @@ Fixtures = class class function CreateNesting : INesting; class function CreateHolyMoley : IHolyMoley; class function CreateCompactProtoTestStruct : ICompactProtoTestStruct; + class function CreateBatchGetResponse : IBatchGetResponse; + class function CreateSimpleException : IError; // These byte arrays are serialized versions of the above structs. // They were serialized in binary protocol using thrift 0.6.x and are used to @@ -359,6 +363,51 @@ class function Fixtures.CreateCompactProtoTestStruct : ICompactProtoTestStruct; end; +class function Fixtures.CreateBatchGetResponse : IBatchGetResponse; +var + data : IGetRequest; + error : ISomeException; +const + REQUEST_ID = '123'; +begin + data := TGetRequestImpl.Create; + data.Id := REQUEST_ID; + data.Data := TThriftBytesImpl.Create( TEncoding.UTF8.GetBytes( #0#1#2#3#4#5#6#7#8)); + + error := TSomeExceptionImpl.Create; + error.Error := TErrorCode.GenericError; + + result := TBatchGetResponseImpl.Create; + result.Responses := TThriftDictionaryImpl.Create; + result.Responses.Add( REQUEST_ID, data); + result.Errors := TThriftDictionaryImpl.Create; + result.Errors.Add( REQUEST_ID, error); +end; + + +class function Fixtures.CreateSimpleException : IError; +var i : Integer; + inner : IError; + guid : TGuid; +const + IDL_GUID_VALUE : TGuid = '{00000000-4444-CCCC-ffff-0123456789ab}'; +begin + result := nil; + for i := 0 to 4 do begin + inner := result; + result := TErrorImpl.Create; + + // validate const values set in IDL + ASSERT( result.ErrorCode = 42); // IDL default value + ASSERT( IsEqualGUID( result.ExceptionData, IDL_GUID_VALUE)); + + // set fresh, but reproducible values + FillChar( guid, SizeOf(guid), i); + result.ErrorCode := i; + result.ExceptionData := guid; + result.InnerException := inner; + end; +end; end. diff --git a/lib/delphi/test/serializer/TestSerializer.Tests.pas b/lib/delphi/test/serializer/TestSerializer.Tests.pas index e6a309e6861..466fb269efc 100644 --- a/lib/delphi/test/serializer/TestSerializer.Tests.pas +++ b/lib/delphi/test/serializer/TestSerializer.Tests.pas @@ -41,6 +41,8 @@ interface Thrift.WinHTTP, Thrift.TypeRegistry, System_, + test.ExceptionStruct, + test.SimpleException, DebugProtoTest; {$TYPEINFO ON} @@ -82,8 +84,11 @@ TTestSerializer = class //extends TestCase { procedure Test_Serializer_Deserializer; procedure Test_COM_Types; procedure Test_ThriftBytesCTORs; - procedure Test_OneOfEach( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream); - procedure Test_CompactStruct( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream); + + procedure Test_OneOfEach( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream); + procedure Test_CompactStruct( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream); + procedure Test_ExceptionStruct( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream); + procedure Test_SimpleException( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream); public constructor Create; @@ -100,6 +105,8 @@ function CreateOneOfEach : IOneOfEach; stdcall; external SERIALIZERDATA_DLL; function CreateNesting : INesting; stdcall; external SERIALIZERDATA_DLL; function CreateHolyMoley : IHolyMoley; stdcall; external SERIALIZERDATA_DLL; function CreateCompactProtoTestStruct : ICompactProtoTestStruct; stdcall; external SERIALIZERDATA_DLL; +function CreateBatchGetResponse : IBatchGetResponse; stdcall; external SERIALIZERDATA_DLL; +function CreateSimpleException : IError; stdcall; external SERIALIZERDATA_DLL; { TTestSerializer } @@ -266,6 +273,105 @@ procedure TTestSerializer.Test_CompactStruct( const method : TMethod; const fact end; +procedure TTestSerializer.Test_ExceptionStruct( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream); +var tested, correct : IBatchGetResponse; + bytes : TBytes; + corrDP, testDP : TPair; + corrEP, testEP : TPair; +begin + // write + tested := CreateBatchGetResponse; + case method of + mt_Bytes: bytes := Serialize( tested, factory); + mt_Stream: begin + stream.Size := 0; + Serialize( tested, factory, stream); + end + else + ASSERT( FALSE); + end; + + // init + read + correct := TBatchGetResponseImpl.Create; + case method of + mt_Bytes: Deserialize( bytes, tested, factory); + mt_Stream: begin + stream.Position := 0; + Deserialize( stream, tested, factory); + end + else + ASSERT( FALSE); + end; + + // check + correct := CreateBatchGetResponse; + + // rewrite the following test if not + ASSERT( tested.Responses.Count = 1); + ASSERT( correct.Responses.Count = tested.Responses.Count); + for corrDP in correct.Responses do begin + for testDP in tested.Responses do begin + ASSERT( corrDP.Key = testDP.Key); + ASSERT( corrDP.Value.Id = testDP.Value.Id); + ASSERT( corrDP.Value.Data.Count = testDP.Value.Data.Count); + end; + end; + + // rewrite the following test if not + ASSERT( tested.Errors.Count = 1); + ASSERT( correct.Errors.Count = tested.Errors.Count); + for corrEP in correct.Errors do begin + for testEP in tested.Errors do begin + ASSERT( corrEP.Key = testEP.Key); + ASSERT( corrEP.Value.Error = testEP.Value.Error); + end; + end; +end; + + +procedure TTestSerializer.Test_SimpleException( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream); +var tested, correct : IError; + bytes : TBytes; +begin + // write + tested := CreateSimpleException; + case method of + mt_Bytes: bytes := Serialize( tested, factory); + mt_Stream: begin + stream.Size := 0; + Serialize( tested, factory, stream); + end + else + ASSERT( FALSE); + end; + + // init + read + correct := TErrorImpl.Create; + case method of + mt_Bytes: Deserialize( bytes, tested, factory); + mt_Stream: begin + stream.Position := 0; + Deserialize( stream, tested, factory); + end + else + ASSERT( FALSE); + end; + + // check + correct := CreateSimpleException; + while correct <> nil do begin + // validate + ASSERT( correct.ErrorCode = tested.ErrorCode); + ASSERT( IsEqualGUID( correct.ExceptionData, tested.ExceptionData)); + + // iterate + correct := correct.InnerException; + tested := tested.InnerException; + ASSERT( (tested <> nil) xor (correct = nil)); // both or none + end; +end; + + procedure TTestSerializer.Test_Serializer_Deserializer; var factory : TFactoryPair; stream : TFileStream; @@ -279,8 +385,10 @@ procedure TTestSerializer.Test_Serializer_Deserializer; for factory in FProtocols do begin Writeln('- '+UserFriendlyName(factory)); - Test_OneOfEach( method, factory, stream); - Test_CompactStruct( method, factory, stream); + Test_OneOfEach( method, factory, stream); + Test_CompactStruct( method, factory, stream); + Test_ExceptionStruct( method, factory, stream); + Test_SimpleException( method, factory, stream); end; Writeln; diff --git a/lib/delphi/test/serializer/TestSerializer.dpr b/lib/delphi/test/serializer/TestSerializer.dpr index b78c0db05d9..8c2f64d9e10 100644 --- a/lib/delphi/test/serializer/TestSerializer.dpr +++ b/lib/delphi/test/serializer/TestSerializer.dpr @@ -44,6 +44,8 @@ uses System_ in 'gen-delphi\System_.pas', SysUtils_ in 'gen-delphi\SysUtils_.pas', DebugProtoTest in 'gen-delphi\DebugProtoTest.pas', + test.ExceptionStruct in 'gen-delphi\test.ExceptionStruct.pas', + test.SimpleException in 'gen-delphi\test.SimpleException.pas', TestSerializer.Tests in 'TestSerializer.Tests.pas'; diff --git a/lib/delphi/test/serializer/TestSerializer.dproj b/lib/delphi/test/serializer/TestSerializer.dproj index 383e04a9547..5ea2b796adc 100644 --- a/lib/delphi/test/serializer/TestSerializer.dproj +++ b/lib/delphi/test/serializer/TestSerializer.dproj @@ -1,22 +1,4 @@ - - + {9282EDD8-7C12-41B0-8172-61C6BFA6E238} TestSerializer.dpr @@ -85,6 +67,8 @@ + + Cfg_2 @@ -99,10 +83,12 @@
- + +thrift.exe -r -gen delphi:com_types ..\..\..\..\test\DebugProtoTest.thrift +thrift.exe -r -gen delphi:com_types ..\..\..\..\test\ExceptionStruct.thrift +thrift.exe -r -gen delphi:com_types SimpleException.thrift]]> Delphi.Personality.12 From 6b967bd74f6a41c2ffd8679517850862dbc4bf56 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Mon, 25 Nov 2024 22:10:48 +0100 Subject: [PATCH 169/430] FIX Two ASF headers lost during THRIFT-5837 Client: Delphi Patch: Jens Geyer --- .../test/serializer/SerializerData.dproj | 20 ++++++++++++++++++- .../test/serializer/TestSerializer.dproj | 20 ++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/lib/delphi/test/serializer/SerializerData.dproj b/lib/delphi/test/serializer/SerializerData.dproj index cdad3120517..ac744c143a1 100644 --- a/lib/delphi/test/serializer/SerializerData.dproj +++ b/lib/delphi/test/serializer/SerializerData.dproj @@ -1,4 +1,22 @@ - + + {B523D1D7-2C9A-4B39-A6CF-69EF536D5079} SerializerData.dpr diff --git a/lib/delphi/test/serializer/TestSerializer.dproj b/lib/delphi/test/serializer/TestSerializer.dproj index 5ea2b796adc..1e348d5a89c 100644 --- a/lib/delphi/test/serializer/TestSerializer.dproj +++ b/lib/delphi/test/serializer/TestSerializer.dproj @@ -1,4 +1,22 @@ - + + {9282EDD8-7C12-41B0-8172-61C6BFA6E238} TestSerializer.dpr From 91d9f051f30830574084187da366e356a95fcb7a Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sat, 23 Nov 2024 23:45:26 +0100 Subject: [PATCH 170/430] (no ticket) netstd testcase for THRIFT-5835 Client: netstd Patch: Jens Geyer --- .../Thrift.Compile.net8.csproj | 1 + .../Thrift.Compile.net9.csproj | 1 + .../DataModel/ExceptionAsStruct.cs | 116 ++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 lib/netstd/Tests/Thrift.Tests/DataModel/ExceptionAsStruct.cs diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj index 2695ddee1e4..6398a41e4e0 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj @@ -76,6 +76,7 @@ + diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj index cb6c4653e5e..ac1a62a388b 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj @@ -76,6 +76,7 @@ + diff --git a/lib/netstd/Tests/Thrift.Tests/DataModel/ExceptionAsStruct.cs b/lib/netstd/Tests/Thrift.Tests/DataModel/ExceptionAsStruct.cs new file mode 100644 index 00000000000..8b9490bcd56 --- /dev/null +++ b/lib/netstd/Tests/Thrift.Tests/DataModel/ExceptionAsStruct.cs @@ -0,0 +1,116 @@ +// 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. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using test.ExceptionStruct; +using Thrift.Collections; +using Thrift.Protocol; +using Thrift.Transport.Client; + +namespace Thrift.Tests.DataModel +{ + // ReSharper disable once InconsistentNaming + [TestClass] + public class ExceptionAsStructTests + { + [TestMethod] + public async Task Test_Serialize_Deserialize() + { + var initial = CreateInitialData(); + var checking = await WriteAndReadBack(initial); + VerifyIdenticalContent(checking, initial); + } + + private string FormatKey(int i) => $"Test {i}"; + + private BatchGetResponse CreateInitialData() + { + var initial = new BatchGetResponse() + { + Errors = [], + Responses = [], + }; + + var i = 0; + initial.Errors.Add(FormatKey(++i), new() { Error = ErrorCode.GenericError }); + initial.Errors.Add(FormatKey(++i), new() { Error = ErrorCode.InvalidData }); + initial.Errors.Add(FormatKey(++i), new() { Error = ErrorCode.ServerOverload }); + initial.Responses.Add(FormatKey(++i), new() { Id = FormatKey(i), Data = [0x00, 0x11, 0x22] }); + initial.Responses.Add(FormatKey(++i), new() { Id = FormatKey(i), Data = [0x45, 0x56, 0x64] }); + initial.Responses.Add(FormatKey(++i), new() { Id = FormatKey(i), Data = [0x78, 0x9a, 0xbc] }); + + return initial; + } + + private async Task WriteAndReadBack(T input) where T : TBase,new() + { + var stream = new MemoryStream(); + var config = new TConfiguration(); + + // write data + var trans = new TStreamTransport(null, stream, config); + var proto = new TCompactProtocol(trans); + await input.WriteAsync(proto, default); + + // read data + stream.Position = 0; + trans = new TStreamTransport(stream, null, config); + proto = new TCompactProtocol(trans); + var output = new T(); + await output.ReadAsync(proto, default); + + return output; + } + + private void VerifyIdenticalContent(BatchGetResponse left, BatchGetResponse right) + { + // Errors + Assert.IsNotNull(left.Errors); + Assert.IsNotNull(right.Errors); + Assert.AreEqual(left.Errors.Count, right.Errors.Count); + foreach(var key in left.Errors.Keys) + { + Assert.AreEqual(left.Errors[key].Error, right.Errors[key].Error); + } + + // Responses + Assert.IsNotNull(left.Responses); + Assert.IsNotNull(right.Responses); + Assert.AreEqual(left.Responses.Count, right.Responses.Count); + foreach (var key in left.Responses.Keys) + { + Assert.AreEqual(left.Responses[key].Id, right.Responses[key].Id); + + var leftData = left.Responses[key].Data; + var rightData = right.Responses[key].Data; + Assert.IsNotNull(leftData); + Assert.IsNotNull(rightData); + Assert.AreEqual(leftData.Length, rightData.Length); + for (var index = 0; index < leftData.Length; ++index) + Assert.AreEqual(leftData[index], rightData[index]); + } + } + + } +} From 376ab241a4398747607c27949fa7c274854446ed Mon Sep 17 00:00:00 2001 From: Bruce Irschick Date: Tue, 26 Nov 2024 10:06:10 -0800 Subject: [PATCH 171/430] THRIFT-5838 ensure original exception added to new exceptions Client: netstd Patch: Bruce Irschick This closes #3069 --- lib/netstd/Thrift/Transport/Client/THttpTransport.cs | 12 ++++++++---- .../Transport/Server/TNamedPipeServerTransport.cs | 2 +- .../Transport/Server/TServerSocketTransport.cs | 10 +++++----- .../Transport/Server/TTlsServerSocketTransport.cs | 10 +++++----- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/lib/netstd/Thrift/Transport/Client/THttpTransport.cs b/lib/netstd/Thrift/Transport/Client/THttpTransport.cs index e724665fecd..16e228ba3d3 100644 --- a/lib/netstd/Thrift/Transport/Client/THttpTransport.cs +++ b/lib/netstd/Thrift/Transport/Client/THttpTransport.cs @@ -167,7 +167,7 @@ public override async ValueTask ReadAsync(byte[] buffer, int offset, int le } catch (IOException iox) { - throw new TTransportException(TTransportException.ExceptionType.Unknown, iox.ToString()); + throw new TTransportException(TTransportException.ExceptionType.Unknown, iox.ToString(), iox); } } @@ -260,16 +260,20 @@ public override async Task FlushAsync(CancellationToken cancellationToken) } catch (IOException iox) { - throw new TTransportException(TTransportException.ExceptionType.Unknown, iox.ToString()); + throw new TTransportException(TTransportException.ExceptionType.Unknown, iox.ToString(), iox); } catch (HttpRequestException wx) { throw new TTransportException(TTransportException.ExceptionType.Unknown, - "Couldn't connect to server: " + wx); + "Couldn't connect to server: " + wx, wx); + } + catch (OperationCanceledException ocx) + { + throw new TTransportException(TTransportException.ExceptionType.Interrupted, ocx.Message, ocx); } catch (Exception ex) { - throw new TTransportException(TTransportException.ExceptionType.Unknown, ex.Message); + throw new TTransportException(TTransportException.ExceptionType.Unknown, ex.Message, ex); } finally { diff --git a/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs b/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs index 138c7fd9b14..12fc9d3ef74 100644 --- a/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs +++ b/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs @@ -347,7 +347,7 @@ protected override async ValueTask AcceptImplementationAsync(Cancell catch (Exception e) { Close(); - throw new TTransportException(TTransportException.ExceptionType.NotOpen, e.Message); + throw new TTransportException(TTransportException.ExceptionType.NotOpen, e.Message, e); } } diff --git a/lib/netstd/Thrift/Transport/Server/TServerSocketTransport.cs b/lib/netstd/Thrift/Transport/Server/TServerSocketTransport.cs index 43663c3a78e..96753e1d81f 100644 --- a/lib/netstd/Thrift/Transport/Server/TServerSocketTransport.cs +++ b/lib/netstd/Thrift/Transport/Server/TServerSocketTransport.cs @@ -51,10 +51,10 @@ public TServerSocketTransport(int port, TConfiguration config, int clientTimeout _server.Server.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false); _server.Server.NoDelay = true; } - catch (Exception) + catch (Exception ex) { _server = null; - throw new TTransportException("Could not create ServerSocket on port " + port + "."); + throw new TTransportException("Could not create ServerSocket on port " + port + ".", ex); } } @@ -95,7 +95,7 @@ public override void Listen() } catch (SocketException sx) { - throw new TTransportException("Could not accept on listening socket: " + sx.Message); + throw new TTransportException("Could not accept on listening socket: " + sx.Message, sx); } } } @@ -147,7 +147,7 @@ protected override async ValueTask AcceptImplementationAsync(Cancell } catch (Exception ex) { - throw new TTransportException(ex.ToString()); + throw new TTransportException(ex.ToString(), ex); } } @@ -161,7 +161,7 @@ public override void Close() } catch (Exception ex) { - throw new TTransportException("WARNING: Could not close server socket: " + ex); + throw new TTransportException("WARNING: Could not close server socket: " + ex, ex); } _server = null; } diff --git a/lib/netstd/Thrift/Transport/Server/TTlsServerSocketTransport.cs b/lib/netstd/Thrift/Transport/Server/TTlsServerSocketTransport.cs index 0f72438e802..b612d671736 100644 --- a/lib/netstd/Thrift/Transport/Server/TTlsServerSocketTransport.cs +++ b/lib/netstd/Thrift/Transport/Server/TTlsServerSocketTransport.cs @@ -74,10 +74,10 @@ public TTlsServerSocketTransport( _server = new TcpListener(IPAddress.Any, port); _server.Server.NoDelay = true; } - catch (Exception) + catch (Exception ex) { _server = null; - throw new TTransportException($"Could not create ServerSocket on port {port}."); + throw new TTransportException($"Could not create ServerSocket on port {port}.", ex); } } @@ -118,7 +118,7 @@ public override void Listen() } catch (SocketException sx) { - throw new TTransportException($"Could not accept on listening socket: {sx.Message}"); + throw new TTransportException($"Could not accept on listening socket: {sx.Message}", sx); } } } @@ -158,7 +158,7 @@ protected override async ValueTask AcceptImplementationAsync(Cancell } catch (Exception ex) { - throw new TTransportException(ex.ToString()); + throw new TTransportException(ex.ToString(), ex); } } @@ -172,7 +172,7 @@ public override void Close() } catch (Exception ex) { - throw new TTransportException($"WARNING: Could not close server socket: {ex}"); + throw new TTransportException($"WARNING: Could not close server socket: {ex}", ex); } _server = null; From 24ed1d12f35b9a4a2554ecf48bc1dbd13589ce06 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 26 Nov 2024 22:21:28 +0100 Subject: [PATCH 172/430] package upgrade --- .../Thrift.IntegrationTests/Thrift.IntegrationTests.csproj | 2 +- lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj | 2 +- lib/netstd/Thrift/Thrift.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj index ebf684322b5..ff8da43e09a 100644 --- a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj +++ b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj @@ -36,7 +36,7 @@ - + diff --git a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj index 30e3208baef..762fd68c4c1 100644 --- a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj +++ b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj @@ -27,7 +27,7 @@ - + diff --git a/lib/netstd/Thrift/Thrift.csproj b/lib/netstd/Thrift/Thrift.csproj index 9279918e21b..760c5d7b94d 100644 --- a/lib/netstd/Thrift/Thrift.csproj +++ b/lib/netstd/Thrift/Thrift.csproj @@ -88,7 +88,7 @@ - 8.0.10 + 8.0.11 From 45b1868b86d32cafb3bddacc2ff90f8fbd454637 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 26 Nov 2024 22:22:00 +0100 Subject: [PATCH 173/430] (no ticket) netstd testcase for THRIFT-5835 Client: netstd Patch: Jens Geyer --- .../Tests/Thrift.Tests/DataModel/ExceptionAsStruct.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/netstd/Tests/Thrift.Tests/DataModel/ExceptionAsStruct.cs b/lib/netstd/Tests/Thrift.Tests/DataModel/ExceptionAsStruct.cs index 8b9490bcd56..70486bdf38c 100644 --- a/lib/netstd/Tests/Thrift.Tests/DataModel/ExceptionAsStruct.cs +++ b/lib/netstd/Tests/Thrift.Tests/DataModel/ExceptionAsStruct.cs @@ -42,9 +42,9 @@ public async Task Test_Serialize_Deserialize() VerifyIdenticalContent(checking, initial); } - private string FormatKey(int i) => $"Test {i}"; + private static string FormatKey(int i) => $"Test {i}"; - private BatchGetResponse CreateInitialData() + private static BatchGetResponse CreateInitialData() { var initial = new BatchGetResponse() { @@ -63,7 +63,7 @@ private BatchGetResponse CreateInitialData() return initial; } - private async Task WriteAndReadBack(T input) where T : TBase,new() + private static async Task WriteAndReadBack(T input) where T : TBase,new() { var stream = new MemoryStream(); var config = new TConfiguration(); @@ -83,7 +83,7 @@ private async Task WriteAndReadBack(T input) where T : TBase,new() return output; } - private void VerifyIdenticalContent(BatchGetResponse left, BatchGetResponse right) + private static void VerifyIdenticalContent(BatchGetResponse left, BatchGetResponse right) { // Errors Assert.IsNotNull(left.Errors); From f54bdbd9a865df1058ef8056f43f37fbd691b9a2 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 28 Nov 2024 14:59:00 +0100 Subject: [PATCH 174/430] THRIFT-5839 incorrect cast under Win64 Client: delphi Patch: Jens Geyer --- lib/delphi/src/Thrift.Transport.Pipes.pas | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/delphi/src/Thrift.Transport.Pipes.pas b/lib/delphi/src/Thrift.Transport.Pipes.pas index 44dfef78030..10f4dec23e6 100644 --- a/lib/delphi/src/Thrift.Transport.Pipes.pas +++ b/lib/delphi/src/Thrift.Transport.Pipes.pas @@ -912,7 +912,7 @@ function TAnonymousPipeServerTransportImpl.CreateAnonPipe : Boolean; FReadHandle := hPipe; FWriteHandle := hPipeW; finally - if sd <> nil then LocalFree( Cardinal(sd)); + if sd <> nil then LocalFree( NativeUInt(sd)); end; end; @@ -1117,8 +1117,8 @@ function TNamedPipeServerTransportImpl.CreateNamedPipe : THandle; else raise TTransportExceptionNotOpen.Create('CreateNamedPipe() failed ' + IntToStr(GetLastError)); finally - if sd <> nil then LocalFree( Cardinal( sd)); - if acl <> nil then LocalFree( Cardinal( acl)); + if sd <> nil then LocalFree( NativeUInt(sd)); + if acl <> nil then LocalFree( NativeUInt(acl)); if everyone_sid <> nil then FreeSid(everyone_sid); end; end; From eb684d34853c9a8ab7a2759c1c88ae3dfa1b0ef6 Mon Sep 17 00:00:00 2001 From: Thomas Date: Sun, 28 Jul 2024 15:32:23 +0200 Subject: [PATCH 175/430] THRIFT-4386 Add Lua 5.3/5.4 support Clint: lua Patch: Thomas Bruggink This closes #3012 --- build/docker/ubuntu-jammy/Dockerfile | 4 +- .../src/thrift/generate/t_lua_generator.cc | 13 +++ lib/lua/TBinaryProtocol.lua | 35 +++++- lib/lua/TCompactProtocol.lua | 66 ++++++++--- lib/lua/TFramedTransport.lua | 2 +- lib/lua/THttpTransport.lua | 13 ++- lib/lua/TJsonProtocol.lua | 19 +++- lib/lua/TProtocol.lua | 4 + lib/lua/TSocket.lua | 2 +- lib/lua/TTransport.lua | 2 + lib/lua/Thrift.lua | 35 +++++- lib/lua/src/luabitwise.c | 59 ++++++++++ lib/lua/src/luabpack.c | 24 ++++ lib/lua/src/lualongnumber.c | 5 + lib/lua/src/luasocket.c | 6 +- lib/lua/src/usocket.c | 30 +++-- test/lua/Makefile.am | 7 +- test/lua/test_basic_client.lua | 5 +- test/lua/test_basic_server.lua | 105 +++++++++++++++++- test/tests.json | 33 +++--- 20 files changed, 410 insertions(+), 59 deletions(-) diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile index c6176a8feae..a37b7c61ff6 100644 --- a/build/docker/ubuntu-jammy/Dockerfile +++ b/build/docker/ubuntu-jammy/Dockerfile @@ -206,8 +206,8 @@ RUN apt-get install -y --no-install-recommends \ RUN apt-get install -y --no-install-recommends \ `# Lua dependencies` \ - lua5.2 \ - lua5.2-dev + lua5.4 \ + liblua5.4-dev # https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212 # lua5.3 does not install alternatives! # need to update our luasocket code, lua doesn't have luaL_openlib any more diff --git a/compiler/cpp/src/thrift/generate/t_lua_generator.cc b/compiler/cpp/src/thrift/generate/t_lua_generator.cc index 642dd9c3c68..f7f8f054e08 100644 --- a/compiler/cpp/src/thrift/generate/t_lua_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_lua_generator.cc @@ -273,6 +273,9 @@ string t_lua_generator::render_const_value(t_type* type, t_const_value* value) { out << value->get_double(); } break; + case t_base_type::TYPE_UUID: + out << "TUUIDfromString(" << value->get_string() << ")"; + break; default: throw "compiler error: no const of base type " + t_base_type::t_base_name(tbase); } @@ -727,6 +730,8 @@ void t_lua_generator::generate_process_function(ostream& out, if (!tfunction->is_oneway()) { out << indent() << "local result = " << resultname << ":new{}" << '\n'; + } else { + out << indent() << "oprot.trans:flushOneway()" << '\n'; } out << indent() << "local status, res = pcall(self.handler." << fn_name @@ -845,6 +850,9 @@ void t_lua_generator::generate_deserialize_field(ostream& out, case t_base_type::TYPE_DOUBLE: out << "readDouble()"; break; + case t_base_type::TYPE_UUID: + out << "readUuid()"; + break; default: throw "compiler error: no PHP name for base type " + t_base_type::t_base_name(tbase); } @@ -1000,6 +1008,9 @@ void t_lua_generator::generate_serialize_field(ostream& out, t_field* tfield, st case t_base_type::TYPE_DOUBLE: out << "writeDouble(" << name << ")"; break; + case t_base_type::TYPE_UUID: + out << "writeUuid(" << name << ")"; + break; default: throw "compiler error: no PHP name for base type " + t_base_type::t_base_name(tbase); } @@ -1151,6 +1162,8 @@ string t_lua_generator::type_to_enum(t_type* type) { return "TType.I64"; case t_base_type::TYPE_DOUBLE: return "TType.DOUBLE"; + case t_base_type::TYPE_UUID: + return "TType.UUID"; default: throw "compiler error: unhandled type"; } diff --git a/lib/lua/TBinaryProtocol.lua b/lib/lua/TBinaryProtocol.lua index 4b8e98a9d1f..9eacc4ae8ab 100644 --- a/lib/lua/TBinaryProtocol.lua +++ b/lib/lua/TBinaryProtocol.lua @@ -18,8 +18,8 @@ -- require 'TProtocol' -require 'libluabpack' -require 'libluabitwise' +local libluabpack = require 'libluabpack' +local libluabitwise = require 'libluabitwise' TBinaryProtocol = __TObject.new(TProtocolBase, { __type = 'TBinaryProtocol', @@ -111,6 +111,11 @@ function TBinaryProtocol:writeI32(i32) self.trans:write(buff) end +function TBinaryProtocol:writeUI32(i32) + local buff = libluabpack.bpack('I', i32) + self.trans:write(buff) +end + function TBinaryProtocol:writeI64(i64) local buff = libluabpack.bpack('l', i64) self.trans:write(buff) @@ -127,6 +132,13 @@ function TBinaryProtocol:writeString(str) self.trans:write(str) end +function TBinaryProtocol:writeUuid(uuid) + self:writeUI32(uuid.two) + self:writeUI32(uuid.three) + self:writeUI32(uuid.zero) + self:writeUI32(uuid.one) +end + function TBinaryProtocol:readMessageBegin() local sz, ttype, name, seqid = self:readI32() if sz < 0 then @@ -226,6 +238,12 @@ function TBinaryProtocol:readI32() return val end +function TBinaryProtocol:readUI32() + local buff = self.trans:readAll(4) + local val = libluabpack.bunpack('I', buff) + return val +end + function TBinaryProtocol:readI64() local buff = self.trans:readAll(8) local val = libluabpack.bunpack('l', buff) @@ -244,6 +262,19 @@ function TBinaryProtocol:readString() return str end +function TBinaryProtocol:readUuid() + local a = self:readUI32() + local b = self:readUI32() + local c = self:readUI32() + local d = self:readUI32() + return TUUID:new { + zero = c, + one = d, + two = a, + three = b + } +end + TBinaryProtocolFactory = TProtocolFactory:new{ __type = 'TBinaryProtocolFactory', strictRead = false diff --git a/lib/lua/TCompactProtocol.lua b/lib/lua/TCompactProtocol.lua index 8ec7b3a2c0c..f01c56f65dd 100644 --- a/lib/lua/TCompactProtocol.lua +++ b/lib/lua/TCompactProtocol.lua @@ -18,9 +18,9 @@ -- require 'TProtocol' -require 'libluabpack' -require 'libluabitwise' -require 'liblualongnumber' +local libluabpack = require 'libluabpack' +local libluabitwise = require 'libluabitwise' +local liblualongnumber = require 'liblualongnumber' TCompactProtocol = __TObject.new(TProtocolBase, { __type = 'TCompactProtocol', @@ -61,7 +61,8 @@ TCompactType = { COMPACT_LIST = 0x09, COMPACT_SET = 0x0A, COMPACT_MAP = 0x0B, - COMPACT_STRUCT = 0x0C + COMPACT_STRUCT = 0x0C, + COMPACT_UUID = 0x0D, } TTypeToCompactType = {} @@ -77,21 +78,23 @@ TTypeToCompactType[TType.LIST] = TCompactType.COMPACT_LIST TTypeToCompactType[TType.SET] = TCompactType.COMPACT_SET TTypeToCompactType[TType.MAP] = TCompactType.COMPACT_MAP TTypeToCompactType[TType.STRUCT] = TCompactType.COMPACT_STRUCT +TTypeToCompactType[TType.UUID] = TCompactType.COMPACT_UUID CompactTypeToTType = {} -CompactTypeToTType[TType.STOP] = TType.STOP -CompactTypeToTType[TCompactType.COMPACT_BOOLEAN_TRUE] = TType.BOOL +CompactTypeToTType[TType.STOP] = TType.STOP +CompactTypeToTType[TCompactType.COMPACT_BOOLEAN_TRUE] = TType.BOOL CompactTypeToTType[TCompactType.COMPACT_BOOLEAN_FALSE] = TType.BOOL -CompactTypeToTType[TCompactType.COMPACT_BYTE] = TType.BYTE -CompactTypeToTType[TCompactType.COMPACT_I16] = TType.I16 -CompactTypeToTType[TCompactType.COMPACT_I32] = TType.I32 -CompactTypeToTType[TCompactType.COMPACT_I64] = TType.I64 -CompactTypeToTType[TCompactType.COMPACT_DOUBLE] = TType.DOUBLE -CompactTypeToTType[TCompactType.COMPACT_BINARY] = TType.STRING -CompactTypeToTType[TCompactType.COMPACT_LIST] = TType.LIST -CompactTypeToTType[TCompactType.COMPACT_SET] = TType.SET -CompactTypeToTType[TCompactType.COMPACT_MAP] = TType.MAP -CompactTypeToTType[TCompactType.COMPACT_STRUCT] = TType.STRUCT +CompactTypeToTType[TCompactType.COMPACT_BYTE] = TType.BYTE +CompactTypeToTType[TCompactType.COMPACT_I16] = TType.I16 +CompactTypeToTType[TCompactType.COMPACT_I32] = TType.I32 +CompactTypeToTType[TCompactType.COMPACT_I64] = TType.I64 +CompactTypeToTType[TCompactType.COMPACT_DOUBLE] = TType.DOUBLE +CompactTypeToTType[TCompactType.COMPACT_BINARY] = TType.STRING +CompactTypeToTType[TCompactType.COMPACT_LIST] = TType.LIST +CompactTypeToTType[TCompactType.COMPACT_SET] = TType.SET +CompactTypeToTType[TCompactType.COMPACT_MAP] = TType.MAP +CompactTypeToTType[TCompactType.COMPACT_STRUCT] = TType.STRUCT +CompactTypeToTType[TCompactType.COMPACT_UUID] = TType.UUID function TCompactProtocol:resetLastField() self.lastField = {} @@ -197,6 +200,11 @@ function TCompactProtocol:writeI32(i32) self:writeVarint32(libluabpack.i32ToZigzag(i32)) end +function TCompactProtocol:writeUI32(i32) + local buff = libluabpack.bpack('I', i32) + self.trans:write(buff) +end + function TCompactProtocol:writeI64(i64) self:writeVarint64(libluabpack.i64ToZigzag(i64)) end @@ -211,6 +219,13 @@ function TCompactProtocol:writeString(str) self:writeBinary(str) end +function TCompactProtocol:writeUuid(uuid) + self:writeUI32(uuid.two) + self:writeUI32(uuid.three) + self:writeUI32(uuid.zero) + self:writeUI32(uuid.one) +end + function TCompactProtocol:writeBinary(str) -- Should be utf-8 self:writeVarint32(string.len(str)) @@ -385,6 +400,12 @@ function TCompactProtocol:readI32() return value end +function TCompactProtocol:readUI32() + local buff = self.trans:readAll(4) + local val = libluabpack.bunpack('I', buff) + return val +end + function TCompactProtocol:readI64() local value = self:readVarint64() return value @@ -400,6 +421,19 @@ function TCompactProtocol:readString() return self:readBinary() end +function TCompactProtocol:readUuid() + local a = self:readUI32() + local b = self:readUI32() + local c = self:readUI32() + local d = self:readUI32() + return TUUID:new { + zero = c, + one = d, + two = a, + three = b + } +end + function TCompactProtocol:readBinary() local size = self:readVarint32() if size <= 0 then diff --git a/lib/lua/TFramedTransport.lua b/lib/lua/TFramedTransport.lua index 768e2d99742..4f41e834128 100644 --- a/lib/lua/TFramedTransport.lua +++ b/lib/lua/TFramedTransport.lua @@ -18,7 +18,7 @@ -- require 'TTransport' -require 'libluabpack' +local libluabpack = require 'libluabpack' TFramedTransport = TTransportBase:new{ __type = 'TFramedTransport', diff --git a/lib/lua/THttpTransport.lua b/lib/lua/THttpTransport.lua index 2951db79ff8..e1318c3ffea 100644 --- a/lib/lua/THttpTransport.lua +++ b/lib/lua/THttpTransport.lua @@ -160,12 +160,21 @@ function THttpTransport:writeHttpHeader(content_len) end end +function THttpTransport:flushOneway() + self.wBuf = '' + self:writeHttpHeader(0) + self.trans:flush() +end + function THttpTransport:flush() -- If the write fails we still want wBuf to be clear local tmp = self.wBuf self.wBuf = '' - self:writeHttpHeader(string.len(tmp)) - self.trans:write(tmp) + local dataLen = string.len(tmp) + self:writeHttpHeader(dataLen) + if dataLen > 0 then + self.trans:write(tmp) + end self.trans:flush() end diff --git a/lib/lua/TJsonProtocol.lua b/lib/lua/TJsonProtocol.lua index db08eecf156..cec8e2640aa 100644 --- a/lib/lua/TJsonProtocol.lua +++ b/lib/lua/TJsonProtocol.lua @@ -18,8 +18,9 @@ -- require 'TProtocol' -require 'libluabpack' -require 'libluabitwise' +local libluabpack = require 'libluabpack' +local libluabitwise = require 'libluabitwise' +local liblualongnumber = require 'liblualongnumber' TJSONProtocol = __TObject.new(TProtocolBase, { __type = 'TJSONProtocol', @@ -42,6 +43,7 @@ TTypeToString[TType.STRUCT] = "rec" TTypeToString[TType.LIST] = "lst" TTypeToString[TType.SET] = "set" TTypeToString[TType.MAP] = "map" +TTypeToString[TType.UUID] = "uid" StringToTType = { tf = TType.BOOL, @@ -54,7 +56,8 @@ StringToTType = { rec = TType.STRUCT, map = TType.MAP, set = TType.SET, - lst = TType.LIST + lst = TType.LIST, + uid = TType.UUID, } JSONNode = { @@ -402,13 +405,17 @@ function TJSONProtocol:writeI64(i64) end function TJSONProtocol:writeDouble(dub) - self:writeJSONDouble(string.format("%.16f", dub)) + self:writeJSONDouble(string.format("%.20f", dub)) end function TJSONProtocol:writeString(str) self:writeJSONString(str) end +function TJSONProtocol:writeUuid(uuid) + self:writeJSONString(uuid:getString()) +end + function TJSONProtocol:writeBinary(str) -- Should be utf-8 self:writeJSONBase64(str) @@ -706,6 +713,10 @@ function TJSONProtocol:readString() return self:readJSONString() end +function TJSONProtocol:readUuid() + return TUUIDfromString(self:readJSONString()) +end + function TJSONProtocol:readBinary() return self:readJSONBase64() end diff --git a/lib/lua/TProtocol.lua b/lib/lua/TProtocol.lua index 1306fb3d8c3..f7a993f0b50 100644 --- a/lib/lua/TProtocol.lua +++ b/lib/lua/TProtocol.lua @@ -86,6 +86,7 @@ function TProtocolBase:writeI32(i32) end function TProtocolBase:writeI64(i64) end function TProtocolBase:writeDouble(dub) end function TProtocolBase:writeString(str) end +function TProtocolBase:writeUuid(uuid) end function TProtocolBase:readMessageBegin() end function TProtocolBase:readMessageEnd() end function TProtocolBase:readStructBegin() end @@ -105,6 +106,7 @@ function TProtocolBase:readI32() end function TProtocolBase:readI64() end function TProtocolBase:readDouble() end function TProtocolBase:readString() end +function TProtocolBase:readUuid() end function TProtocolBase:skip(ttype) if ttype == TType.BOOL then @@ -151,6 +153,8 @@ function TProtocolBase:skip(ttype) self:skip(ettype) end self:readListEnd() + elseif ttype == TType.UUID then + self:readUuid() else terror(TProtocolException:new{ message = 'Invalid data' diff --git a/lib/lua/TSocket.lua b/lib/lua/TSocket.lua index d71fc1f984e..47ca6f01faf 100644 --- a/lib/lua/TSocket.lua +++ b/lib/lua/TSocket.lua @@ -17,7 +17,7 @@ -- require 'TTransport' -require 'libluasocket' +local luasocket = require 'libluasocket' -- TSocketBase TSocketBase = TTransportBase:new{ diff --git a/lib/lua/TTransport.lua b/lib/lua/TTransport.lua index 01c7e597971..b7f6b830acc 100644 --- a/lib/lua/TTransport.lua +++ b/lib/lua/TTransport.lua @@ -76,6 +76,8 @@ function TTransportBase:readAll(len) return buf end function TTransportBase:write(buf) end +-- flushOneway is a NOOP for most transport types. +function TTransportBase:flushOneway() end function TTransportBase:flush() end TServerTransportBase = __TObject:new{ diff --git a/lib/lua/Thrift.lua b/lib/lua/Thrift.lua index 58daa22eafd..b6e3628ae47 100644 --- a/lib/lua/Thrift.lua +++ b/lib/lua/Thrift.lua @@ -23,6 +23,9 @@ --setfenv(1, thrift) package.cpath = package.cpath .. ';bin/?.so' -- TODO FIX + +local libluabitwise = require 'libluabitwise' + function ttype(obj) if type(obj) == 'table' and obj.__type and @@ -66,8 +69,7 @@ TType = { MAP = 13, SET = 14, LIST = 15, - UTF8 = 16, - UTF16 = 17 + UUID = 16 } TMessageType = { @@ -233,6 +235,35 @@ function TException:write(oprot) oprot:writeStructEnd() end +TUUID = { + zero, + one, + two, + three +} + +TUUID = __TObject:new{ + __type = 'TUUID' +} + +function TUUIDfromString(str) + local iterator = string.gmatch(str, "[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]") + return TUUID:new { + zero = libluabitwise.buor(libluabitwise.ushiftl(tonumber(iterator(), 16), 16), tonumber(iterator(), 16)), + one = libluabitwise.buor(libluabitwise.ushiftl(tonumber(iterator(), 16), 16), tonumber(iterator(), 16)), + two = libluabitwise.buor(libluabitwise.ushiftl(tonumber(iterator(), 16), 16), tonumber(iterator(), 16)), + three = libluabitwise.buor(libluabitwise.ushiftl(tonumber(iterator(), 16), 16), tonumber(iterator(), 16)) + } +end + +function TUUID:getString() + return string.format("%08x-%04x-%04x-%04x-%04x%08x", self.zero, libluabitwise.ushiftr(self.one, 16), libluabitwise.buand(self.one, 0xFFFF), libluabitwise.ushiftr(self.two, 16), libluabitwise.buand(self.two, 0xFFFF), self.three) +end + +function TUUID:__tostring() + return "" +end + -- Basic Client (used in generated lua code) __TClient = __TObject:new{ __type = '__TClient', diff --git a/lib/lua/src/luabitwise.c b/lib/lua/src/luabitwise.c index 2e07e1724ce..ea9110a9c27 100644 --- a/lib/lua/src/luabitwise.c +++ b/lib/lua/src/luabitwise.c @@ -27,6 +27,13 @@ static int l_not(lua_State *L) { return 1; } +static int l_unot(lua_State *L) { + unsigned int a = luaL_checkinteger(L, 1); + a = ~a; + lua_pushnumber(L, a); + return 1; +} + static int l_xor(lua_State *L) { int a = luaL_checkinteger(L, 1); int b = luaL_checkinteger(L, 2); @@ -35,6 +42,15 @@ static int l_xor(lua_State *L) { return 1; } +static int l_uxor(lua_State *L) { + unsigned int a = luaL_checkinteger(L, 1); + unsigned int b = luaL_checkinteger(L, 2); + a ^= b; + lua_pushnumber(L, a); + return 1; +} + + static int l_and(lua_State *L) { int a = luaL_checkinteger(L, 1); int b = luaL_checkinteger(L, 2); @@ -43,6 +59,14 @@ static int l_and(lua_State *L) { return 1; } +static int l_uand(lua_State *L) { + unsigned int a = luaL_checkinteger(L, 1); + unsigned int b = luaL_checkinteger(L, 2); + a &= b; + lua_pushnumber(L, a); + return 1; +} + static int l_or(lua_State *L) { int a = luaL_checkinteger(L, 1); int b = luaL_checkinteger(L, 2); @@ -51,6 +75,14 @@ static int l_or(lua_State *L) { return 1; } +static int l_uor(lua_State *L) { + unsigned int a = luaL_checkinteger(L, 1); + unsigned int b = luaL_checkinteger(L, 2); + a |= b; + lua_pushnumber(L, a); + return 1; +} + static int l_shiftr(lua_State *L) { int a = luaL_checkinteger(L, 1); int b = luaL_checkinteger(L, 2); @@ -59,6 +91,14 @@ static int l_shiftr(lua_State *L) { return 1; } +static int l_ushiftr(lua_State *L) { + unsigned int a = luaL_checkinteger(L, 1); + unsigned int b = luaL_checkinteger(L, 2); + a = a >> b; + lua_pushnumber(L, a); + return 1; +} + static int l_shiftl(lua_State *L) { int a = luaL_checkinteger(L, 1); int b = luaL_checkinteger(L, 2); @@ -67,17 +107,36 @@ static int l_shiftl(lua_State *L) { return 1; } +static int l_ushiftl(lua_State *L) { + unsigned int a = luaL_checkinteger(L, 1); + unsigned int b = luaL_checkinteger(L, 2); + a = a << b; + lua_pushnumber(L, a); + return 1; +} + static const struct luaL_Reg funcs[] = { {"band", l_and}, + {"buand", l_uand}, {"bor", l_or}, + {"buor", l_uor}, {"bxor", l_xor}, + {"buxor", l_uxor}, {"bnot", l_not}, + {"bunot", l_unot}, {"shiftl", l_shiftl}, + {"ushiftl", l_ushiftl}, {"shiftr", l_shiftr}, + {"ushiftr", l_ushiftr}, {NULL, NULL} }; int luaopen_libluabitwise(lua_State *L) { +#if LUA_VERSION_NUM >= 502 + lua_newtable(L); + luaL_setfuncs(L, funcs, 0); +#else luaL_register(L, "libluabitwise", funcs); +#endif return 1; } diff --git a/lib/lua/src/luabpack.c b/lib/lua/src/luabpack.c index 077b6aa0764..cdfb72a9d99 100644 --- a/lib/lua/src/luabpack.c +++ b/lib/lua/src/luabpack.c @@ -45,6 +45,7 @@ static int64_t T_ntohll(uint64_t data) { * c - Signed Byte * s - Signed Short * i - Signed Int + * I - Unsigned Int * l - Signed Long * d - Double */ @@ -72,6 +73,12 @@ static int l_bpack(lua_State *L) { luaL_addlstring(&buf, (void*)&data, sizeof(data)); break; } + case 'I': { + uint32_t data = luaL_checkinteger(L, 2); + data = (uint32_t)htonl(data); + luaL_addlstring(&buf, (void*)&data, sizeof(data)); + break; + } case 'l': { int64_t data = lualongnumber_checklong(L, 2); data = (int64_t)T_htonll(data); @@ -97,6 +104,7 @@ static int l_bpack(lua_State *L) { * C - Unsigned Byte * s - Signed Short * i - Signed Int + * I - Unsigned Int * l - Signed Long * d - Double */ @@ -144,6 +152,17 @@ static int l_bunpack(lua_State *L) { lua_pushnumber(L, val); break; } + /** + * unpack unsigned Int. + */ + case 'I': { + uint32_t val; + luaL_argcheck(L, len == sizeof(val), 1, "Invalid input string size."); + memcpy(&val, data, sizeof(val)); + val = (uint32_t)ntohl(val); + lua_pushnumber(L, val); + break; + } case 'l': { int64_t val; luaL_argcheck(L, len == sizeof(val), 1, "Invalid input string size."); @@ -303,6 +322,11 @@ static const struct luaL_Reg lua_bpack[] = { }; int luaopen_libluabpack(lua_State *L) { +#if LUA_VERSION_NUM >= 502 + lua_newtable(L); + luaL_setfuncs(L, lua_bpack, 0); +#else luaL_register(L, "libluabpack", lua_bpack); +#endif return 1; } diff --git a/lib/lua/src/lualongnumber.c b/lib/lua/src/lualongnumber.c index 9001e4a90dd..91df70a236c 100644 --- a/lib/lua/src/lualongnumber.c +++ b/lib/lua/src/lualongnumber.c @@ -223,6 +223,11 @@ LUALIB_API int luaopen_liblualongnumber(lua_State *L) { lua_pop(L, 1); set_methods(L, LONG_NUM_TYPE, methods); +#if LUA_VERSION_NUM >= 502 + lua_newtable(L); + luaL_setfuncs(L, funcs, 0); +#else luaL_register(L, "liblualongnumber", funcs); +#endif return 1; } diff --git a/lib/lua/src/luasocket.c b/lib/lua/src/luasocket.c index 6f63d3dbfa1..07524ab6a02 100644 --- a/lib/lua/src/luasocket.c +++ b/lib/lua/src/luasocket.c @@ -185,8 +185,12 @@ int luaopen_libluasocket(lua_State *L) { set_methods(L, SOCKET_GENERIC, methods_generic); set_methods(L, SOCKET_CLIENT, methods_client); set_methods(L, SOCKET_SERVER, methods_server); - +#if LUA_VERSION_NUM >= 502 + lua_newtable(L); + luaL_setfuncs(L, funcs_luasocket, 0); +#else luaL_register(L, "luasocket", funcs_luasocket); +#endif return 1; } diff --git a/lib/lua/src/usocket.c b/lib/lua/src/usocket.c index 21c0bac9e92..27103a06b6c 100644 --- a/lib/lua/src/usocket.c +++ b/lib/lua/src/usocket.c @@ -205,21 +205,35 @@ T_ERRCODE socket_connect(p_socket sock, p_sa addr, int addr_len, int timeout) { return socket_wait(sock, WAIT_MODE_C, timeout); } +#define SEND_RETRY_COUNT 5 T_ERRCODE socket_send( p_socket sock, const char *data, size_t len, int timeout) { int err, put = 0; if (*sock < 0) { return CLOSED; } - do { - put = send(*sock, data, len, 0); - if (put > 0) { - return SUCCESS; - } - } while ((err = errno) == EINTR); + for(int i = 0; i < SEND_RETRY_COUNT; i++) { + do { + size_t l = len - put; + put = send(*sock, data + put, l, 0); + if (put > 0) { + if(put == l) { + return SUCCESS; + } + // Not all data was delivered, we need to try again. + err = EAGAIN; + break; + } + } while ((err = errno) == EINTR); - if (err == EAGAIN) { - return socket_wait(sock, WAIT_MODE_W, timeout); + if (err == EAGAIN) { + err = socket_wait(sock, WAIT_MODE_W, timeout); + // Check if the socket is available again and try to resend. + if(err == SUCCESS) { + continue; + } + } + break; } return err; diff --git a/test/lua/Makefile.am b/test/lua/Makefile.am index 00bdf3d2bfb..7cdbe048f31 100644 --- a/test/lua/Makefile.am +++ b/test/lua/Makefile.am @@ -19,11 +19,8 @@ THRIFT = $(top_builddir)/compiler/cpp/thrift -# Remove "MapType =" line to ignore some map bug for now -stubs: ../v0.16/ThriftTest.thrift $(THRIFT) - $(THRIFT) --gen lua $< - $(SED) -i.bak 's/MapType =//g' gen-lua/ThriftTest_ttypes.lua - $(RM) gen-lua/ThriftTest_ttypes.lua.bak +stubs: ../ThriftTest.thrift + $(THRIFT) --gen lua ../ThriftTest.thrift precross: stubs diff --git a/test/lua/test_basic_client.lua b/test/lua/test_basic_client.lua index 11567d906b3..1932dd8c157 100644 --- a/test/lua/test_basic_client.lua +++ b/test/lua/test_basic_client.lua @@ -24,7 +24,7 @@ require('TCompactProtocol') require('TJsonProtocol') require('TBinaryProtocol') require('ThriftTest_ThriftTest') -require('liblualongnumber') +local liblualongnumber = require('liblualongnumber') local client @@ -98,6 +98,9 @@ function testBasicClient(rawArgs) assertEqual(client:testString('lala'), 'lala', 'Failed testString') assertEqual(client:testString('wahoo'), 'wahoo', 'Failed testString') + -- UUID + assertEqual(client:testUuid(TUUIDfromString('00112233-4455-6677-8899-aabbccddeeff')):getString(), '00112233-4455-6677-8899-aabbccddeeff', 'Failed testUuid') + -- Bool assertEqual(client:testBool(true), true, 'Failed testBool true') assertEqual(client:testBool(false), false, 'Failed testBool false') diff --git a/test/lua/test_basic_server.lua b/test/lua/test_basic_server.lua index 20ac407c8da..0b421d1ed91 100644 --- a/test/lua/test_basic_server.lua +++ b/test/lua/test_basic_server.lua @@ -24,7 +24,7 @@ require('TCompactProtocol') require('TJsonProtocol') require('TBinaryProtocol') require('TServer') -require('liblualongnumber') +local liblualongnumber = require('liblualongnumber') -------------------------------------------------------------------------------- -- Handler @@ -62,10 +62,113 @@ function TestHandler:testBinary(by) return by end +function TestHandler:testUuid(uuid) + return uuid +end + +function TestHandler:testNest(thing) + return thing +end + function TestHandler:testStruct(thing) return thing end +function TestHandler:testMap(thing) + return thing +end + +function TestHandler:testStringMap(thing) + return thing +end + +function TestHandler:testSet(thing) + return thing +end + +function TestHandler:testList(thing) + return thing +end + +function TestHandler:testEnum(thing) + return thing +end + +function TestHandler:testTypedef(thing) + return thing +end + +function TestHandler:testMapMap(hello) + return { + ["-4"] = { + ["-4"] = -4, + ["-3"] = -3, + ["-2"] = -2, + ["-1"] = -1 + }, + ["4"] = { + ["1"] = 1, + ["2"] = 2, + ["3"] = 3, + ["4"] = 4 + } + } +end + +function TestHandler:testInsanity(argument) + local first_map = { + [Numberz.TWO] = argument, + [Numberz.THREE] = argument + }; + local second_map = { + [Numberz.SIX] = Insanity:new { + userMap = {}, + xtructs = {} + } + } + + return { + ["1"] = first_map, + ["2"] = second_map + }; +end + +function TestHandler:testMulti(arg0, arg1, arg2, arg3, arg4, arg5) + return Xtruct:new {} +end + +function TestHandler:testException(arg) + if arg == "Xception" then + return Xception:new { + errorCode = 1001, + message = arg + } + elseif arg == "TException" then + error("") + end +end + +function TestHandler:testMultiException(arg0, arg1) + if arg0 == "Xception" then + return Xception:new { + errorCode = 1001, + message = "This is an Xception" + } + elseif arg0 == "Xception2" then + return Xception2:new { + errorCode = 2002, + struct_thing = Xtruct:new { + string_thing = "This is an Xception2" + } + } + elseif arg0 == "TException" then + error("") + end + return Xtruct:new { + string_thing = arg1 + } +end + function TestHandler:testOneway(secondsToSleep) print("testOneway secondsToSleep:", secondsToSleep) end diff --git a/test/tests.json b/test/tests.json index 91aa767f35c..015a559ee3a 100644 --- a/test/tests.json +++ b/test/tests.json @@ -695,24 +695,31 @@ }, "client": { "timeout": 5, - "transports": [ - "buffered", - "framed", - "http" - ], - "sockets": [ - "ip" - ], - "protocols": [ - "binary", - "compact", - "json" - ], "command": [ "lua", "test_basic_client.lua" ] }, + "server": { + "delay": 5, + "command": [ + "lua", + "test_basic_server.lua" + ] + }, + "transports": [ + "buffered", + "framed", + "http" + ], + "sockets": [ + "ip" + ], + "protocols": [ + "binary", + "compact", + "json" + ], "workdir": "lua" }, { From d8cd883a9ac315d982afbeaa2aefcef296165915 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 10 Dec 2024 01:02:46 +0100 Subject: [PATCH 176/430] THRIFT-5837 FIX: error: unused parameter etc Patch: Jens Geyer --- .../src/thrift/generate/t_delphi_generator.cc | 24 ++----------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc index ca371f74935..cc6a460aded 100644 --- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc @@ -172,10 +172,6 @@ class t_delphi_generator : public t_oop_generator { std::string cls_prefix, t_struct* tstruct, bool is_exception); - void generate_delphi_create_exception_impl(ostream& out, - string cls_prefix, - t_struct* tstruct, - bool is_exception); bool is_deprecated(std::map>& annotations); std::string render_deprecation_attribute(std::map>& annotations, std::string prefix, std::string postfix); @@ -1381,6 +1377,7 @@ void t_delphi_generator::generate_delphi_struct_impl(ostream& out, t_struct* tstruct, bool is_result, bool is_const_class) { + (void)is_result; string cls_nm = type_name(tstruct, true, false); @@ -1580,8 +1577,6 @@ void t_delphi_generator::generate_delphi_exception_impl(ostream& out, generate_delphi_struct_reader_impl(out, cls_prefix, tstruct, true); generate_delphi_struct_writer_impl(out, cls_prefix, tstruct, true); generate_delphi_struct_tostring_impl(out, cls_prefix, tstruct, true); - - generate_delphi_create_exception_impl(out, cls_prefix, tstruct, true); } void t_delphi_generator::print_delphi_struct_type_factory_func(ostream& out, t_struct* tstruct) { @@ -2990,7 +2985,6 @@ void t_delphi_generator::generate_delphi_property(ostream& out, (void)isPublic; t_type* ftype = tfield->get_type(); - bool is_xception = ftype->is_xception(); generate_delphi_doc(out, tfield); indent(out) << "property " << prop_name(tfield, struct_is_xception) << ": " << type_name(ftype, false, true/*, false, true*/) @@ -3188,7 +3182,6 @@ string t_delphi_generator::declare_field(t_field* tfield, std::string prefix, bool is_xception_class) { t_type* ftype = tfield->get_type(); - bool is_xception = ftype->is_xception(); string result = prop_name(tfield, is_xception_class, prefix) + ": " + type_name(ftype, false, true) + ";"; @@ -3395,7 +3388,6 @@ void t_delphi_generator::generate_delphi_property_writer_definition(ostream& out t_field* tfield, bool is_xception_class) { t_type* ftype = tfield->get_type(); - bool is_xception = ftype->is_xception(); indent(out) << "procedure " << prop_name(tfield, is_xception_class, "Set") << "( const Value: " << type_name(ftype, false, true/*, false, true*/) << ");" @@ -3407,7 +3399,6 @@ void t_delphi_generator::generate_delphi_property_reader_definition(ostream& out t_field* tfield, bool is_xception_class) { t_type* ftype = tfield->get_type(); - bool is_xception = ftype->is_xception(); indent(out) << "function " << prop_name(tfield, is_xception_class, "Get") << ": " << type_name(ftype, false, true/*, false*/) << ";" @@ -3418,6 +3409,7 @@ void t_delphi_generator::generate_delphi_property_reader_definition(ostream& out void t_delphi_generator::generate_delphi_isset_reader_writer_definition(ostream& out, t_field* tfield, bool is_xception) { + (void)is_xception; indent(out) << "function " << prop_name(tfield, false,"Get__isset_") << ": System.Boolean;" << '\n'; indent(out) << "procedure " << prop_name(tfield, false, "Set__isset_") << "( const value : System.Boolean);" << '\n'; } @@ -3436,7 +3428,6 @@ void t_delphi_generator::generate_delphi_clear_union_value(ostream& out, (void)is_union; t_type* ftype = tfield->get_type(); - bool is_xception = ftype->is_xception(); indent_impl(out) << "if " << prop_name(tfield, is_xception_class,"F__isset_") << " then begin" << '\n'; indent_up_impl(); @@ -3459,7 +3450,6 @@ void t_delphi_generator::generate_delphi_property_writer_impl(ostream& out, (void)type; t_type* ftype = tfield->get_type(); - bool is_xception = ftype->is_xception(); indent_impl(out) << "procedure " << cls_prefix << name << "." << prop_name(tfield, is_xception_class,"Set") @@ -3493,7 +3483,6 @@ void t_delphi_generator::generate_delphi_property_reader_impl(ostream& out, (void)type; t_type* ftype = tfield->get_type(); - bool is_xception = ftype->is_xception(); indent_impl(out) << "function " << cls_prefix << name << "." << prop_name(tfield, is_xception_class,"Get") << ": " @@ -3545,15 +3534,6 @@ void t_delphi_generator::generate_delphi_isset_reader_writer_impl(ostream& out, indent_impl(out) << "end;" << '\n' << '\n'; } -void t_delphi_generator::generate_delphi_create_exception_impl(ostream& out, - string cls_prefix, - t_struct* tstruct, - bool is_exception) { - (void)cls_prefix; - - string exception_cls_nm = type_name(tstruct, true, true); - string cls_nm = type_name(tstruct, true, false/*, is_exception, is_exception*/); -} void t_delphi_generator::generate_delphi_struct_reader_impl(ostream& out, string cls_prefix, From 917149175c4d2181b7548820cb6f28ae172f1d26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Svensson?= Date: Thu, 12 Dec 2024 10:38:22 +0100 Subject: [PATCH 177/430] Fix build warnings for Erlang/OTP 27 Client: Erlang MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since erlfmt is a build dependency, and the currently used version generates new build warnings with latest OTP 27, we lift its version. Includes a formatting correction that is verified to work with the script build/veralign.sh Signed-off-by: Björn Svensson --- lib/erl/rebar.config | 2 +- lib/erl/src/thrift.app.src | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/erl/rebar.config b/lib/erl/rebar.config index c3149b4c088..7f80cfdabad 100644 --- a/lib/erl/rebar.config +++ b/lib/erl/rebar.config @@ -39,7 +39,7 @@ ]}. {plugins, [ - {erlfmt, "1.1.0"} + {erlfmt, "1.5.0"} ]}. {erlfmt, [ diff --git a/lib/erl/src/thrift.app.src b/lib/erl/src/thrift.app.src index 499b7666452..c0d4bab9b60 100644 --- a/lib/erl/src/thrift.app.src +++ b/lib/erl/src/thrift.app.src @@ -21,8 +21,8 @@ % A quick description of the application. {description, "Thrift bindings"}, - % The version of the applicaton - {vsn, "0.22.0"}, + % The version of the applicaton + {vsn, "0.22.0"}, % All modules used by the application. {modules, []}, From 2c29c5665bc442e703480bb0ee60fe925ffe02e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20P=C3=B6ter?= Date: Fri, 13 Dec 2024 09:34:44 +0100 Subject: [PATCH 178/430] =?UTF-8?q?Fix=20documentation=20to=20match=20impl?= =?UTF-8?q?ementation=20Patch:=20Manuel=20P=C3=B6ter=20&=20Jens=20Geyer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This closes #3076 --- doc/specs/thrift-compact-protocol.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/doc/specs/thrift-compact-protocol.md b/doc/specs/thrift-compact-protocol.md index 95145b769fe..e424b1b5768 100644 --- a/doc/specs/thrift-compact-protocol.md +++ b/doc/specs/thrift-compact-protocol.md @@ -112,7 +112,7 @@ early implementation bug that finally became the de-facto standard. Booleans are encoded differently depending on whether it is a field value (in a struct) or an element value (in a set, list or map). Field values are encoded directly in the field header. Element values of type `bool` are sent as an -`int8`; true as `1` and false as `0`. +`int8`; true as `1` and false as `2`. ### Universal unique identifier encoding @@ -247,9 +247,9 @@ Where: The short form should be used when the length is in the range 0 - 14 (inclusive). -The following element-types are used (see note below): +The following element-types are used (see note 1 below): -* `BOOL`, encoded as `2` +* `BOOL`, encoded as `1` or '2' (see note 2 below) * `I8`, encoded as `3` * `I16`, encoded as `4` * `I32`, encoded as `5` @@ -262,8 +262,12 @@ The following element-types are used (see note below): * `STRUCT`, used for structs and union fields, encoded as `12` * `UUID`, encoded as `13` -*Note*: Although field-types and element-types lists are currently very similar, there is _no guarantee_ that this will +*Note*: +1. Although field-types and element-types lists are currently very similar, there is _no guarantee_ that this will remain true after new types are added. +2. For historical and compatibility reasons, a reader should be capable to deal with *both* cases. +The only valid value in the original spec was '2', but due to an widespread implementation bug the defacto +standard across large parts of the library became '1' instead. As a result, both values are now allowed. The maximum list/set size is configurable. By default there is no limit (meaning the limit is the maximum int32 value: 2147483647). From 645467e9b57cf150bd1f455f6b7c97c09033b0b9 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 13 Dec 2024 23:58:01 +0100 Subject: [PATCH 179/430] =?UTF-8?q?Fix=20documentation=20to=20match=20impl?= =?UTF-8?q?ementation=20Patch:=20Manuel=20P=C3=B6ter=20&=20Jens=20Geyer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This closes #3076 --- doc/specs/thrift-compact-protocol.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/specs/thrift-compact-protocol.md b/doc/specs/thrift-compact-protocol.md index e424b1b5768..3e1c4b4548f 100644 --- a/doc/specs/thrift-compact-protocol.md +++ b/doc/specs/thrift-compact-protocol.md @@ -249,7 +249,7 @@ The short form should be used when the length is in the range 0 - 14 (inclusive) The following element-types are used (see note 1 below): -* `BOOL`, encoded as `1` or '2' (see note 2 below) +* `BOOL`, encoded as `1` or `2` (see note 2 below) * `I8`, encoded as `3` * `I16`, encoded as `4` * `I32`, encoded as `5` @@ -266,8 +266,8 @@ The following element-types are used (see note 1 below): 1. Although field-types and element-types lists are currently very similar, there is _no guarantee_ that this will remain true after new types are added. 2. For historical and compatibility reasons, a reader should be capable to deal with *both* cases. -The only valid value in the original spec was '2', but due to an widespread implementation bug the defacto -standard across large parts of the library became '1' instead. As a result, both values are now allowed. +The only valid value in the original spec was `2`, but due to an widespread implementation bug the defacto +standard across large parts of the library became `1` instead. As a result, both values are now allowed. The maximum list/set size is configurable. By default there is no limit (meaning the limit is the maximum int32 value: 2147483647). From 0825ca31e664817168c83e46e494718640227066 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 18 Dec 2024 23:37:09 +0100 Subject: [PATCH 180/430] THRIFT-5841 possible init/deinit conflict with manual initialization flag Client: cpp Patch: Jens Geyer This closes #3077 --- lib/cpp/src/thrift/TOutput.cpp | 2 +- lib/cpp/src/thrift/TOutput.h | 4 ++-- lib/cpp/src/thrift/transport/TSSLServerSocket.cpp | 2 +- lib/cpp/src/thrift/transport/TSSLSocket.cpp | 5 ++++- lib/cpp/src/thrift/transport/TSSLSocket.h | 3 ++- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/cpp/src/thrift/TOutput.cpp b/lib/cpp/src/thrift/TOutput.cpp index 971e5dbf7b1..72360afebff 100644 --- a/lib/cpp/src/thrift/TOutput.cpp +++ b/lib/cpp/src/thrift/TOutput.cpp @@ -31,7 +31,7 @@ namespace apache { namespace thrift { -THRIFT_EXPORT TOutput GlobalOutput; +/*THRIFT_EXPORT*/ TOutput GlobalOutput; // if you need this exported, build your own wrapper lib around and export it yourself TOutput::TOutput() : f_(&errorTimeWrapper) {} diff --git a/lib/cpp/src/thrift/TOutput.h b/lib/cpp/src/thrift/TOutput.h index 26c9a563aed..8a9061a1985 100644 --- a/lib/cpp/src/thrift/TOutput.h +++ b/lib/cpp/src/thrift/TOutput.h @@ -20,7 +20,7 @@ #ifndef _THRIFT_OUTPUT_H_ #define _THRIFT_OUTPUT_H_ 1 -#include +//#include namespace apache { namespace thrift { @@ -53,7 +53,7 @@ class TOutput { void (*f_)(const char*); }; -THRIFT_EXPORT extern TOutput GlobalOutput; +/*THRIFT_EXPORT*/ extern TOutput GlobalOutput; // if you need this exported, build your own wrapper lib around and export it yourself } } // namespace apache::thrift diff --git a/lib/cpp/src/thrift/transport/TSSLServerSocket.cpp b/lib/cpp/src/thrift/transport/TSSLServerSocket.cpp index b20c174087d..9e9fe976eaf 100644 --- a/lib/cpp/src/thrift/transport/TSSLServerSocket.cpp +++ b/lib/cpp/src/thrift/transport/TSSLServerSocket.cpp @@ -17,7 +17,7 @@ * under the License. */ -#include +//#include #include #include diff --git a/lib/cpp/src/thrift/transport/TSSLSocket.cpp b/lib/cpp/src/thrift/transport/TSSLSocket.cpp index da8b027c6c3..aaedf901af1 100644 --- a/lib/cpp/src/thrift/transport/TSSLSocket.cpp +++ b/lib/cpp/src/thrift/transport/TSSLSocket.cpp @@ -875,11 +875,13 @@ unsigned int TSSLSocket::waitForEvent(bool wantRead) { uint64_t TSSLSocketFactory::count_ = 0; Mutex TSSLSocketFactory::mutex_; bool TSSLSocketFactory::manualOpenSSLInitialization_ = false; +bool TSSLSocketFactory::didWeInitializeOpenSSL_ = false; TSSLSocketFactory::TSSLSocketFactory(SSLProtocol protocol) : server_(false) { Guard guard(mutex_); if (count_ == 0) { if (!manualOpenSSLInitialization_) { + didWeInitializeOpenSSL_ = true; initializeOpenSSL(); } randomize(); @@ -892,8 +894,9 @@ TSSLSocketFactory::~TSSLSocketFactory() { Guard guard(mutex_); ctx_.reset(); count_--; - if (count_ == 0 && !manualOpenSSLInitialization_) { + if (count_ == 0 && didWeInitializeOpenSSL_) { cleanupOpenSSL(); + didWeInitializeOpenSSL_ = false; } } diff --git a/lib/cpp/src/thrift/transport/TSSLSocket.h b/lib/cpp/src/thrift/transport/TSSLSocket.h index 5afc571f991..80a68ceabdf 100644 --- a/lib/cpp/src/thrift/transport/TSSLSocket.h +++ b/lib/cpp/src/thrift/transport/TSSLSocket.h @@ -327,7 +327,8 @@ class TSSLSocketFactory { std::shared_ptr access_; static concurrency::Mutex mutex_; static uint64_t count_; - THRIFT_EXPORT static bool manualOpenSSLInitialization_; + /*THRIFT_EXPORT*/ static bool manualOpenSSLInitialization_; // questionable to export a private member + static bool didWeInitializeOpenSSL_; // in that case we also perform de-init void setup(std::shared_ptr ssl); static int passwordCallback(char* password, int size, int, void* data); }; From bb8cac570441e543265fd2402a162a5a889a216f Mon Sep 17 00:00:00 2001 From: Kurt Alfred Kluever Date: Sat, 28 Dec 2024 21:56:46 -0500 Subject: [PATCH 181/430] Update generated array style C-style array declarations (e.g. `Foo foos[]`) is discouraged by the JLS. Java style (e.g., `Foo[] foos`) should be preferred. --- compiler/cpp/src/thrift/generate/t_java_generator.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/cpp/src/thrift/generate/t_java_generator.cc b/compiler/cpp/src/thrift/generate/t_java_generator.cc index e81744e07b0..d944e261146 100644 --- a/compiler/cpp/src/thrift/generate/t_java_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_java_generator.cc @@ -1629,7 +1629,7 @@ void t_java_generator::generate_java_struct_definition(ostream& out, } if (optionals > 0) { - std::string output_string = "private static final _Fields optionals[] = {"; + std::string output_string = "private static final _Fields[] optionals = {"; for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { if ((*m_iter)->get_req() == t_field::T_OPTIONAL) { output_string = output_string + "_Fields." + constant_name((*m_iter)->get_name()) + ","; From 947ad66940cfbadd9b24ba31d892dfc1142dd330 Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Mon, 23 Dec 2024 12:33:22 +0900 Subject: [PATCH 182/430] THRIFT-5842: Add missing cstdint include for int64_t in Mutex.h Client: cpp GCC 15 (not released yet) requires `#include ` for `int64_t` but `lib/cpp/src/thrift/concurrency/Mutex.h` doesn't have it. So we can't build Thrift with GCC 15: [80/359] Building CXX object lib/cpp/CMakeFiles/thrift.dir/src/thrift/transport/TSSLServerSocket.cpp.o FAILED: lib/cpp/CMakeFiles/thrift.dir/src/thrift/transport/TSSLServerSocket.cpp.o /bin/g++-15 -DBOOST_ALL_DYN_LINK -DBOOST_TEST_DYN_LINK -DTHRIFT_STATIC_DEFINE -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/kou/work/cpp/thrift.kou.build/lib/cpp -I/home/kou/work/cpp/thrift.kou/lib/cpp -I/home/kou/work/cpp/thrift.kou.build -I/home/kou/work/cpp/thrift.kou/lib/cpp/src -g -std=c++11 -MD -MT lib/cpp/CMakeFiles/thrift.dir/src/thrift/transport/TSSLServerSocket.cpp.o -MF lib/cpp/CMakeFiles/thrift.dir/src/thrift/transport/TSSLServerSocket.cpp.o.d -o lib/cpp/CMakeFiles/thrift.dir/src/thrift/transport/TSSLServerSocket.cpp.o -c /home/kou/work/cpp/thrift.kou/lib/cpp/src/thrift/transport/TSSLServerSocket.cpp In file included from /home/kou/work/cpp/thrift.kou/lib/cpp/src/thrift/transport/TServerSocket.h:25, from /home/kou/work/cpp/thrift.kou/lib/cpp/src/thrift/transport/TSSLServerSocket.h:23, from /home/kou/work/cpp/thrift.kou/lib/cpp/src/thrift/transport/TSSLServerSocket.cpp:21: /home/kou/work/cpp/thrift.kou/lib/cpp/src/thrift/concurrency/Mutex.h:47:26: error: 'int64_t' has not been declared 47 | virtual bool timedlock(int64_t milliseconds) const; | ^~~~~~~ /home/kou/work/cpp/thrift.kou/lib/cpp/src/thrift/concurrency/Mutex.h:25:1: note: 'int64_t' is defined in header ''; this is probably fixable by adding '#include ' 24 | #include +++ |+#include 25 | /home/kou/work/cpp/thrift.kou/lib/cpp/src/thrift/concurrency/Mutex.h:60:29: error: 'int64_t' has not been declared 60 | Guard(const Mutex& value, int64_t timeout = 0) : mutex_(&value) { | ^~~~~~~ /home/kou/work/cpp/thrift.kou/lib/cpp/src/thrift/concurrency/Mutex.h:60:29: note: 'int64_t' is defined in header ''; this is probably fixable by adding '#include ' See also: https://github.com/apache/arrow/issues/45096 --- lib/cpp/src/thrift/concurrency/Mutex.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/cpp/src/thrift/concurrency/Mutex.h b/lib/cpp/src/thrift/concurrency/Mutex.h index 1e5c3fba37c..12f1729d6bf 100644 --- a/lib/cpp/src/thrift/concurrency/Mutex.h +++ b/lib/cpp/src/thrift/concurrency/Mutex.h @@ -20,6 +20,7 @@ #ifndef _THRIFT_CONCURRENCY_MUTEX_H_ #define _THRIFT_CONCURRENCY_MUTEX_H_ 1 +#include #include #include From e10109c65c25c10e1641a539fe0e0ac6b3a72a75 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Thu, 9 Jan 2025 09:39:37 -0800 Subject: [PATCH 183/430] THRIFT-5845: Return TException for union check in Write Client: go In compiler generated Write method for union types, return a TException (TProtocolException) when the number of fields set is not exactly 1, to help customer logic to decide whether to reuse a connection after an error. While I'm here, also do the same thing for the uniqueness check failure for set fields in Write as well. --- .../cpp/src/thrift/generate/t_go_generator.cc | 12 ++-- lib/go/test/UnionBinaryTest.thrift | 3 +- lib/go/test/tests/write_texception_test.go | 69 +++++++++++++++++++ 3 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 lib/go/test/tests/write_texception_test.go diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc index 8839dde2003..9e1865f95e8 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc @@ -1701,7 +1701,7 @@ void t_go_generator::generate_go_struct_reader(ostream& out, out << indent() << "if !isset" << field_name << "{" << '\n'; indent_up(); out << indent() << "return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, " - "fmt.Errorf(\"Required field " << field_name << " is not set\"));" << '\n'; + << "fmt.Errorf(\"Required field " << field_name << " is not set\"))" << '\n'; indent_down(); out << indent() << "}" << '\n'; } @@ -1748,7 +1748,8 @@ void t_go_generator::generate_go_struct_writer(ostream& out, std::string tstruct_name(publicize(tstruct->get_name())); out << indent() << "if c := p.CountSetFields" << tstruct_name << "(); c != 1 {" << '\n'; indent_up(); - out << indent() << "return fmt.Errorf(\"%T write union: exactly one field must be set (%d set)\", p, c)" << '\n'; + out << indent() << "return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, " + << "fmt.Errorf(\"%T write union: exactly one field must be set (%d set)\", p, c))" << '\n'; indent_down(); out << indent() << "}" << '\n'; } @@ -3719,10 +3720,9 @@ void t_go_generator::generate_serialize_container(ostream& out, indent_down(); out << indent() << "}(" << wrapped_prefix << "[i], " << wrapped_prefix << "[j]) {" << '\n'; indent_up(); - out << indent() - << "return thrift.PrependError(\"\", fmt.Errorf(\"%T error writing set field: slice is not " - "unique\", " - << wrapped_prefix << "))" << '\n'; + out << indent() << "return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, " + << "fmt.Errorf(\"%T error writing set field: slice is not " "unique\", " + << wrapped_prefix << "))" << '\n'; indent_down(); out << indent() << "}" << '\n'; indent_down(); diff --git a/lib/go/test/UnionBinaryTest.thrift b/lib/go/test/UnionBinaryTest.thrift index f77112bdac6..8bce38d00b3 100644 --- a/lib/go/test/UnionBinaryTest.thrift +++ b/lib/go/test/UnionBinaryTest.thrift @@ -21,5 +21,6 @@ union Sample { 1: map u1, 2: binary u2, - 3: list u3 + 3: list u3, + 4: set u4, } diff --git a/lib/go/test/tests/write_texception_test.go b/lib/go/test/tests/write_texception_test.go new file mode 100644 index 00000000000..3241364f88e --- /dev/null +++ b/lib/go/test/tests/write_texception_test.go @@ -0,0 +1,69 @@ +/* + * 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. + */ + +package tests + +import ( + "context" + "errors" + "testing" + + "github.com/apache/thrift/lib/go/test/gopath/src/unionbinarytest" + "github.com/apache/thrift/lib/go/thrift" +) + +func TestWriteUnionTException(t *testing.T) { + // See https://issues.apache.org/jira/browse/THRIFT-5845 + s := unionbinarytest.NewSample() + proto := thrift.NewTBinaryProtocolConf(thrift.NewTMemoryBuffer(), nil) + err := s.Write(context.Background(), proto) + t.Log(err) + if err == nil { + t.Fatal("Writing empty union did not produce error") + } + var te thrift.TException + if !errors.As(err, &te) { + t.Fatalf("Error from writing empty union is not TException: (%T) %v", err, err) + } + if typ := te.TExceptionType(); typ != thrift.TExceptionTypeProtocol && typ != thrift.TExceptionTypeTransport { + t.Errorf("Got TExceptionType %v, want one of TProtocolException or TTransportException", typ) + } +} + +func TestWriteSetTException(t *testing.T) { + // See https://issues.apache.org/jira/browse/THRIFT-5845 + s := unionbinarytest.NewSample() + s.U4 = []string{ + "foo", + "foo", // duplicate + } + proto := thrift.NewTBinaryProtocolConf(thrift.NewTMemoryBuffer(), nil) + err := s.Write(context.Background(), proto) + t.Log(err) + if err == nil { + t.Fatal("Writing duplicate set did not produce error") + } + var te thrift.TException + if !errors.As(err, &te) { + t.Fatalf("Error from writing duplicate set is not TException: (%T) %v", err, err) + } + if typ := te.TExceptionType(); typ != thrift.TExceptionTypeProtocol && typ != thrift.TExceptionTypeTransport { + t.Errorf("Got TExceptionType %v, want one of TProtocolException or TTransportException", typ) + } +} From 1e72949485b2800c90a206ada6efadb0355eda0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:16:43 -0500 Subject: [PATCH 184/430] Bump org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 in /lib/kotlin (#3081) Bumps [org.jetbrains.kotlinx:kotlinx-coroutines-jdk8](https://github.com/Kotlin/kotlinx.coroutines) from 1.9.0 to 1.10.1. - [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases) - [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md) - [Commits](https://github.com/Kotlin/kotlinx.coroutines/compare/1.9.0...1.10.1) --- updated-dependencies: - dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- lib/kotlin/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/kotlin/build.gradle.kts b/lib/kotlin/build.gradle.kts index 16d745bac82..c96a661bd07 100644 --- a/lib/kotlin/build.gradle.kts +++ b/lib/kotlin/build.gradle.kts @@ -31,7 +31,7 @@ repositories { dependencies { implementation(platform("org.jetbrains.kotlin:kotlin-bom")) implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.9.0") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.1") implementation("org.apache.thrift:libthrift:INCLUDED") testImplementation(kotlin("test")) } From ab706525762816953a07982ffa432bb913337c46 Mon Sep 17 00:00:00 2001 From: Cameron Martin Date: Sun, 12 Jan 2025 08:54:49 +0000 Subject: [PATCH 185/430] THRIFT-5564: Add nodejs tests to github actions (#3082) These tests exist, but don't currently run on github actions. This adds a new job to run these. This also fixes the regression in the tests caused by https://github.com/apache/thrift/pull/3014. --- .github/workflows/build.yml | 26 ++++++++++++++++++++++++ lib/nodejs/lib/thrift/thrift.js | 4 ++-- lib/nodejs/test/deep-constructor.test.js | 8 ++++---- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1e953b6ebba..90eb7f323eb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -519,6 +519,32 @@ jobs: - name: Run make check for python run: make -C lib/py check + lib-nodejs: + needs: compiler + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + + - name: Run bootstrap + run: ./bootstrap.sh + + - name: Run configure + run: | + ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-nodejs/with-nodejs/') + + - uses: actions/download-artifact@v4 + with: + name: thrift-compiler + path: compiler/cpp + + - name: Run thrift-compiler + run: | + chmod a+x compiler/cpp/thrift + compiler/cpp/thrift -version + + - name: Run tests + run: make -C lib/nodejs check + cross-test: needs: - lib-java-kotlin diff --git a/lib/nodejs/lib/thrift/thrift.js b/lib/nodejs/lib/thrift/thrift.js index f728eacbe48..3a693f6da58 100644 --- a/lib/nodejs/lib/thrift/thrift.js +++ b/lib/nodejs/lib/thrift/thrift.js @@ -86,7 +86,7 @@ function TApplicationException(type, message) { }; util.inherits(TApplicationException, TException); -TApplicationException.prototype.read = function(input) { +TApplicationException.prototype[Symbol.for("read")] = TApplicationException.prototype.read = function(input) { var ftype; var ret = input.readStructBegin('TApplicationException'); @@ -121,7 +121,7 @@ TApplicationException.prototype.read = function(input) { input.readStructEnd(); }; -TApplicationException.prototype.write = function(output){ +TApplicationException.prototype[Symbol.for("write")] = TApplicationException.prototype.write = function(output){ output.writeStructBegin('TApplicationException'); if (this.message) { diff --git a/lib/nodejs/test/deep-constructor.test.js b/lib/nodejs/test/deep-constructor.test.js index 504dacf0b3b..a91ddb1784c 100644 --- a/lib/nodejs/test/deep-constructor.test.js +++ b/lib/nodejs/test/deep-constructor.test.js @@ -28,7 +28,7 @@ function serializeBinary(data) { buff = msg; }); const prot = new thrift.TBinaryProtocol(transport); - data.write(prot); + data[Symbol.for("write")](prot); prot.flush(); return buff; } @@ -37,7 +37,7 @@ function deserializeBinary(serialized, type) { const t = new thrift.TFramedTransport(serialized); const p = new thrift.TBinaryProtocol(t); const data = new type(); - data.read(p); + data[Symbol.for("read")](p); return data; } @@ -48,7 +48,7 @@ function serializeJSON(data) { }); const protocol = new thrift.TJSONProtocol(transport); protocol.writeMessageBegin("", 0, 0); - data.write(protocol); + data[Symbol.for("write")](protocol); protocol.writeMessageEnd(); protocol.flush(); return buff; @@ -59,7 +59,7 @@ function deserializeJSON(serialized, type) { const protocol = new thrift.TJSONProtocol(transport); protocol.readMessageBegin(); const data = new type(); - data.read(protocol); + data[Symbol.for("read")](protocol); protocol.readMessageEnd(); return data; } From da54fc814cb872bf5ae782364760dfbc4fe414d8 Mon Sep 17 00:00:00 2001 From: Cameron Martin Date: Sun, 12 Jan 2025 08:55:45 +0000 Subject: [PATCH 186/430] THRIFT-5819: use latest rustc version for rustlib (#3085) Client: rust This upgrades the version of rust in the rust-toolchain file, docs and dockerfiles. Doing so requires a few changes to the source, mainly to fix or silence new warnings. Submitted on behalf of a third-party: Jiayu Liu Derived from the following PR: https://github.com/apache/thrift/pull/3045 Co-authored-by: Jiayu Liu --- .github/workflows/build.yml | 2 +- LANGUAGES.md | 2 +- build/docker/README.md | 2 +- build/docker/ubuntu-focal/Dockerfile | 2 +- build/docker/ubuntu-jammy/Dockerfile | 2 +- compiler/cpp/src/thrift/generate/t_rs_generator.cc | 4 ++-- lib/rs/src/lib.rs | 2 +- lib/rs/src/protocol/compact.rs | 4 +--- lib/rs/src/protocol/stored.rs | 4 ++++ lib/rs/src/transport/framed.rs | 2 +- rust-toolchain | 2 +- test/rs/src/bin/test_client.rs | 5 +---- 12 files changed, 16 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 90eb7f323eb..abc37144e8a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -400,7 +400,7 @@ jobs: needs: compiler runs-on: ubuntu-24.04 env: - TOOLCHAIN_VERSION: 1.65.0 + TOOLCHAIN_VERSION: 1.83.0 steps: - uses: actions/checkout@v4 diff --git a/LANGUAGES.md b/LANGUAGES.md index 26ee55576fb..598edb2c538 100644 --- a/LANGUAGES.md +++ b/LANGUAGES.md @@ -319,7 +319,7 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr Rust 0.11.0 Yes -1.65.01.xx.x +1.83.01.xx.x YesYes Yes diff --git a/build/docker/README.md b/build/docker/README.md index 6b535df1b8a..1f67d1d7331 100644 --- a/build/docker/README.md +++ b/build/docker/README.md @@ -196,6 +196,6 @@ Last updated: March 5, 2024 | python2 | 2.7.18 | | | | python3 | 3.8.10 | 3.10.12 | | | ruby | 2.7.0p0 | 3.0.2p107 | | -| rust | 1.65.0 | 1.65.0 | | +| rust | 1.83.0 | 1.83.0 | | | smalltalk | | | Not in CI | | swift | 5.7 | 5.7 | | diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile index 02f84c673d5..52ea5a4d79b 100644 --- a/build/docker/ubuntu-focal/Dockerfile +++ b/build/docker/ubuntu-focal/Dockerfile @@ -273,7 +273,7 @@ RUN apt-get install -y --no-install-recommends \ USER ${user} RUN `# Rust dependencies` \ - curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y + curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.83.0 -y ENV PATH /home/${user}/.cargo/bin:$PATH USER root diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile index a37b7c61ff6..b35111c9695 100644 --- a/build/docker/ubuntu-jammy/Dockerfile +++ b/build/docker/ubuntu-jammy/Dockerfile @@ -272,7 +272,7 @@ RUN apt-get install -y --no-install-recommends \ USER ${user} RUN `# Rust dependencies` \ - curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y + curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.83.0 -y ENV PATH /home/${user}/.cargo/bin:$PATH USER root diff --git a/compiler/cpp/src/thrift/generate/t_rs_generator.cc b/compiler/cpp/src/thrift/generate/t_rs_generator.cc index 780c8fd2914..e336077e15f 100644 --- a/compiler/cpp/src/thrift/generate/t_rs_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_rs_generator.cc @@ -749,8 +749,8 @@ void t_rs_generator::render_const_value(t_type* ttype, } else if (ttype->is_enum()) { f_gen_ << "{" << '\n'; indent_up(); - f_gen_ << indent() << to_rust_type(ttype) << "::try_from(" << tvalue->get_integer() - << ").expect(\"expecting valid const value\")" << '\n'; + f_gen_ << indent() << to_rust_type(ttype) << "::from(" << tvalue->get_integer() + << ")" << '\n'; indent_down(); f_gen_ << indent() << "}"; } else if (ttype->is_struct() || ttype->is_xception()) { diff --git a/lib/rs/src/lib.rs b/lib/rs/src/lib.rs index 84c1f9b71a7..2f6018810b3 100644 --- a/lib/rs/src/lib.rs +++ b/lib/rs/src/lib.rs @@ -53,7 +53,7 @@ //! [tutorial]: https://github.com/apache/thrift/tree/master/tutorial/rs #![crate_type = "lib"] -#![doc(test(attr(allow(unused_variables), deny(warnings))))] +#![doc(test(attr(allow(unused_variables, dead_code), deny(warnings))))] #![deny(bare_trait_objects)] // NOTE: this macro has to be defined before any modules. See: diff --git a/lib/rs/src/protocol/compact.rs b/lib/rs/src/protocol/compact.rs index c0c43722ed8..8ed4e0635e4 100644 --- a/lib/rs/src/protocol/compact.rs +++ b/lib/rs/src/protocol/compact.rs @@ -681,8 +681,6 @@ fn u8_to_type(b: u8) -> crate::Result { #[cfg(test)] mod tests { - use std::i32; - use crate::protocol::{ TFieldIdentifier, TInputProtocol, TListIdentifier, TMapIdentifier, TMessageIdentifier, TMessageType, TOutputProtocol, TSetIdentifier, TStructIdentifier, TType, @@ -2818,7 +2816,7 @@ mod tests { copy_write_buffer_to_read_buffer!(o_prot); let read_double = i_prot.read_double().unwrap(); - assert!(read_double - double < std::f64::EPSILON); + assert!((read_double - double).abs() < f64::EPSILON); } #[test] diff --git a/lib/rs/src/protocol/stored.rs b/lib/rs/src/protocol/stored.rs index f4bdfb19780..04d3277faf3 100644 --- a/lib/rs/src/protocol/stored.rs +++ b/lib/rs/src/protocol/stored.rs @@ -83,6 +83,8 @@ pub struct TStoredInputProtocol<'a> { message_ident: Option, } +// Erroneous suggestion by clippy +#[allow(clippy::needless_lifetimes)] impl<'a> TStoredInputProtocol<'a> { /// Create a `TStoredInputProtocol` that delegates all calls other than /// `TInputProtocol::read_message_begin(...)` to a `wrapped` @@ -100,6 +102,8 @@ impl<'a> TStoredInputProtocol<'a> { } } +// Erroneous suggestion by clippy +#[allow(clippy::needless_lifetimes)] impl<'a> TInputProtocol for TStoredInputProtocol<'a> { fn read_message_begin(&mut self) -> crate::Result { self.message_ident.take().ok_or_else(|| { diff --git a/lib/rs/src/transport/framed.rs b/lib/rs/src/transport/framed.rs index c30ccd9ed62..d8a7448725f 100644 --- a/lib/rs/src/transport/framed.rs +++ b/lib/rs/src/transport/framed.rs @@ -97,7 +97,7 @@ where self.buf.resize(buf_capacity, 0); self.chan.read_exact(&mut self.buf[..message_size])?; - self.cap = message_size as usize; + self.cap = message_size; self.pos = 0; } diff --git a/rust-toolchain b/rust-toolchain index 902c74186fb..6b4de0a42b0 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.65.0 +1.83.0 diff --git a/test/rs/src/bin/test_client.rs b/test/rs/src/bin/test_client.rs index fd3a18550b9..801ccc4b504 100644 --- a/test/rs/src/bin/test_client.rs +++ b/test/rs/src/bin/test_client.rs @@ -252,10 +252,7 @@ fn make_thrift_calls( info!("testi64"); // try!(verify_expected_result(thrift_test_client.test_i64(-8651829879438294565), // -8651829879438294565)); - verify_expected_result( - thrift_test_client.test_i64(i64::min_value()), - i64::min_value(), - )?; + verify_expected_result(thrift_test_client.test_i64(i64::MIN), i64::MIN)?; info!("testDouble"); verify_expected_result( From d078721e44fea7713832ae5d0f5d9ca67317f19e Mon Sep 17 00:00:00 2001 From: Alexandre Detiste Date: Thu, 26 Dec 2024 02:44:13 +0100 Subject: [PATCH 187/430] remove more Python2 compatibility --- compiler/cpp/test/compiler/staleness_check.py | 1 - .../py/fb303_scripts/fb303_simple_mgmt.py | 1 - .../org/apache/thrift/test/EqualityTest.java | 5 +-- lib/py/setup.py | 2 -- lib/py/src/TRecursive.py | 5 --- lib/py/src/TTornado.py | 3 +- lib/py/src/compat.py | 31 +++++-------------- lib/py/src/protocol/TJSONProtocol.py | 14 ++------- lib/py/src/protocol/TProtocol.py | 5 --- lib/py/src/transport/TTransport.py | 3 +- lib/py/src/transport/TZlibTransport.py | 3 +- lib/py/test/thrift_json.py | 2 -- test/crossrunner/compat.py | 25 +++------------ test/crossrunner/report.py | 6 +--- test/py/FastbinaryTest.py | 21 ++++--------- test/py/RunClientServer.py | 2 -- test/py/SerializationTest.py | 3 -- test/py/TestClient.py | 3 -- test/py/TestServer.py | 1 - test/test.py | 1 - 20 files changed, 26 insertions(+), 111 deletions(-) diff --git a/compiler/cpp/test/compiler/staleness_check.py b/compiler/cpp/test/compiler/staleness_check.py index 6b67798d6a4..4dcec15ce89 100755 --- a/compiler/cpp/test/compiler/staleness_check.py +++ b/compiler/cpp/test/compiler/staleness_check.py @@ -17,7 +17,6 @@ # specific language governing permissions and limitations # under the License. # -from __future__ import print_function import os import shutil import subprocess diff --git a/contrib/fb303/py/fb303_scripts/fb303_simple_mgmt.py b/contrib/fb303/py/fb303_scripts/fb303_simple_mgmt.py index 5c8f409c1af..62a729e1d8f 100644 --- a/contrib/fb303/py/fb303_scripts/fb303_simple_mgmt.py +++ b/contrib/fb303/py/fb303_scripts/fb303_simple_mgmt.py @@ -19,7 +19,6 @@ # under the License. # -from __future__ import print_function import sys import os from optparse import OptionParser diff --git a/lib/java/src/test/java/org/apache/thrift/test/EqualityTest.java b/lib/java/src/test/java/org/apache/thrift/test/EqualityTest.java index fee495ca762..02a14d07eec 100644 --- a/lib/java/src/test/java/org/apache/thrift/test/EqualityTest.java +++ b/lib/java/src/test/java/org/apache/thrift/test/EqualityTest.java @@ -20,10 +20,7 @@ /* This program was generated by the following Python script: -#!/usr/bin/python2.5 - -# Remove this when Python 2.6 hits the streets. -from __future__ import with_statement +#!/usr/bin/python3 import sys import os.path diff --git a/lib/py/setup.py b/lib/py/setup.py index 066483e19de..2a170a411cc 100644 --- a/lib/py/setup.py +++ b/lib/py/setup.py @@ -97,8 +97,6 @@ def run_setup(with_binary): extensions = dict() ssl_deps = [] - if sys.version_info[0] == 2: - ssl_deps.append('ipaddress') if sys.hexversion < 0x03050000: ssl_deps.append('backports.ssl_match_hostname>=3.5') tornado_deps = ['tornado>=4.0'] diff --git a/lib/py/src/TRecursive.py b/lib/py/src/TRecursive.py index abf202cb1eb..aed696ad993 100644 --- a/lib/py/src/TRecursive.py +++ b/lib/py/src/TRecursive.py @@ -10,11 +10,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - from thrift.Thrift import TType TYPE_IDX = 1 diff --git a/lib/py/src/TTornado.py b/lib/py/src/TTornado.py index 5eff11d2d85..c409e09eb4c 100644 --- a/lib/py/src/TTornado.py +++ b/lib/py/src/TTornado.py @@ -17,7 +17,6 @@ # under the License. # -from __future__ import absolute_import import logging import socket import struct @@ -34,7 +33,7 @@ logger = logging.getLogger(__name__) -class _Lock(object): +class _Lock: def __init__(self): self._waiters = deque() diff --git a/lib/py/src/compat.py b/lib/py/src/compat.py index 0e8271dc193..3b3d57f56e5 100644 --- a/lib/py/src/compat.py +++ b/lib/py/src/compat.py @@ -17,30 +17,13 @@ # under the License. # -import sys +from io import BytesIO as BufferIO # noqa -if sys.version_info[0] == 2: +def binary_to_str(bin_val): + return bin_val.decode('utf8') - from cStringIO import StringIO as BufferIO +def str_to_binary(str_val): + return bytes(str_val, 'utf8') - def binary_to_str(bin_val): - return bin_val - - def str_to_binary(str_val): - return str_val - - def byte_index(bytes_val, i): - return ord(bytes_val[i]) - -else: - - from io import BytesIO as BufferIO # noqa - - def binary_to_str(bin_val): - return bin_val.decode('utf8') - - def str_to_binary(str_val): - return bytes(str_val, 'utf8') - - def byte_index(bytes_val, i): - return bytes_val[i] +def byte_index(bytes_val, i): + return bytes_val[i] diff --git a/lib/py/src/protocol/TJSONProtocol.py b/lib/py/src/protocol/TJSONProtocol.py index 17417027a0a..fef0cc9422b 100644 --- a/lib/py/src/protocol/TJSONProtocol.py +++ b/lib/py/src/protocol/TJSONProtocol.py @@ -263,19 +263,11 @@ def _isLowSurrogate(self, codeunit): def _toChar(self, high, low=None): if not low: - if sys.version_info[0] == 2: - return ("\\u%04x" % high).decode('unicode-escape') \ - .encode('utf-8') - else: - return chr(high) + return chr(high) else: codepoint = (1 << 16) + ((high & 0x3ff) << 10) codepoint += low & 0x3ff - if sys.version_info[0] == 2: - s = "\\U%08x" % codepoint - return s.decode('unicode-escape').encode('utf-8') - else: - return chr(codepoint) + return chr(codepoint) def readJSONString(self, skipContext): highSurrogate = None @@ -317,7 +309,7 @@ def readJSONString(self, skipContext): elif character in ESCAPE_CHAR_VALS: raise TProtocolException(TProtocolException.INVALID_DATA, "Unescaped control char") - elif sys.version_info[0] > 2: + else: utf8_bytes = bytearray([ord(character)]) while ord(self.reader.peek()) >= 0x80: utf8_bytes.append(ord(self.reader.read())) diff --git a/lib/py/src/protocol/TProtocol.py b/lib/py/src/protocol/TProtocol.py index bac54aece9d..ec71ab3aa72 100644 --- a/lib/py/src/protocol/TProtocol.py +++ b/lib/py/src/protocol/TProtocol.py @@ -261,11 +261,6 @@ def _ttype_handlers(self, ttype, spec): raise TProtocolException(type=TProtocolException.INVALID_DATA, message='Invalid binary field type %d' % ttype) return ('readBinary', 'writeBinary', False) - if sys.version_info[0] == 2 and spec == 'UTF8': - if ttype != TType.STRING: - raise TProtocolException(type=TProtocolException.INVALID_DATA, - message='Invalid string field type %d' % ttype) - return ('readUtf8', 'writeUtf8', False) return self._TTYPE_HANDLERS[ttype] if ttype < len(self._TTYPE_HANDLERS) else (None, None, False) def _read_by_ttype(self, ttype, spec, espec): diff --git a/lib/py/src/transport/TTransport.py b/lib/py/src/transport/TTransport.py index ff20d7ec99b..a686b1231c6 100644 --- a/lib/py/src/transport/TTransport.py +++ b/lib/py/src/transport/TTransport.py @@ -17,9 +17,10 @@ # under the License. # +from io import BytesIO as BufferIO + from struct import pack, unpack from thrift.Thrift import TException -from ..compat import BufferIO class TTransportException(TException): diff --git a/lib/py/src/transport/TZlibTransport.py b/lib/py/src/transport/TZlibTransport.py index e8485792464..8b08297645d 100644 --- a/lib/py/src/transport/TZlibTransport.py +++ b/lib/py/src/transport/TZlibTransport.py @@ -22,13 +22,12 @@ data compression. """ -from __future__ import division import zlib from .TTransport import TTransportBase, CReadableTransport from ..compat import BufferIO -class TZlibTransportFactory(object): +class TZlibTransportFactory: """Factory transport that builds zlib compressed transports. This factory caches the last single client/transport that it was passed diff --git a/lib/py/test/thrift_json.py b/lib/py/test/thrift_json.py index 125ea59f6c7..5a491e2c495 100644 --- a/lib/py/test/thrift_json.py +++ b/lib/py/test/thrift_json.py @@ -42,8 +42,6 @@ def test_escaped_unicode_string(self): transport = TTransport.TBufferedTransportFactory().getTransport(buf) protocol = TJSONProtocol(transport) - if sys.version_info[0] == 2: - unicode_text = unicode_text.encode('utf8') self.assertEqual(protocol.readString(), unicode_text) def test_TJSONProtocol_write(self): diff --git a/test/crossrunner/compat.py b/test/crossrunner/compat.py index 932a48cd6ad..a670c33f266 100644 --- a/test/crossrunner/compat.py +++ b/test/crossrunner/compat.py @@ -1,24 +1,7 @@ import os -import sys -if sys.version_info[0] == 2: - _ENCODE = sys.getfilesystemencoding() +path_join = os.path.join +str_join = str.join - def path_join(*args): - bin_args = map(lambda a: a.decode(_ENCODE), args) - return os.path.join(*bin_args).encode(_ENCODE) - - def str_join(left, right): - bin_args = map(lambda a: a.decode(_ENCODE), right) - b = left.decode(_ENCODE) - return b.join(bin_args).encode(_ENCODE) - - logfile_open = open - -else: - - path_join = os.path.join - str_join = str.join - - def logfile_open(*args): - return open(*args, errors='replace') +def logfile_open(*args): + return open(*args, errors='replace') diff --git a/test/crossrunner/report.py b/test/crossrunner/report.py index 5baf1619524..7e1b0c747e9 100644 --- a/test/crossrunner/report.py +++ b/test/crossrunner/report.py @@ -17,7 +17,6 @@ # under the License. # -from __future__ import print_function import datetime import json import multiprocessing @@ -317,10 +316,7 @@ def _print_unexpected_success(self): self._print_bar() def _http_server_command(self, port): - if sys.version_info[0] < 3: - return 'python -m SimpleHTTPServer %d' % port - else: - return 'python -m http.server %d' % port + return 'python -m http.server %d' % port def _print_footer(self): fail_count = len(self._expected_failure) + len(self._unexpected_failure) diff --git a/test/py/FastbinaryTest.py b/test/py/FastbinaryTest.py index 05c0bb6d15a..f6803575cdb 100755 --- a/test/py/FastbinaryTest.py +++ b/test/py/FastbinaryTest.py @@ -25,8 +25,6 @@ # TODO(dreiss): Test error cases. Check for memory leaks. -from __future__ import print_function - import math import os import sys @@ -68,15 +66,11 @@ def isOpen(self): ooe2.integer64 = 64 ooe2.double_precision = (math.sqrt(5) + 1) / 2 ooe2.some_characters = ":R (me going \"rrrr\")" -ooe2.zomg_unicode = u"\xd3\x80\xe2\x85\xae\xce\x9d\x20"\ - u"\xd0\x9d\xce\xbf\xe2\x85\xbf\xd0\xbe"\ - u"\xc9\xa1\xd0\xb3\xd0\xb0\xcf\x81\xe2\x84\x8e"\ - u"\x20\xce\x91\x74\x74\xce\xb1\xe2\x85\xbd\xce\xba"\ - u"\xc7\x83\xe2\x80\xbc" - -if sys.version_info[0] == 2 and os.environ.get('THRIFT_TEST_PY_NO_UTF8STRINGS'): - ooe1.zomg_unicode = ooe1.zomg_unicode.encode('utf8') - ooe2.zomg_unicode = ooe2.zomg_unicode.encode('utf8') +ooe2.zomg_unicode = "\xd3\x80\xe2\x85\xae\xce\x9d\x20"\ + "\xd0\x9d\xce\xbf\xe2\x85\xbf\xd0\xbe"\ + "\xc9\xa1\xd0\xb3\xd0\xb0\xcf\x81\xe2\x84\x8e"\ + "\x20\xce\x91\x74\x74\xce\xb1\xe2\x85\xbd\xce\xba"\ + "\xc7\x83\xe2\x80\xbc" hm = HolyMoley(**{"big": [], "contain": set(), "bonks": {}}) hm.big.append(ooe1) @@ -86,10 +80,7 @@ def isOpen(self): hm.contain.add(("and a one", "and a two")) hm.contain.add(("then a one, two", "three!", "FOUR!")) -if sys.version_info[0] == 2 and os.environ.get('THRIFT_TEST_PY_NO_UTF8STRINGS'): - hm.contain.add((u"\xd7\n\a\t".encode('utf8'),)) -else: - hm.contain.add((u"\xd7\n\a\t",)) +hm.contain.add(("\xd7\n\a\t",)) hm.contain.add(()) hm.bonks["nothing"] = [] diff --git a/test/py/RunClientServer.py b/test/py/RunClientServer.py index 583d88a6422..f48224fa5cf 100755 --- a/test/py/RunClientServer.py +++ b/test/py/RunClientServer.py @@ -19,8 +19,6 @@ # under the License. # -from __future__ import division -from __future__ import print_function import platform import copy import os diff --git a/test/py/SerializationTest.py b/test/py/SerializationTest.py index f47c3d4d6af..218f26c43be 100755 --- a/test/py/SerializationTest.py +++ b/test/py/SerializationTest.py @@ -278,9 +278,6 @@ def testCompactStruct(self): self.assertTrue(len(rep) > 0) def testIntegerLimits(self): - if (sys.version_info[0] == 2 and sys.version_info[1] <= 6): - print('Skipping testIntegerLimits for Python 2.6') - return bad_values = [CompactProtoTestStruct(a_byte=128), CompactProtoTestStruct(a_byte=-129), CompactProtoTestStruct(a_i16=32768), CompactProtoTestStruct(a_i16=-32769), CompactProtoTestStruct(a_i32=2147483648), CompactProtoTestStruct(a_i32=-2147483649), diff --git a/test/py/TestClient.py b/test/py/TestClient.py index 61a9c60404f..d80ddf46f70 100755 --- a/test/py/TestClient.py +++ b/test/py/TestClient.py @@ -106,9 +106,6 @@ def testString(self): Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語""" - if sys.version_info[0] == 2 and os.environ.get('THRIFT_TEST_PY_NO_UTF8STRINGS'): - s1 = s1.encode('utf8') - s2 = s2.encode('utf8') self.assertEqual(self.client.testString(s1), s1) self.assertEqual(self.client.testString(s2), s2) diff --git a/test/py/TestServer.py b/test/py/TestServer.py index 81ae1ad62ee..e062378a8fa 100755 --- a/test/py/TestServer.py +++ b/test/py/TestServer.py @@ -18,7 +18,6 @@ # specific language governing permissions and limitations # under the License. # -from __future__ import division import logging import os import signal diff --git a/test/test.py b/test/test.py index cd5c4d41d6e..a288c265ae1 100755 --- a/test/test.py +++ b/test/test.py @@ -27,7 +27,6 @@ # subprocess management that are needed for reliability. # -from __future__ import print_function from itertools import chain import json import logging From 7734c393ed0f0632c658c05e33a4d6592cf2912c Mon Sep 17 00:00:00 2001 From: Brad Smith Date: Mon, 9 Dec 2024 17:07:56 -0500 Subject: [PATCH 188/430] lib/cpp/test/CMakeLists.txt: Fix building with OpenBSD OpenBSD does not have librt. --- lib/cpp/test/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/cpp/test/CMakeLists.txt b/lib/cpp/test/CMakeLists.txt index a73b3e6f772..31acf124404 100644 --- a/lib/cpp/test/CMakeLists.txt +++ b/lib/cpp/test/CMakeLists.txt @@ -133,7 +133,7 @@ target_link_libraries(TInterruptTest ${Boost_LIBRARIES} ) target_link_libraries(TInterruptTest thrift) -if (NOT MSVC AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT MINGW) +if (NOT MSVC AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD" AND NOT MINGW) target_link_libraries(TInterruptTest -lrt) endif () add_test(NAME TInterruptTest COMMAND TInterruptTest -- "${CMAKE_CURRENT_SOURCE_DIR}/../../../test/keys") @@ -144,7 +144,7 @@ target_link_libraries(TServerIntegrationTest ${Boost_LIBRARIES} ) target_link_libraries(TServerIntegrationTest thrift) -if (NOT MSVC AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT MINGW) +if (NOT MSVC AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD" AND NOT MINGW) target_link_libraries(TServerIntegrationTest -lrt) endif () add_test(NAME TServerIntegrationTest COMMAND TServerIntegrationTest) @@ -347,7 +347,7 @@ target_link_libraries(SecurityTest ${Boost_LIBRARIES} ) target_link_libraries(SecurityTest thrift) -if (NOT MSVC AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT MINGW) +if (NOT MSVC AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD" AND NOT MINGW) target_link_libraries(SecurityTest -lrt) endif () add_test(NAME SecurityTest COMMAND SecurityTest -- "${CMAKE_CURRENT_SOURCE_DIR}/../../../test/keys") @@ -358,7 +358,7 @@ target_link_libraries(SecurityFromBufferTest ${Boost_LIBRARIES} ) target_link_libraries(SecurityFromBufferTest thrift) -if (NOT MSVC AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT MINGW) +if (NOT MSVC AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD" AND NOT MINGW) target_link_libraries(SecurityFromBufferTest -lrt) endif () add_test(NAME SecurityFromBufferTest COMMAND SecurityFromBufferTest -- "${CMAKE_CURRENT_SOURCE_DIR}/../../../test/keys") From a45618e05bbb2d29737514541b6d61f6850d9b16 Mon Sep 17 00:00:00 2001 From: Jeremiah <4462211+jeremiahpslewis@users.noreply.github.com> Date: Tue, 28 Jan 2025 22:55:57 +0100 Subject: [PATCH 189/430] Upstream mingw capitalization patch https://github.com/JuliaPackaging/Yggdrasil/blob/6e82040941e891288e394713ee64562698b7ab0d/T/Thrift/bundled/patches/mingw-capitalization.patch --- lib/cpp/src/thrift/transport/THttpServer.cpp | 2 +- lib/cpp/src/thrift/transport/TPipeServer.cpp | 4 ++-- lib/cpp/src/thrift/transport/TServerSocket.cpp | 2 +- lib/cpp/src/thrift/transport/TWebSocketServer.h | 2 +- lib/cpp/src/thrift/windows/SocketPair.cpp | 2 +- lib/cpp/src/thrift/windows/Sync.h | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/cpp/src/thrift/transport/THttpServer.cpp b/lib/cpp/src/thrift/transport/THttpServer.cpp index 91a1c39afcd..6fc2816748c 100644 --- a/lib/cpp/src/thrift/transport/THttpServer.cpp +++ b/lib/cpp/src/thrift/transport/THttpServer.cpp @@ -25,7 +25,7 @@ #include #include #if defined(_MSC_VER) || defined(__MINGW32__) - #include + #include #endif using std::string; diff --git a/lib/cpp/src/thrift/transport/TPipeServer.cpp b/lib/cpp/src/thrift/transport/TPipeServer.cpp index e4234b180b5..fd1aeee9514 100644 --- a/lib/cpp/src/thrift/transport/TPipeServer.cpp +++ b/lib/cpp/src/thrift/transport/TPipeServer.cpp @@ -27,8 +27,8 @@ #ifdef _WIN32 #include #include -#include -#include +#include +#include #include #endif //_WIN32 diff --git a/lib/cpp/src/thrift/transport/TServerSocket.cpp b/lib/cpp/src/thrift/transport/TServerSocket.cpp index 7cab0eefa77..ffe9ed3a504 100644 --- a/lib/cpp/src/thrift/transport/TServerSocket.cpp +++ b/lib/cpp/src/thrift/transport/TServerSocket.cpp @@ -73,7 +73,7 @@ // adds problematic macros like min() and max(). Try to work around: #define NOMINMAX #define WIN32_LEAN_AND_MEAN -#include +#include #undef NOMINMAX #undef WIN32_LEAN_AND_MEAN #endif diff --git a/lib/cpp/src/thrift/transport/TWebSocketServer.h b/lib/cpp/src/thrift/transport/TWebSocketServer.h index 7f39f36b95e..2a3e076cf04 100644 --- a/lib/cpp/src/thrift/transport/TWebSocketServer.h +++ b/lib/cpp/src/thrift/transport/TWebSocketServer.h @@ -31,7 +31,7 @@ #include #include #if defined(_MSC_VER) || defined(__MINGW32__) -#include +#include #define THRIFT_strncasecmp(str1, str2, len) _strnicmp(str1, str2, len) #define THRIFT_strcasestr(haystack, needle) StrStrIA(haystack, needle) #else diff --git a/lib/cpp/src/thrift/windows/SocketPair.cpp b/lib/cpp/src/thrift/windows/SocketPair.cpp index 2650b37d475..9271b02943b 100644 --- a/lib/cpp/src/thrift/windows/SocketPair.cpp +++ b/lib/cpp/src/thrift/windows/SocketPair.cpp @@ -34,7 +34,7 @@ #include // Win32 -#include +#include int thrift_socketpair(int d, int type, int protocol, THRIFT_SOCKET sv[2]) { THRIFT_UNUSED_VARIABLE(protocol); diff --git a/lib/cpp/src/thrift/windows/Sync.h b/lib/cpp/src/thrift/windows/Sync.h index 89aaead7795..e143b863418 100644 --- a/lib/cpp/src/thrift/windows/Sync.h +++ b/lib/cpp/src/thrift/windows/Sync.h @@ -37,7 +37,7 @@ #define WIN32_LEAN_AND_MEAN #define _THRIFT_UNDEF_WIN32_LEAN_AND_MEAN #endif -#include +#include #ifdef _THRIFT_UNDEF_NOMINMAX #undef NOMINMAX #undef _THRIFT_UNDEF_NOMINMAX From 93c15c202247892fd7378ef19a346ff13e201263 Mon Sep 17 00:00:00 2001 From: Hasnain Lakhani Date: Sun, 2 Feb 2025 16:58:28 -0800 Subject: [PATCH 190/430] Various build fixes for clang and rust --- compiler/cpp/src/thrift/generate/t_go_generator.h | 2 +- compiler/cpp/src/thrift/parse/t_function.h | 2 +- compiler/cpp/src/thrift/parse/t_list.h | 2 +- compiler/cpp/src/thrift/parse/t_map.h | 2 +- compiler/cpp/src/thrift/parse/t_set.h | 2 +- compiler/cpp/src/thrift/parse/t_struct.h | 2 +- tutorial/rs/src/bin/tutorial_client.rs | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.h b/compiler/cpp/src/thrift/generate/t_go_generator.h index d84b18686f1..72825bc9caa 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.h +++ b/compiler/cpp/src/thrift/generate/t_go_generator.h @@ -288,7 +288,7 @@ class t_go_generator : public t_generator { static bool is_pointer_field(t_field* tfield, bool in_container = false); - std::string indent_str() const { + std::string indent_str() const override { return "\t"; } diff --git a/compiler/cpp/src/thrift/parse/t_function.h b/compiler/cpp/src/thrift/parse/t_function.h index d2cb19bbc3a..abe29039f95 100644 --- a/compiler/cpp/src/thrift/parse/t_function.h +++ b/compiler/cpp/src/thrift/parse/t_function.h @@ -83,7 +83,7 @@ class t_function : public t_doc { std::map> annotations_; - void validate() const { + void validate() const override { get_returntype()->validate(); #ifndef ALLOW_EXCEPTIONS_AS_TYPE diff --git a/compiler/cpp/src/thrift/parse/t_list.h b/compiler/cpp/src/thrift/parse/t_list.h index 162281cc088..9c1dfadea27 100644 --- a/compiler/cpp/src/thrift/parse/t_list.h +++ b/compiler/cpp/src/thrift/parse/t_list.h @@ -34,7 +34,7 @@ class t_list : public t_container { bool is_list() const override { return true; } - void validate() const { + void validate() const override { #ifndef ALLOW_EXCEPTIONS_AS_TYPE if( get_elem_type()->get_true_type()->is_xception()) { failure("exception type \"%s\" cannot be used inside a list", get_elem_type()->get_name().c_str()); diff --git a/compiler/cpp/src/thrift/parse/t_map.h b/compiler/cpp/src/thrift/parse/t_map.h index 30a8b06c9b9..6ec58cfbb13 100644 --- a/compiler/cpp/src/thrift/parse/t_map.h +++ b/compiler/cpp/src/thrift/parse/t_map.h @@ -37,7 +37,7 @@ class t_map : public t_container { bool is_map() const override { return true; } - void validate() const { + void validate() const override { #ifndef ALLOW_EXCEPTIONS_AS_TYPE if( get_key_type()->get_true_type()->is_xception()) { failure("exception type \"%s\" cannot be used inside a map", get_key_type()->get_name().c_str()); diff --git a/compiler/cpp/src/thrift/parse/t_set.h b/compiler/cpp/src/thrift/parse/t_set.h index 88de93f44c4..8f7599a5a60 100644 --- a/compiler/cpp/src/thrift/parse/t_set.h +++ b/compiler/cpp/src/thrift/parse/t_set.h @@ -36,7 +36,7 @@ class t_set : public t_container { bool is_set() const override { return true; } - void validate() const { + void validate() const override { #ifndef ALLOW_EXCEPTIONS_AS_TYPE if( get_elem_type()->get_true_type()->is_xception()) { failure("exception type \"%s\" cannot be used inside a set", get_elem_type()->get_name().c_str()); diff --git a/compiler/cpp/src/thrift/parse/t_struct.h b/compiler/cpp/src/thrift/parse/t_struct.h index 3aa67c0e16a..8b33ee6c4b3 100644 --- a/compiler/cpp/src/thrift/parse/t_struct.h +++ b/compiler/cpp/src/thrift/parse/t_struct.h @@ -130,7 +130,7 @@ class t_struct : public t_type { return nullptr; } - void validate() const { + void validate() const override { std::string what = "struct"; if( is_union()) { what = "union"; diff --git a/tutorial/rs/src/bin/tutorial_client.rs b/tutorial/rs/src/bin/tutorial_client.rs index 4bf2ec098a0..b79ae83e204 100644 --- a/tutorial/rs/src/bin/tutorial_client.rs +++ b/tutorial/rs/src/bin/tutorial_client.rs @@ -107,7 +107,7 @@ fn new_client( // open the underlying TCP stream println!("connecting to tutorial server on {}:{}", host, port); - c.open(&format!("{}:{}", host, port))?; + c.open(format!("{}:{}", host, port))?; // clone the TCP channel into two halves, one which // we'll use for reading, the other for writing From 8493de2b10c331fbf6868d0deba2b0f7f05be052 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 06:42:36 +0000 Subject: [PATCH 191/430] Bump com.diffplug.spotless from 6.25.0 to 7.0.2 in /lib/java Bumps com.diffplug.spotless from 6.25.0 to 7.0.2. --- updated-dependencies: - dependency-name: com.diffplug.spotless dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- lib/java/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/java/build.gradle b/lib/java/build.gradle index e09a7e832b3..6ee454a026a 100644 --- a/lib/java/build.gradle +++ b/lib/java/build.gradle @@ -42,7 +42,7 @@ plugins { id 'pmd' id 'com.github.johnrengelman.shadow' version '8.1.1' id "com.github.spotbugs" version "5.2.5" - id "com.diffplug.spotless" version "6.25.0" + id "com.diffplug.spotless" version "7.0.2" } description = 'Apache Thrift Java Library' From a630739e2859febe523258ec243cd524c34ff06f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 06:02:48 +0000 Subject: [PATCH 192/430] Bump jvm from 2.0.21 to 2.1.10 in /lib/kotlin Bumps [jvm](https://github.com/JetBrains/kotlin) from 2.0.21 to 2.1.10. - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.0.21...v2.1.10) --- updated-dependencies: - dependency-name: jvm dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lib/kotlin/settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/kotlin/settings.gradle.kts b/lib/kotlin/settings.gradle.kts index 1141390503d..77672a55512 100644 --- a/lib/kotlin/settings.gradle.kts +++ b/lib/kotlin/settings.gradle.kts @@ -18,7 +18,7 @@ */ pluginManagement { plugins { - kotlin("jvm") version "2.0.21" + kotlin("jvm") version "2.1.10" id("com.ncorti.ktfmt.gradle") version "0.20.1" } } From 717bd79c204c96acb01a27925b668106c8ee3dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Horstmann?= Date: Sun, 2 Feb 2025 23:10:27 +0100 Subject: [PATCH 193/430] Support previously and currently documented encodings for boolean lists --- lib/rs/src/protocol/compact.rs | 46 +++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/lib/rs/src/protocol/compact.rs b/lib/rs/src/protocol/compact.rs index 8ed4e0635e4..4dc45cac2fd 100644 --- a/lib/rs/src/protocol/compact.rs +++ b/lib/rs/src/protocol/compact.rs @@ -210,6 +210,10 @@ where None => { let b = self.read_byte()?; match b { + // Previous versions of the thrift compact protocol specification said to use 0 + // and 1 inside collections, but that differed from existing implementations. + // The specification was updated in https://github.com/apache/thrift/commit/2c29c5665bc442e703480bb0ee60fe925ffe02e8. + 0x00 => Ok(false), 0x01 => Ok(true), 0x02 => Ok(false), unkn => Err(crate::Error::Protocol(crate::ProtocolError { @@ -652,7 +656,11 @@ fn type_to_u8(field_type: TType) -> u8 { fn collection_u8_to_type(b: u8) -> crate::Result { match b { - 0x01 => Ok(TType::Bool), + // For historical and compatibility reasons, a reader should be capable to deal with both cases. + // The only valid value in the original spec was 2, but due to a widespread implementation bug + // the defacto standard across large parts of the library became 1 instead. + // As a result, both values are now allowed. + 0x01 | 0x02 => Ok(TType::Bool), o => u8_to_type(o), } } @@ -2839,4 +2847,40 @@ mod tests { assert!(write_fn(&mut o_prot).is_ok()); assert_eq!(o_prot.transport.write_bytes().len(), 0); } + + #[test] + fn must_read_boolean_list() { + let (mut i_prot, _) = test_objects(); + + let source_bytes: [u8; 3] = [0x21, 2, 1]; + + i_prot.transport.set_readable_bytes(&source_bytes); + + let (ttype, element_count) = assert_success!(i_prot.read_list_set_begin()); + + assert_eq!(ttype, TType::Bool); + assert_eq!(element_count, 2); + assert_eq!(i_prot.read_bool().unwrap(), false); + assert_eq!(i_prot.read_bool().unwrap(), true); + + assert_success!(i_prot.read_list_end()); + } + + #[test] + fn must_read_boolean_list_alternative_encoding() { + let (mut i_prot, _) = test_objects(); + + let source_bytes: [u8; 3] = [0x22, 0, 1]; + + i_prot.transport.set_readable_bytes(&source_bytes); + + let (ttype, element_count) = assert_success!(i_prot.read_list_set_begin()); + + assert_eq!(ttype, TType::Bool); + assert_eq!(element_count, 2); + assert_eq!(i_prot.read_bool().unwrap(), false); + assert_eq!(i_prot.read_bool().unwrap(), true); + + assert_success!(i_prot.read_list_end()); + } } From c854f648dfbe64f08f9e4d97f9ace64dbcf394f3 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 5 Feb 2025 01:22:51 +0100 Subject: [PATCH 194/430] THRIFT-5850 Switch IThriftConfiguration interface from Cardinal to Integer Client: Delphi Petch: Jens Geyer --- lib/delphi/src/Thrift.Configuration.pas | 77 +++++++++++++++---------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/lib/delphi/src/Thrift.Configuration.pas b/lib/delphi/src/Thrift.Configuration.pas index 0cb11af350e..562dba16fef 100644 --- a/lib/delphi/src/Thrift.Configuration.pas +++ b/lib/delphi/src/Thrift.Configuration.pas @@ -33,33 +33,36 @@ interface type IThriftConfiguration = interface - ['{ADD75449-1A67-4B78-9B75-502A1E338CFC}'] - function GetRecursionLimit : Cardinal; - procedure SetRecursionLimit( const value : Cardinal); - function GetMaxFrameSize : Cardinal; - procedure SetMaxFrameSize( const value : Cardinal); - function GetMaxMessageSize : Cardinal; - procedure SetMaxMessageSize( const value : Cardinal); - - property RecursionLimit : Cardinal read GetRecursionLimit write SetRecursionLimit; - property MaxFrameSize : Cardinal read GetMaxFrameSize write SetMaxFrameSize; - property MaxMessageSize : Cardinal read GetMaxMessageSize write SetMaxMessageSize; + ['{666F7848-744A-4746-BDD5-43DC9B1D5520}'] + function GetRecursionLimit : Integer; + procedure SetRecursionLimit( const value : Integer); + function GetMaxFrameSize : Integer; + procedure SetMaxFrameSize( const value : Integer); + function GetMaxMessageSize : Integer; + procedure SetMaxMessageSize( const value : Integer); + + property RecursionLimit : Integer read GetRecursionLimit write SetRecursionLimit; + property MaxFrameSize : Integer read GetMaxFrameSize write SetMaxFrameSize; + property MaxMessageSize : Integer read GetMaxMessageSize write SetMaxMessageSize; end; TThriftConfigurationImpl = class( TInterfacedObject, IThriftConfiguration) + strict private + class procedure ValidateLimitArgument( const value : Integer); inline; + strict protected FRecursionLimit : Cardinal; FMaxFrameSize : Cardinal; FMaxMessageSize : Cardinal; // IThriftConfiguration - function GetRecursionLimit : Cardinal; - procedure SetRecursionLimit( const value : Cardinal); - function GetMaxFrameSize : Cardinal; - procedure SetMaxFrameSize( const value : Cardinal); - function GetMaxMessageSize : Cardinal; - procedure SetMaxMessageSize( const value : Cardinal); + function GetRecursionLimit : Integer; + procedure SetRecursionLimit( const value : Integer); + function GetMaxFrameSize : Integer; + procedure SetMaxFrameSize( const value : Integer); + function GetMaxMessageSize : Integer; + procedure SetMaxMessageSize( const value : Integer); public constructor Create; @@ -82,39 +85,55 @@ constructor TThriftConfigurationImpl.Create; end; -function TThriftConfigurationImpl.GetRecursionLimit: Cardinal; +class procedure TThriftConfigurationImpl.ValidateLimitArgument( const value : Integer); +begin + if value <= 0 // zero makes not much sense either + then raise EArgumentOutOfRangeException.Create('Value must be positive'); +end; + + +function TThriftConfigurationImpl.GetRecursionLimit: Integer; begin - result := FRecursionLimit; + result := FRecursionLimit and MAXINT; + ASSERT( result > 0); end; -procedure TThriftConfigurationImpl.SetRecursionLimit(const value: Cardinal); +procedure TThriftConfigurationImpl.SetRecursionLimit(const value: Integer); begin - FRecursionLimit := value; + ValidateLimitArgument( value); + ASSERT( value > 0); + FRecursionLimit := value and MAXINT; end; -function TThriftConfigurationImpl.GetMaxFrameSize: Cardinal; +function TThriftConfigurationImpl.GetMaxFrameSize: Integer; begin - result := FMaxFrameSize; + result := FMaxFrameSize and MAXINT; + ASSERT( result > 0); end; -procedure TThriftConfigurationImpl.SetMaxFrameSize(const value: Cardinal); +procedure TThriftConfigurationImpl.SetMaxFrameSize(const value: Integer); begin - FMaxFrameSize := value; + ValidateLimitArgument( value); + ASSERT( value > 0); + FMaxFrameSize := value and MAXINT; end; -function TThriftConfigurationImpl.GetMaxMessageSize: Cardinal; +function TThriftConfigurationImpl.GetMaxMessageSize: Integer; begin - result := FMaxMessageSize; + result := FMaxMessageSize and MAXINT; + ASSERT( result > 0); end; -procedure TThriftConfigurationImpl.SetMaxMessageSize(const value: Cardinal); +procedure TThriftConfigurationImpl.SetMaxMessageSize(const value: Integer); begin - FMaxMessageSize := value; + ValidateLimitArgument( value); + ASSERT( value > 0); + FMaxMessageSize := value and MAXINT; end; From 5a781c2e71c2d5da052fac6cd6386267ab68694e Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 4 Feb 2025 23:35:55 +0100 Subject: [PATCH 195/430] THRIFT-5851 Promote known total stream sizes for seekable stream transports properly Client: Delphi Patch: Jens Geyer --- lib/delphi/src/Thrift.Protocol.pas | 2 +- lib/delphi/src/Thrift.Stream.pas | 26 +++- lib/delphi/src/Thrift.Transport.MsxmlHTTP.pas | 2 +- lib/delphi/src/Thrift.Transport.Pipes.pas | 24 ++-- lib/delphi/src/Thrift.Transport.WinHTTP.pas | 2 +- lib/delphi/src/Thrift.Transport.pas | 118 ++++++++++++------ 6 files changed, 120 insertions(+), 54 deletions(-) diff --git a/lib/delphi/src/Thrift.Protocol.pas b/lib/delphi/src/Thrift.Protocol.pas index c09728311a8..969fbcd0788 100644 --- a/lib/delphi/src/Thrift.Protocol.pas +++ b/lib/delphi/src/Thrift.Protocol.pas @@ -680,7 +680,7 @@ function TProtocolImpl.Configuration : IThriftConfiguration; procedure TProtocolImpl.Reset; begin - FTrans.ResetConsumedMessageSize; + FTrans.ResetMessageSizeAndConsumedBytes; end; function TProtocolImpl.ReadString: string; diff --git a/lib/delphi/src/Thrift.Stream.pas b/lib/delphi/src/Thrift.Stream.pas index 6c1320d998e..56823312656 100644 --- a/lib/delphi/src/Thrift.Stream.pas +++ b/lib/delphi/src/Thrift.Stream.pas @@ -37,7 +37,7 @@ interface type IThriftStream = interface - ['{3A61A8A6-3639-4B91-A260-EFCA23944F3A}'] + ['{67801A9F-3B85-41CF-9025-D18AC6849B58}'] procedure Write( const buffer: TBytes; offset: Integer; count: Integer); overload; procedure Write( const pBuf : Pointer; offset: Integer; count: Integer); overload; function Read( var buffer: TBytes; offset: Integer; count: Integer): Integer; overload; @@ -47,6 +47,7 @@ interface procedure Flush; function IsOpen: Boolean; function ToArray: TBytes; + function CanSeek : Boolean; function Size : Int64; function Position : Int64; end; @@ -66,6 +67,7 @@ TThriftStreamImpl = class abstract( TInterfacedObject, IThriftStream) procedure Flush; virtual; abstract; function IsOpen: Boolean; virtual; abstract; function ToArray: TBytes; virtual; abstract; + function CanSeek : Boolean; virtual; function Size : Int64; virtual; function Position : Int64; virtual; end; @@ -83,6 +85,7 @@ TThriftStreamAdapterDelphi = class( TThriftStreamImpl) procedure Flush; override; function IsOpen: Boolean; override; function ToArray: TBytes; override; + function CanSeek : Boolean; override; function Size : Int64; override; function Position : Int64; override; public @@ -102,6 +105,7 @@ TThriftStreamAdapterCOM = class( TThriftStreamImpl) procedure Flush; override; function IsOpen: Boolean; override; function ToArray: TBytes; override; + function CanSeek : Boolean; override; function Size : Int64; override; function Position : Int64; override; public @@ -176,6 +180,12 @@ procedure TThriftStreamAdapterCOM.Flush; end; end; +function TThriftStreamAdapterCOM.CanSeek : Boolean; +var statstg: TStatStg; +begin + result := IsOpen and Succeeded( FStream.Stat( statstg, STATFLAG_NONAME)); +end; + function TThriftStreamAdapterCOM.Size : Int64; var statstg: TStatStg; begin @@ -290,6 +300,11 @@ procedure TThriftStreamImpl.Write( const pBuf : Pointer; offset: Integer; count: CheckSizeAndOffset( pBuf, offset+count, offset, count); end; +function TThriftStreamImpl.CanSeek : Boolean; +begin + result := FALSE; // TRUE indicates Size and Position are implemented +end; + function TThriftStreamImpl.Size : Int64; begin ASSERT(FALSE); @@ -332,6 +347,15 @@ procedure TThriftStreamAdapterDelphi.Flush; // nothing to do end; +function TThriftStreamAdapterDelphi.CanSeek : Boolean; +begin + try + result := IsOpen and (FStream.Size >= 0); // throws if not implemented + except + result := FALSE; // seek not implemented + end; +end; + function TThriftStreamAdapterDelphi.Size : Int64; begin result := FStream.Size; diff --git a/lib/delphi/src/Thrift.Transport.MsxmlHTTP.pas b/lib/delphi/src/Thrift.Transport.MsxmlHTTP.pas index b0c7acd22cf..2cc3bfeaf9d 100644 --- a/lib/delphi/src/Thrift.Transport.MsxmlHTTP.pas +++ b/lib/delphi/src/Thrift.Transport.MsxmlHTTP.pas @@ -256,7 +256,7 @@ procedure TMsxmlHTTPClientImpl.SendRequest; xmlhttp.send( IUnknown( TStreamAdapter.Create( ms, soReference ))); FInputStream := nil; FInputStream := TThriftStreamAdapterCOM.Create( IUnknown( xmlhttp.responseStream) as IStream); - ResetConsumedMessageSize; + ResetMessageSizeAndConsumedBytes; UpdateKnownMessageSize( FInputStream.Size); finally ms.Free; diff --git a/lib/delphi/src/Thrift.Transport.Pipes.pas b/lib/delphi/src/Thrift.Transport.Pipes.pas index 10f4dec23e6..d3980d79811 100644 --- a/lib/delphi/src/Thrift.Transport.Pipes.pas +++ b/lib/delphi/src/Thrift.Transport.Pipes.pas @@ -679,22 +679,22 @@ procedure THandlePipeStreamImpl.Open; function TPipeTransportBase.GetIsOpen: Boolean; begin - result := (FInputStream <> nil) and (FInputStream.IsOpen) - and (FOutputStream <> nil) and (FOutputStream.IsOpen); + result := (InputStream <> nil) and (InputStream.IsOpen) + and (OutputStream <> nil) and (OutputStream.IsOpen); end; procedure TPipeTransportBase.Open; begin - FInputStream.Open; - FOutputStream.Open; + InputStream.Open; + OutputStream.Open; end; procedure TPipeTransportBase.Close; begin - FInputStream.Close; - FOutputStream.Close; + InputStream.Close; + OutputStream.Close; end; @@ -709,8 +709,8 @@ constructor TNamedPipeTransportClientEndImpl.Create( const aPipeName : string; // Named pipe constructor begin inherited Create( nil, nil, aConfig); - FInputStream := TNamedPipeStreamImpl.Create( aPipeName, TRUE, aShareMode, aSecurityAttributes, aTimeOut, aOpenTimeOut); - FOutputStream := FInputStream; // true for named pipes + SetInputStream( TNamedPipeStreamImpl.Create( aPipeName, TRUE, aShareMode, aSecurityAttributes, aTimeOut, aOpenTimeOut)); + SetOutputStream( InputStream); // true for named pipes end; @@ -721,8 +721,8 @@ constructor TNamedPipeTransportClientEndImpl.Create( const aPipe : THandle; // Named pipe constructor begin inherited Create( nil, nil, aConfig); - FInputStream := THandlePipeStreamImpl.Create( aPipe, aOwnsHandle, TRUE, aTimeOut); - FOutputStream := FInputStream; // true for named pipes + SetInputStream( THandlePipeStreamImpl.Create( aPipe, aOwnsHandle, TRUE, aTimeOut)); + SetOutputStream( InputStream); // true for named pipes end; @@ -761,8 +761,8 @@ constructor TAnonymousPipeTransportImpl.Create( const aPipeRead, aPipeWrite : TH begin inherited Create( nil, nil, aConfig); // overlapped is not supported with AnonPipes, see MSDN - FInputStream := THandlePipeStreamImpl.Create( aPipeRead, aOwnsHandles, FALSE, aTimeout); - FOutputStream := THandlePipeStreamImpl.Create( aPipeWrite, aOwnsHandles, FALSE, aTimeout); + SetInputStream( THandlePipeStreamImpl.Create( aPipeRead, aOwnsHandles, FALSE, aTimeout)); + SetOutputStream( THandlePipeStreamImpl.Create( aPipeWrite, aOwnsHandles, FALSE, aTimeout)); end; diff --git a/lib/delphi/src/Thrift.Transport.WinHTTP.pas b/lib/delphi/src/Thrift.Transport.WinHTTP.pas index 87a230996a2..9deda4acd5b 100644 --- a/lib/delphi/src/Thrift.Transport.WinHTTP.pas +++ b/lib/delphi/src/Thrift.Transport.WinHTTP.pas @@ -334,7 +334,7 @@ procedure TWinHTTPClientImpl.SendRequest; end; // we're about to receive a new message, so reset everyting - ResetConsumedMessageSize(-1); + ResetMessageSizeAndConsumedBytes(-1); FInputStream := THTTPResponseStream.Create( http); if http.QueryTotalResponseSize( dwSize) // FALSE indicates "no info available" then UpdateKnownMessageSize( dwSize); diff --git a/lib/delphi/src/Thrift.Transport.pas b/lib/delphi/src/Thrift.Transport.pas index fd088375d42..4ca38315d50 100644 --- a/lib/delphi/src/Thrift.Transport.pas +++ b/lib/delphi/src/Thrift.Transport.pas @@ -68,7 +68,7 @@ interface function Configuration : IThriftConfiguration; function MaxMessageSize : Integer; - procedure ResetConsumedMessageSize( const knownSize : Int64 = -1); + procedure ResetMessageSizeAndConsumedBytes( const knownSize : Int64 = -1); procedure CheckReadBytesAvailable( const numBytes : Int64); procedure UpdateKnownMessageSize( const size : Int64); end; @@ -106,10 +106,10 @@ TEndpointTransportBase = class abstract( TTransportBase, ITransport) function MaxMessageSize : Integer; property RemainingMessageSize : Int64 read FRemainingMessageSize; property KnownMessageSize : Int64 read FKnownMessageSize; - procedure ResetConsumedMessageSize( const newSize : Int64 = -1); + procedure ResetMessageSizeAndConsumedBytes( const newSize : Int64 = -1); procedure UpdateKnownMessageSize(const size : Int64); override; - procedure CheckReadBytesAvailable(const numBytes : Int64); inline; - procedure CountConsumedMessageBytes(const numBytes : Int64); inline; + procedure CheckReadBytesAvailable(const numBytes : Int64); {$IFNDEF Debug} inline; {$ENDIF} + procedure CountConsumedMessageBytes(const numBytes : Int64); {$IFNDEF Debug} inline; {$ENDIF} public constructor Create( const aConfig : IThriftConfiguration); reintroduce; end; @@ -124,7 +124,7 @@ TLayeredTransportBase = class abstract( TTransportBase, ITrans function Configuration : IThriftConfiguration; override; procedure UpdateKnownMessageSize( const size : Int64); override; function MaxMessageSize : Integer; inline; - procedure ResetConsumedMessageSize( const knownSize : Int64 = -1); inline; + procedure ResetMessageSizeAndConsumedBytes( const knownSize : Int64 = -1); inline; procedure CheckReadBytesAvailable( const numBytes : Int64); virtual; public constructor Create( const aTransport: T); reintroduce; @@ -303,14 +303,18 @@ TTcpSocketStreamImpl = class( TThriftStreamImpl) end; TStreamTransportImpl = class( TEndpointTransportBase, IStreamTransport) - strict protected - FInputStream : IThriftStream; - FOutputStream : IThriftStream; + strict private + FInternalInputStream : IThriftStream; + FInternalOutputStream : IThriftStream; + strict protected function GetIsOpen: Boolean; override; - function GetInputStream: IThriftStream; - function GetOutputStream: IThriftStream; + function GetInputStream: IThriftStream; inline; + procedure SetInputStream( const stream : IThriftStream); + + function GetOutputStream: IThriftStream; inline; + procedure SetOutputStream( const stream : IThriftStream); strict protected procedure Open; override; @@ -318,6 +322,8 @@ TStreamTransportImpl = class( TEndpointTransportBase, IStreamTransport) procedure Flush; override; function Read( const pBuf : Pointer; const buflen : Integer; off: Integer; len: Integer): Integer; override; procedure Write( const pBuf : Pointer; off, len : Integer); override; + + procedure UpdateKnownMessageSize(const size : Int64); override; public constructor Create( const aInputStream, aOutputStream : IThriftStream; const aConfig : IThriftConfiguration = nil); reintroduce; destructor Destroy; override; @@ -340,6 +346,7 @@ TBufferedStreamImpl = class( TThriftStreamImpl) procedure Flush; override; function IsOpen: Boolean; override; function ToArray: TBytes; override; + function CanSeek : Boolean; override; function Size : Int64; override; function Position : Int64; override; public @@ -545,7 +552,7 @@ constructor TEndpointTransportBase.Create( const aConfig : IThriftConfiguration) then FConfiguration := aConfig else FConfiguration := TThriftConfigurationImpl.Create; - ResetConsumedMessageSize; + ResetMessageSizeAndConsumedBytes; end; @@ -562,7 +569,7 @@ function TEndpointTransportBase.MaxMessageSize : Integer; end; -procedure TEndpointTransportBase.ResetConsumedMessageSize( const newSize : Int64); +procedure TEndpointTransportBase.ResetMessageSizeAndConsumedBytes( const newSize : Int64); // Resets RemainingMessageSize to the configured maximum begin // full reset @@ -583,12 +590,12 @@ procedure TEndpointTransportBase.ResetConsumedMessageSize( const newSize : Int64 procedure TEndpointTransportBase.UpdateKnownMessageSize( const size : Int64); -// Updates RemainingMessageSize to reflect then known real message size (e.g. framed transport). +// Updates RemainingMessageSize to reflect the known real message size (e.g. framed transport). // Will throw if we already consumed too many bytes. var consumed : Int64; begin consumed := KnownMessageSize - RemainingMessageSize; - ResetConsumedMessageSize(size); + ResetMessageSizeAndConsumedBytes(size); CountConsumedMessageBytes(consumed); end; @@ -642,9 +649,9 @@ function TLayeredTransportBase.MaxMessageSize : Integer; end; -procedure TLayeredTransportBase.ResetConsumedMessageSize( const knownSize : Int64 = -1); +procedure TLayeredTransportBase.ResetMessageSizeAndConsumedBytes( const knownSize : Int64 = -1); begin - InnerTransport.ResetConsumedMessageSize( knownSize); + InnerTransport.ResetMessageSizeAndConsumedBytes( knownSize); end; @@ -964,8 +971,8 @@ procedure TSocketImpl.Close; begin inherited Close; - FInputStream := nil; - FOutputStream := nil; + SetInputStream( nil); + SetOutputStream( nil); if FOwnsClient then FreeAndNil( FClient) @@ -997,8 +1004,8 @@ procedure TSocketImpl.InitSocket; FOwnsClient := True; stream := TTcpSocketStreamImpl.Create( FClient, FTimeout); - FInputStream := stream; - FOutputStream := stream; + SetInputStream( stream); + SetOutputStream( stream); end; procedure TSocketImpl.Open; @@ -1026,8 +1033,8 @@ procedure TSocketImpl.Open; FClient.Open; {$ENDIF} - FInputStream := TTcpSocketStreamImpl.Create( FClient, FTimeout); - FOutputStream := FInputStream; + SetInputStream( TTcpSocketStreamImpl.Create( FClient, FTimeout)); + SetOutputStream( InputStream); // same end; { TBufferedStream } @@ -1156,6 +1163,12 @@ procedure TBufferedStreamImpl.Write( const pBuf : Pointer; offset: Integer; coun end; +function TBufferedStreamImpl.CanSeek : Boolean; +begin + result := TRUE; +end; + + function TBufferedStreamImpl.Size : Int64; begin result := FReadBuffer.Size; @@ -1173,45 +1186,57 @@ function TBufferedStreamImpl.Position : Int64; constructor TStreamTransportImpl.Create( const aInputStream, aOutputStream : IThriftStream; const aConfig : IThriftConfiguration); begin inherited Create( aConfig); - FInputStream := aInputStream; - FOutputStream := aOutputStream; + SetInputStream( aInputStream); + SetOutputStream( aOutputStream); end; destructor TStreamTransportImpl.Destroy; begin - FInputStream := nil; - FOutputStream := nil; + SetInputStream( nil); + SetInputStream( nil); inherited; end; procedure TStreamTransportImpl.Close; begin - FInputStream := nil; - FOutputStream := nil; + SetInputStream( nil); + SetInputStream( nil); end; procedure TStreamTransportImpl.Flush; begin - if FOutputStream = nil then begin + if OutputStream = nil then begin raise TTransportExceptionNotOpen.Create('Cannot flush null outputstream' ); end; - FOutputStream.Flush; + OutputStream.Flush; end; function TStreamTransportImpl.GetInputStream: IThriftStream; begin - Result := FInputStream; + Result := FInternalInputStream; end; -function TStreamTransportImpl.GetIsOpen: Boolean; +procedure TStreamTransportImpl.SetInputStream( const stream : IThriftStream); begin - Result := True; + FInternalInputStream := stream; + ResetMessageSizeAndConsumedBytes(-1); // full reset to configured maximum + UpdateKnownMessageSize( -1); // adjust to real stream size end; function TStreamTransportImpl.GetOutputStream: IThriftStream; begin - Result := FOutputStream; + Result := FInternalOutputStream; +end; + +procedure TStreamTransportImpl.SetOutputStream( const stream : IThriftStream); +begin + FInternalOutputStream := stream; +end; + +function TStreamTransportImpl.GetIsOpen: Boolean; +begin + Result := True; end; procedure TStreamTransportImpl.Open; @@ -1221,19 +1246,36 @@ procedure TStreamTransportImpl.Open; function TStreamTransportImpl.Read( const pBuf : Pointer; const buflen : Integer; off: Integer; len: Integer): Integer; begin - if FInputStream = nil + if InputStream = nil then raise TTransportExceptionNotOpen.Create('Cannot read from null inputstream' ); - Result := FInputStream.Read( pBuf,buflen, off, len ); + Result := InputStream.Read( pBuf,buflen, off, len ); CountConsumedMessageBytes( result); end; procedure TStreamTransportImpl.Write( const pBuf : Pointer; off, len : Integer); begin - if FOutputStream = nil + if OutputStream = nil then raise TTransportExceptionNotOpen.Create('Cannot write to null outputstream' ); - FOutputStream.Write( pBuf, off, len ); + OutputStream.Write( pBuf, off, len ); +end; + + +procedure TStreamTransportImpl.UpdateKnownMessageSize(const size : Int64); +var adjusted : Int64; +begin + if InputStream = nil + then adjusted := 0 + else begin + adjusted := MaxMessageSize; + if size > 0 + then adjusted := Math.Min( adjusted, size); + if InputStream.CanSeek + then adjusted := Math.Min( adjusted, InputStream.Size); + end; + + inherited UpdateKnownMessageSize( adjusted); end; { TBufferedTransportImpl } From 960bf519dd7081f3c30fa806301c4142a578798e Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 5 Feb 2025 23:47:54 +0100 Subject: [PATCH 196/430] THRIFT-5852 Promote known total stream sizes for seekable stream transports Client: netstd Patch: Jens Geyer --- lib/netstd/Thrift/Protocol/TBinaryProtocol.cs | 2 +- .../Thrift/Protocol/TCompactProtocol.cs | 2 +- lib/netstd/Thrift/Protocol/TJSONProtocol.cs | 2 +- .../Thrift/Protocol/TProtocolDecorator.cs | 2 +- .../Thrift/Transport/Client/THttpTransport.cs | 2 +- .../Client/TMemoryBufferTransport.cs | 4 ++-- .../Transport/Client/TNamedPipeTransport.cs | 4 ++-- .../Transport/Client/TStreamTransport.cs | 23 +++++++++++++++++-- .../Transport/Layered/TBufferedTransport.cs | 6 ++--- .../Transport/Layered/TFramedTransport.cs | 6 ++--- .../Transport/Layered/TLayeredTransport.cs | 4 ++-- .../Server/TNamedPipeServerTransport.cs | 2 +- .../Thrift/Transport/TEndpointTransport.cs | 8 +++---- lib/netstd/Thrift/Transport/TTransport.cs | 2 +- 14 files changed, 44 insertions(+), 25 deletions(-) diff --git a/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs b/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs index 186d220cbf7..44fa9f7d995 100644 --- a/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs +++ b/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs @@ -255,7 +255,7 @@ public override async ValueTask ReadMessageBeginAsync(CancellationToke public override Task ReadMessageEndAsync(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - Transport.ResetConsumedMessageSize(); + Transport.ResetMessageSizeAndConsumedBytes(); return Task.CompletedTask; } diff --git a/lib/netstd/Thrift/Protocol/TCompactProtocol.cs b/lib/netstd/Thrift/Protocol/TCompactProtocol.cs index 8e5d00d14f6..1fd7e50ce54 100644 --- a/lib/netstd/Thrift/Protocol/TCompactProtocol.cs +++ b/lib/netstd/Thrift/Protocol/TCompactProtocol.cs @@ -461,7 +461,7 @@ public override async ValueTask ReadMessageBeginAsync(CancellationToke public override Task ReadMessageEndAsync(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - Transport.ResetConsumedMessageSize(); + Transport.ResetMessageSizeAndConsumedBytes(); return Task.CompletedTask; } diff --git a/lib/netstd/Thrift/Protocol/TJSONProtocol.cs b/lib/netstd/Thrift/Protocol/TJSONProtocol.cs index 02cf3ed4e7f..ae37a807525 100644 --- a/lib/netstd/Thrift/Protocol/TJSONProtocol.cs +++ b/lib/netstd/Thrift/Protocol/TJSONProtocol.cs @@ -700,7 +700,7 @@ public override async Task ReadMessageEndAsync(CancellationToken cancellationTok { cancellationToken.ThrowIfCancellationRequested(); await ReadJsonArrayEndAsync(cancellationToken); - Transport.ResetConsumedMessageSize(); + Transport.ResetMessageSizeAndConsumedBytes(); } public override async ValueTask ReadStructBeginAsync(CancellationToken cancellationToken) diff --git a/lib/netstd/Thrift/Protocol/TProtocolDecorator.cs b/lib/netstd/Thrift/Protocol/TProtocolDecorator.cs index c75cc6319ac..8e7fb94b91f 100644 --- a/lib/netstd/Thrift/Protocol/TProtocolDecorator.cs +++ b/lib/netstd/Thrift/Protocol/TProtocolDecorator.cs @@ -158,7 +158,7 @@ public override async Task ReadMessageEndAsync(CancellationToken cancellationTok { cancellationToken.ThrowIfCancellationRequested(); await _wrappedProtocol.ReadMessageEndAsync(cancellationToken); - Transport.ResetConsumedMessageSize(); + Transport.ResetMessageSizeAndConsumedBytes(); } public override async ValueTask ReadStructBeginAsync(CancellationToken cancellationToken) diff --git a/lib/netstd/Thrift/Transport/Client/THttpTransport.cs b/lib/netstd/Thrift/Transport/Client/THttpTransport.cs index 16e228ba3d3..4467681ae1f 100644 --- a/lib/netstd/Thrift/Transport/Client/THttpTransport.cs +++ b/lib/netstd/Thrift/Transport/Client/THttpTransport.cs @@ -278,7 +278,7 @@ public override async Task FlushAsync(CancellationToken cancellationToken) finally { _outputStream = new MemoryStream(); - ResetConsumedMessageSize(); + ResetMessageSizeAndConsumedBytes(); } } diff --git a/lib/netstd/Thrift/Transport/Client/TMemoryBufferTransport.cs b/lib/netstd/Thrift/Transport/Client/TMemoryBufferTransport.cs index 5773d30cb57..47013782c1f 100644 --- a/lib/netstd/Thrift/Transport/Client/TMemoryBufferTransport.cs +++ b/lib/netstd/Thrift/Transport/Client/TMemoryBufferTransport.cs @@ -115,7 +115,7 @@ public void Seek(int delta, SeekOrigin origin) throw new ArgumentException("Cannot seek outside of the valid range",nameof(origin)); Position = newPos; - ResetConsumedMessageSize(); + ResetMessageSizeAndConsumedBytes(); CountConsumedMessageBytes(Position); } @@ -145,7 +145,7 @@ public override Task WriteAsync(byte[] buffer, int offset, int count, Cancellati public override Task FlushAsync(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - ResetConsumedMessageSize(); + ResetMessageSizeAndConsumedBytes(); return Task.CompletedTask; } diff --git a/lib/netstd/Thrift/Transport/Client/TNamedPipeTransport.cs b/lib/netstd/Thrift/Transport/Client/TNamedPipeTransport.cs index 8e60f9f5e60..3ed1b6cda88 100644 --- a/lib/netstd/Thrift/Transport/Client/TNamedPipeTransport.cs +++ b/lib/netstd/Thrift/Transport/Client/TNamedPipeTransport.cs @@ -54,7 +54,7 @@ public override async Task OpenAsync(CancellationToken cancellationToken) } await PipeStream.ConnectAsync( ConnectTimeout, cancellationToken); - ResetConsumedMessageSize(); + ResetMessageSizeAndConsumedBytes(); } public override void Close() @@ -112,7 +112,7 @@ public override async Task WriteAsync(byte[] buffer, int offset, int length, Can public override async Task FlushAsync(CancellationToken cancellationToken) { await PipeStream.FlushAsync(cancellationToken); - ResetConsumedMessageSize(); + ResetMessageSizeAndConsumedBytes(); } diff --git a/lib/netstd/Thrift/Transport/Client/TStreamTransport.cs b/lib/netstd/Thrift/Transport/Client/TStreamTransport.cs index 7237b8dd27d..a1950014a67 100644 --- a/lib/netstd/Thrift/Transport/Client/TStreamTransport.cs +++ b/lib/netstd/Thrift/Transport/Client/TStreamTransport.cs @@ -16,6 +16,7 @@ // under the License. using System; +using System.Drawing; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -46,10 +47,28 @@ protected Stream InputStream { get => _InputStream; set { _InputStream = value; - ResetConsumedMessageSize(); + ResetMessageSizeAndConsumedBytes(-1); // full reset to configured maximum + UpdateKnownMessageSize(-1); // adjust to real stream size } } + public override void UpdateKnownMessageSize(long size) + { + long adjusted = 0; + + if (InputStream != null) + { + adjusted = MaxMessageSize; + if (size > 0) + adjusted = Math.Min(adjusted, size); + if( InputStream.CanSeek) + adjusted = Math.Min(adjusted, InputStream.Length); + } + + base.UpdateKnownMessageSize(adjusted); + } + + public override bool IsOpen => true; public override Task OpenAsync(CancellationToken cancellationToken) @@ -106,7 +125,7 @@ public override async Task WriteAsync(byte[] buffer, int offset, int length, Can public override async Task FlushAsync(CancellationToken cancellationToken) { await OutputStream.FlushAsync(cancellationToken); - ResetConsumedMessageSize(); + ResetMessageSizeAndConsumedBytes(); } diff --git a/lib/netstd/Thrift/Transport/Layered/TBufferedTransport.cs b/lib/netstd/Thrift/Transport/Layered/TBufferedTransport.cs index 7474b7f9359..977dcbfd119 100644 --- a/lib/netstd/Thrift/Transport/Layered/TBufferedTransport.cs +++ b/lib/netstd/Thrift/Transport/Layered/TBufferedTransport.cs @@ -179,10 +179,10 @@ public override void CheckReadBytesAvailable(long numBytes) } } - public override void ResetConsumedMessageSize(long newSize = -1) + public override void ResetMessageSizeAndConsumedBytes(long newSize = -1) { - base.ResetConsumedMessageSize(newSize); - ReadBuffer.ResetConsumedMessageSize(newSize); + base.ResetMessageSizeAndConsumedBytes(newSize); + ReadBuffer.ResetMessageSizeAndConsumedBytes(newSize); } private void CheckNotDisposed() diff --git a/lib/netstd/Thrift/Transport/Layered/TFramedTransport.cs b/lib/netstd/Thrift/Transport/Layered/TFramedTransport.cs index 5e67f10cda6..faa3fa6e90f 100644 --- a/lib/netstd/Thrift/Transport/Layered/TFramedTransport.cs +++ b/lib/netstd/Thrift/Transport/Layered/TFramedTransport.cs @@ -191,10 +191,10 @@ protected override void Dispose(bool disposing) IsDisposed = true; } - public override void ResetConsumedMessageSize(long newSize = -1) + public override void ResetMessageSizeAndConsumedBytes(long newSize = -1) { - base.ResetConsumedMessageSize(newSize); - ReadBuffer.ResetConsumedMessageSize(newSize); + base.ResetMessageSizeAndConsumedBytes(newSize); + ReadBuffer.ResetMessageSizeAndConsumedBytes(newSize); } } } diff --git a/lib/netstd/Thrift/Transport/Layered/TLayeredTransport.cs b/lib/netstd/Thrift/Transport/Layered/TLayeredTransport.cs index 3d855a4f5f0..f9a4ce477af 100644 --- a/lib/netstd/Thrift/Transport/Layered/TLayeredTransport.cs +++ b/lib/netstd/Thrift/Transport/Layered/TLayeredTransport.cs @@ -43,9 +43,9 @@ public override void CheckReadBytesAvailable(long numBytes) InnerTransport.CheckReadBytesAvailable(numBytes); } - public override void ResetConsumedMessageSize(long newSize = -1) + public override void ResetMessageSizeAndConsumedBytes(long newSize = -1) { - InnerTransport.ResetConsumedMessageSize(newSize); + InnerTransport.ResetMessageSizeAndConsumedBytes(newSize); } } } diff --git a/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs b/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs index 12fc9d3ef74..1b6a21f53e9 100644 --- a/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs +++ b/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs @@ -424,7 +424,7 @@ public override async Task WriteAsync(byte[] buffer, int offset, int length, Can public override async Task FlushAsync(CancellationToken cancellationToken) { await PipeStream.FlushAsync(cancellationToken); - ResetConsumedMessageSize(); + ResetMessageSizeAndConsumedBytes(); } protected override void Dispose(bool disposing) diff --git a/lib/netstd/Thrift/Transport/TEndpointTransport.cs b/lib/netstd/Thrift/Transport/TEndpointTransport.cs index 6c781010583..27fb48daf96 100644 --- a/lib/netstd/Thrift/Transport/TEndpointTransport.cs +++ b/lib/netstd/Thrift/Transport/TEndpointTransport.cs @@ -37,13 +37,13 @@ public TEndpointTransport( TConfiguration config) _configuration = config ?? new TConfiguration(); Debug.Assert(Configuration != null); - ResetConsumedMessageSize(); + ResetMessageSizeAndConsumedBytes(); } /// /// Resets RemainingMessageSize to the configured maximum /// - public override void ResetConsumedMessageSize(long newSize = -1) + public override void ResetMessageSizeAndConsumedBytes(long newSize = -1) { // full reset if (newSize < 0) @@ -70,7 +70,7 @@ public override void ResetConsumedMessageSize(long newSize = -1) public override void UpdateKnownMessageSize(long size) { var consumed = KnownMessageSize - RemainingMessageSize; - ResetConsumedMessageSize(size); + ResetMessageSizeAndConsumedBytes(size); CountConsumedMessageBytes(consumed); } @@ -80,7 +80,7 @@ public override void UpdateKnownMessageSize(long size) /// public override void CheckReadBytesAvailable(long numBytes) { - if (RemainingMessageSize < numBytes) + if ((RemainingMessageSize < numBytes) || (numBytes < 0)) throw new TTransportException(TTransportException.ExceptionType.EndOfFile, "MaxMessageSize reached"); } diff --git a/lib/netstd/Thrift/Transport/TTransport.cs b/lib/netstd/Thrift/Transport/TTransport.cs index 44202249243..77ef281674e 100644 --- a/lib/netstd/Thrift/Transport/TTransport.cs +++ b/lib/netstd/Thrift/Transport/TTransport.cs @@ -39,7 +39,7 @@ public abstract class TTransport : IDisposable public abstract TConfiguration Configuration { get; } public abstract void UpdateKnownMessageSize(long size); public abstract void CheckReadBytesAvailable(long numBytes); - public abstract void ResetConsumedMessageSize(long newSize = -1); + public abstract void ResetMessageSizeAndConsumedBytes(long newSize = -1); public void Dispose() { Dispose(true); From 4f06d5eec39a78f500d5f1c6e8e5c00c7e361f68 Mon Sep 17 00:00:00 2001 From: africamonkey Date: Wed, 6 Jul 2022 23:55:17 +0800 Subject: [PATCH 197/430] add operator == for TEnumIterator --- lib/cpp/src/thrift/Thrift.h | 6 +++++- lib/cpp/src/thrift/windows/Operators.h | 5 ----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/cpp/src/thrift/Thrift.h b/lib/cpp/src/thrift/Thrift.h index d5066ee7107..55511d6c6b1 100644 --- a/lib/cpp/src/thrift/Thrift.h +++ b/lib/cpp/src/thrift/Thrift.h @@ -58,7 +58,11 @@ class TEnumIterator int operator++() { return ++ii_; } - bool operator!=(const TEnumIterator& end) { + bool operator==(const TEnumIterator& rhs) const { + return ii_ == rhs.ii_ && n_ == rhs.n_; + } + + bool operator!=(const TEnumIterator& end) const { THRIFT_UNUSED_VARIABLE(end); assert(end.n_ == -1); return (ii_ != n_); diff --git a/lib/cpp/src/thrift/windows/Operators.h b/lib/cpp/src/thrift/windows/Operators.h index 9b860968002..406e11eb6ec 100644 --- a/lib/cpp/src/thrift/windows/Operators.h +++ b/lib/cpp/src/thrift/windows/Operators.h @@ -29,11 +29,6 @@ namespace thrift { class TEnumIterator; -inline bool operator==(const TEnumIterator&, const TEnumIterator&) { - // Not entirely sure what the test should be here. It is only to enable - // iterator debugging and is not used in release mode. - return true; -} } } // apache::thrift From a6c8b3b3e28862d183af6aff31afa5a4d238c200 Mon Sep 17 00:00:00 2001 From: africamonkey Date: Wed, 14 Sep 2022 21:43:13 +0800 Subject: [PATCH 198/430] address Jens-G's comment --- lib/cpp/src/thrift/Thrift.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/cpp/src/thrift/Thrift.h b/lib/cpp/src/thrift/Thrift.h index 55511d6c6b1..f3fe708a179 100644 --- a/lib/cpp/src/thrift/Thrift.h +++ b/lib/cpp/src/thrift/Thrift.h @@ -62,10 +62,8 @@ class TEnumIterator return ii_ == rhs.ii_ && n_ == rhs.n_; } - bool operator!=(const TEnumIterator& end) const { - THRIFT_UNUSED_VARIABLE(end); - assert(end.n_ == -1); - return (ii_ != n_); + bool operator!=(const TEnumIterator& rhs) const { + return ii_ != rhs.ii_ || n_ != rhs.n_; } std::pair operator*() const { return std::make_pair(enums_[ii_], names_[ii_]); } From 39de3ada96c756c20fdcfd60e4251f09321f274c Mon Sep 17 00:00:00 2001 From: africamonkey Date: Thu, 15 Sep 2022 00:33:44 +0800 Subject: [PATCH 199/430] fix logic error --- lib/cpp/src/thrift/Thrift.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/cpp/src/thrift/Thrift.h b/lib/cpp/src/thrift/Thrift.h index f3fe708a179..3a1c5cce1a3 100644 --- a/lib/cpp/src/thrift/Thrift.h +++ b/lib/cpp/src/thrift/Thrift.h @@ -59,11 +59,15 @@ class TEnumIterator int operator++() { return ++ii_; } bool operator==(const TEnumIterator& rhs) const { - return ii_ == rhs.ii_ && n_ == rhs.n_; + bool is_end = ii_ == n_ || n_ == -1; + bool is_rhs_end = rhs.ii_ == rhs.n_ || rhs.n_ == -1; + return (ii_ == rhs.ii_ && n_ == rhs.n_) || (is_end && is_rhs_end); } bool operator!=(const TEnumIterator& rhs) const { - return ii_ != rhs.ii_ || n_ != rhs.n_; + bool is_end = ii_ == n_ || n_ == -1; + bool is_rhs_end = rhs.ii_ == rhs.n_ || rhs.n_ == -1; + return (ii_ != rhs.ii_ || n_ != rhs.n_) && (!is_end || !is_rhs_end); } std::pair operator*() const { return std::make_pair(enums_[ii_], names_[ii_]); } From 42204e7214461631b6f322aca0fc366080497aab Mon Sep 17 00:00:00 2001 From: africamonkey Date: Mon, 31 Oct 2022 21:27:38 +0800 Subject: [PATCH 200/430] The != operator just call the == operator --- lib/cpp/src/thrift/Thrift.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/cpp/src/thrift/Thrift.h b/lib/cpp/src/thrift/Thrift.h index 3a1c5cce1a3..338694b7f3f 100644 --- a/lib/cpp/src/thrift/Thrift.h +++ b/lib/cpp/src/thrift/Thrift.h @@ -64,11 +64,7 @@ class TEnumIterator return (ii_ == rhs.ii_ && n_ == rhs.n_) || (is_end && is_rhs_end); } - bool operator!=(const TEnumIterator& rhs) const { - bool is_end = ii_ == n_ || n_ == -1; - bool is_rhs_end = rhs.ii_ == rhs.n_ || rhs.n_ == -1; - return (ii_ != rhs.ii_ || n_ != rhs.n_) && (!is_end || !is_rhs_end); - } + bool operator!=(const TEnumIterator& rhs) const { return !(*this == rhs); } std::pair operator*() const { return std::make_pair(enums_[ii_], names_[ii_]); } From 7fe4bf5a04958b126e056149ce24bdf92b15e94e Mon Sep 17 00:00:00 2001 From: Cameron Martin Date: Tue, 4 Feb 2025 17:46:53 +0000 Subject: [PATCH 201/430] THRIFT-5848: Expose InputBufferUnderrunError in nodejs client When implementing a custom `Connection`, it is very useful to be able to respond to `InputBufferUnderrunError` to roll back the position of the transport. This is now exposed through the root module, so that custom connections can use this. --- lib/nodejs/lib/thrift/browser.js | 2 ++ lib/nodejs/lib/thrift/index.js | 2 ++ lib/nodejs/test/exceptions.js | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/nodejs/lib/thrift/browser.js b/lib/nodejs/lib/thrift/browser.js index e217704d66d..1d225c6a83f 100644 --- a/lib/nodejs/lib/thrift/browser.js +++ b/lib/nodejs/lib/thrift/browser.js @@ -51,3 +51,5 @@ exports.Protocol = require('./json_protocol'); exports.TJSONProtocol = require('./json_protocol'); exports.TBinaryProtocol = require('./binary_protocol'); exports.TCompactProtocol = require('./compact_protocol'); + +exports.InputBufferUnderrunError = require('./input_buffer_underrun_error'); diff --git a/lib/nodejs/lib/thrift/index.js b/lib/nodejs/lib/thrift/index.js index 00f21743d43..df4a5dcfe94 100644 --- a/lib/nodejs/lib/thrift/index.js +++ b/lib/nodejs/lib/thrift/index.js @@ -74,3 +74,5 @@ exports.TJSONProtocol = require('./json_protocol'); exports.TBinaryProtocol = require('./binary_protocol'); exports.TCompactProtocol = require('./compact_protocol'); exports.THeaderProtocol = require('./header_protocol'); + +exports.InputBufferUnderrunError = require('./input_buffer_underrun_error'); diff --git a/lib/nodejs/test/exceptions.js b/lib/nodejs/test/exceptions.js index ab2798a26a1..f30f987963a 100644 --- a/lib/nodejs/test/exceptions.js +++ b/lib/nodejs/test/exceptions.js @@ -20,7 +20,7 @@ "use strict"; const test = require("tape"); const thrift = require("../lib/thrift/thrift.js"); -const InputBufferUnderrunError = require("../lib/thrift/input_buffer_underrun_error"); +const { InputBufferUnderrunError } = require("../lib/thrift"); test("TApplicationException", function t(assert) { const e = new thrift.TApplicationException(1, "foo"); From 0941aec90ddc47bbc9670b52d48262e4c7dc2ba1 Mon Sep 17 00:00:00 2001 From: Cameron Martin Date: Tue, 4 Feb 2025 17:50:14 +0000 Subject: [PATCH 202/430] THRIFT-5849: Expose createClient in browser version of nodejs package `createClient` is exposed in a nodejs context, but not for browsers. Even though this is the same function as `createWsClient`, `createHttpClient`, etc, it seems odd to use these for custom connection types. Moreover, it is beneficial for the browser and nodejs interface to be as similar as possible. --- lib/nodejs/lib/thrift/browser.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/nodejs/lib/thrift/browser.js b/lib/nodejs/lib/thrift/browser.js index 1d225c6a83f..5915cf605c6 100644 --- a/lib/nodejs/lib/thrift/browser.js +++ b/lib/nodejs/lib/thrift/browser.js @@ -33,6 +33,8 @@ exports.OhosConnection = ohosConnection.OhosConnection; exports.createOhosConnection = ohosConnection.createOhosConnection; exports.createOhosClient = ohosConnection.createOhosClient; +exports.createClient = require('./create_client'); + exports.Int64 = require('node-int64'); exports.Q = require('q'); From 5c08893af6491aa2f0a5f5c38287c4e703b9f2fd Mon Sep 17 00:00:00 2001 From: Maximilian Bandle Date: Fri, 7 Feb 2025 10:00:56 +0100 Subject: [PATCH 203/430] THRIFT-5854: Move the checkReadBytesAvailable check before allocation Client: cpp Patch: Maximilian Bandle This closes #3100 --- .../src/thrift/protocol/TCompactProtocol.tcc | 5 +- lib/cpp/test/ThrifttReadCheckTests.cpp | 56 +++++++++++++++++-- 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc b/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc index 9270ab89902..5db93706660 100644 --- a/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc +++ b/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc @@ -701,6 +701,9 @@ uint32_t TCompactProtocolT::readBinary(std::string& str) { throw TProtocolException(TProtocolException::SIZE_LIMIT); } + // Check against MaxMessageSize before alloc + trans_->checkReadBytesAvailable((uint32_t)size); + // Use the heap here to prevent stack overflow for v. large strings if (size > string_buf_size_ || string_buf_ == nullptr) { void* new_string_buf = std::realloc(string_buf_, (uint32_t)size); @@ -713,8 +716,6 @@ uint32_t TCompactProtocolT::readBinary(std::string& str) { trans_->readAll(string_buf_, size); str.assign((char*)string_buf_, size); - trans_->checkReadBytesAvailable(rsize + (uint32_t)size); - return rsize + (uint32_t)size; } diff --git a/lib/cpp/test/ThrifttReadCheckTests.cpp b/lib/cpp/test/ThrifttReadCheckTests.cpp index 7aab09f41d6..09dffe228d3 100644 --- a/lib/cpp/test/ThrifttReadCheckTests.cpp +++ b/lib/cpp/test/ThrifttReadCheckTests.cpp @@ -168,30 +168,78 @@ BOOST_AUTO_TEST_CASE(test_tthriftbinaryprotocol_read_check_exception) { } BOOST_AUTO_TEST_CASE(test_tthriftcompactprotocol_read_check_exception) { - std::shared_ptr config (new TConfiguration(MAX_MESSAGE_SIZE)); + // Set Max Message Size to 11 since all structs are 12B long + std::shared_ptr config (new TConfiguration(11)); std::shared_ptr transport(new TMemoryBuffer(config)); std::shared_ptr protocol(new TCompactProtocol(transport)); uint32_t val = 0; TType elemType = apache::thrift::protocol::T_STOP; TType elemType1 = apache::thrift::protocol::T_STOP; - TList list(T_I32, 8); + + // This list needs 12B + TList list(T_I32, 12); protocol->writeListBegin(list.elemType_, list.size_); protocol->writeListEnd(); BOOST_CHECK_THROW(protocol->readListBegin(elemType, val), TTransportException); protocol->readListEnd(); - TSet set(T_I32, 8); + // This set needs 12B + TSet set(T_I32, 12); protocol->writeSetBegin(set.elemType_, set.size_); protocol->writeSetEnd(); BOOST_CHECK_THROW(protocol->readSetBegin(elemType, val), TTransportException); protocol->readSetEnd(); - TMap map(T_I32, T_I32, 8); + + // This map needs 12B (2x elem) + TMap map(T_I32, T_I32, 6); protocol->writeMapBegin(map.keyType_, map.valueType_, map.size_); protocol->writeMapEnd(); BOOST_CHECK_THROW(protocol->readMapBegin(elemType, elemType1, val), TTransportException); protocol->readMapEnd(); + + // This string needs 12B (1 for size + str) + string eleven = "1234567890A"; + protocol->writeString(eleven); + BOOST_CHECK_THROW(protocol->readString(eleven), TTransportException); +} + +BOOST_AUTO_TEST_CASE(test_tthriftcompactprotocol_read_check_pass) { + // Set Max Message Size to 12 to check the edge case + std::shared_ptr config (new TConfiguration(12)); + std::shared_ptr transport(new TMemoryBuffer(config)); + std::shared_ptr protocol(new TCompactProtocol(transport)); + + uint32_t val = 0; + TType elemType = apache::thrift::protocol::T_STOP; + TType elemType1 = apache::thrift::protocol::T_STOP; + + // This list needs 12B + TList list(T_I32, 12); + protocol->writeListBegin(list.elemType_, list.size_); + protocol->writeListEnd(); + BOOST_CHECK_NO_THROW(protocol->readListBegin(elemType, val)); + protocol->readListEnd(); + + // This set needs 12B + TSet set(T_I32, 12); + protocol->writeSetBegin(set.elemType_, set.size_); + protocol->writeSetEnd(); + BOOST_CHECK_NO_THROW(protocol->readSetBegin(elemType, val)); + protocol->readSetEnd(); + + // This map needs 12B (2x elem) + TMap map(T_I32, T_I32, 6); + protocol->writeMapBegin(map.keyType_, map.valueType_, map.size_); + protocol->writeMapEnd(); + BOOST_CHECK_NO_THROW(protocol->readMapBegin(elemType, elemType1, val)); + protocol->readMapEnd(); + + // This string needs 12B (1 for size + str) + string eleven = "1234567890A"; + protocol->writeString(eleven); + BOOST_CHECK_NO_THROW(protocol->readString(eleven)); } BOOST_AUTO_TEST_CASE(test_tthriftjsonprotocol_read_check_exception) { From b4b4eb74b5aa672a9682d45c8eca3468f0b4d338 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 11 Feb 2025 22:58:04 +0100 Subject: [PATCH 204/430] net9 on Jammy only via NET backports --- build/docker/ubuntu-jammy/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile index b35111c9695..f2001ffd714 100644 --- a/build/docker/ubuntu-jammy/Dockerfile +++ b/build/docker/ubuntu-jammy/Dockerfile @@ -136,6 +136,7 @@ RUN apt-get install -y --no-install-recommends \ dart=$DART_VERSION ENV PATH /usr/lib/dart/bin:$PATH +RUN add-apt-repository ppa:dotnet/backports RUN apt-get install -y --no-install-recommends \ `# dotnet core dependencies` \ dotnet-sdk-9.0 \ From 166991349f9e4fa11aa2b4d1b23f8593a162002a Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 11 Feb 2025 23:00:49 +0100 Subject: [PATCH 205/430] net9 not available on focal (but supported, according to MS?) --- build/docker/ubuntu-focal/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile index 52ea5a4d79b..831d07e95b2 100644 --- a/build/docker/ubuntu-focal/Dockerfile +++ b/build/docker/ubuntu-focal/Dockerfile @@ -139,10 +139,10 @@ ENV PATH /usr/lib/dart/bin:$PATH RUN apt-get install -y --no-install-recommends \ `# dotnet core dependencies` \ - dotnet-sdk-9.0 \ - dotnet-runtime-9.0 \ - aspnetcore-runtime-9.0 \ - dotnet-apphost-pack-9.0 + dotnet-sdk-8.0 \ + dotnet-runtime-8.0 \ + aspnetcore-runtime-8.0 \ + dotnet-apphost-pack-8.0 # Erlang dependencies ARG ERLANG_OTP_VERSION=23.3.4.11 From 8a5538a9a1f0e2329cea564b038796b01bf1f0ec Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 11 Feb 2025 23:16:12 +0100 Subject: [PATCH 206/430] net9 on Noble only via NET backports --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index abc37144e8a..9dfb62ec28e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -315,6 +315,7 @@ jobs: # caveat: net9 is (currently?) NOT installed, so manually again - name: Set up .NET SDK run: | + sudo add-apt-repository ppa:dotnet/backports sudo apt-get install -y --no-install-recommends dotnet-sdk-9.0 # end From 624118f61f8d43dd719749894b9c5b756c7b67d8 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Tue, 11 Feb 2025 12:52:42 -0800 Subject: [PATCH 207/430] Update supported go versions With the release of go 1.24.0, go 1.22.x is no longer supported. Update supported go versions to go 1.23 and go 1.24. --- .github/workflows/build.yml | 4 ++-- LANGUAGES.md | 2 +- go.mod | 2 +- lib/go/test/fuzz/go.mod | 2 +- lib/go/test/go.mod | 2 +- test/go/go.mod | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9dfb62ec28e..5de80864924 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -135,8 +135,8 @@ jobs: strategy: matrix: go: - - '1.22' - '1.23' + - '1.24' fail-fast: false steps: - uses: actions/checkout@v4 @@ -180,7 +180,7 @@ jobs: run: make -C test/go precross - name: Upload go precross artifacts - if: matrix.go == '1.23' + if: matrix.go == '1.24' uses: actions/upload-artifact@v4 with: name: go-precross diff --git a/LANGUAGES.md b/LANGUAGES.md index 598edb2c538..ee772a7bfa1 100644 --- a/LANGUAGES.md +++ b/LANGUAGES.md @@ -163,7 +163,7 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr Go 0.7.0 Yes -1.221.23 +1.231.24 Yes YesYesYesYes YesYesYesYes diff --git a/go.mod b/go.mod index 51ef9140131..01690d887d4 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module github.com/apache/thrift -go 1.22.0 +go 1.23 diff --git a/lib/go/test/fuzz/go.mod b/lib/go/test/fuzz/go.mod index f22b62294f5..11116191a64 100644 --- a/lib/go/test/fuzz/go.mod +++ b/lib/go/test/fuzz/go.mod @@ -1,6 +1,6 @@ module github.com/apache/thrift/lib/go/test/fuzz -go 1.22.0 +go 1.23 require github.com/apache/thrift v0.0.0-00010101000000-000000000000 diff --git a/lib/go/test/go.mod b/lib/go/test/go.mod index 541bffc58ff..15329601594 100644 --- a/lib/go/test/go.mod +++ b/lib/go/test/go.mod @@ -1,6 +1,6 @@ module github.com/apache/thrift/lib/go/test -go 1.22.0 +go 1.23 require ( github.com/apache/thrift v0.0.0-00010101000000-000000000000 diff --git a/test/go/go.mod b/test/go/go.mod index f1f6f919747..d259db6530c 100644 --- a/test/go/go.mod +++ b/test/go/go.mod @@ -1,6 +1,6 @@ module github.com/apache/thrift/test/go -go 1.22.0 +go 1.23 require ( github.com/apache/thrift v0.0.0-00010101000000-000000000000 From 7eec2274bae3c8c5a40da8c42d31d3527fe6159b Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 12 Feb 2025 00:36:44 +0100 Subject: [PATCH 208/430] FIX broken netstd tests --- .../Protocols/ProtocolsOperationsTests.cs | 77 +++++++++++-------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/ProtocolsOperationsTests.cs b/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/ProtocolsOperationsTests.cs index dd9646ad914..f9f3117a6fc 100644 --- a/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/ProtocolsOperationsTests.cs +++ b/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/ProtocolsOperationsTests.cs @@ -23,6 +23,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Thrift.Protocol; using Thrift.Protocol.Entities; +using Thrift.Transport; using Thrift.Transport.Client; #pragma warning disable IDE0063 // using @@ -55,12 +56,13 @@ public async Task WriteReadMessage_Test(Type protocolType, TMessageType messageT try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteMessageBeginAsync(expected, default); await protocol.WriteMessageEndAsync(default); + await tuple.Transport.FlushAsync(default); stream.Seek(0, SeekOrigin.Begin); @@ -89,12 +91,13 @@ public async Task WriteReadStruct_Test(Type protocolType) try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteStructBeginAsync(expected, default); await protocol.WriteStructEndAsync(default); + await tuple.Transport.FlushAsync(default); stream?.Seek(0, SeekOrigin.Begin); @@ -124,12 +127,13 @@ public async Task WriteReadField_Test(Type protocolType) try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteFieldBeginAsync(expected, default); await protocol.WriteFieldEndAsync(default); + await tuple.Transport.FlushAsync(default); stream?.Seek(0, SeekOrigin.Begin); @@ -157,12 +161,13 @@ public async Task WriteReadMap_Test(Type protocolType) try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteMapBeginAsync(expected, default); await protocol.WriteMapEndAsync(default); + await tuple.Transport.FlushAsync(default); stream?.Seek(0, SeekOrigin.Begin); @@ -191,12 +196,13 @@ public async Task WriteReadList_Test(Type protocolType) try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteListBeginAsync(expected, default); await protocol.WriteListEndAsync(default); + await tuple.Transport.FlushAsync(default); stream?.Seek(0, SeekOrigin.Begin); @@ -224,12 +230,13 @@ public async Task WriteReadSet_Test(Type protocolType) try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteSetBeginAsync(expected, default); await protocol.WriteSetEndAsync(default); + await tuple.Transport.FlushAsync(default); stream?.Seek(0, SeekOrigin.Begin); @@ -257,11 +264,12 @@ public async Task WriteReadBool_Test(Type protocolType) try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteBoolAsync(expected, default); + await tuple.Transport.FlushAsync(default); stream?.Seek(0, SeekOrigin.Begin); @@ -288,11 +296,12 @@ public async Task WriteReadByte_Test(Type protocolType) try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteByteAsync(expected, default); + await tuple.Transport.FlushAsync(default); stream?.Seek(0, SeekOrigin.Begin); @@ -319,11 +328,12 @@ public async Task WriteReadI16_Test(Type protocolType) try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteI16Async(expected, default); + await tuple.Transport.FlushAsync(default); stream?.Seek(0, SeekOrigin.Begin); @@ -350,11 +360,12 @@ public async Task WriteReadI32_Test(Type protocolType) try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteI32Async(expected, default); + await tuple.Transport.FlushAsync(default); stream?.Seek(0, SeekOrigin.Begin); @@ -381,11 +392,12 @@ public async Task WriteReadI64_Test(Type protocolType) try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteI64Async(expected, default); + await tuple.Transport.FlushAsync(default); stream?.Seek(0, SeekOrigin.Begin); @@ -412,11 +424,12 @@ public async Task WriteReadDouble_Test(Type protocolType) try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteDoubleAsync(expected, default); + await tuple.Transport.FlushAsync(default); stream?.Seek(0, SeekOrigin.Begin); @@ -443,11 +456,12 @@ public async Task WriteReadString_Test(Type protocolType) try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteStringAsync(expected, default); + await tuple.Transport.FlushAsync(default); stream?.Seek(0, SeekOrigin.Begin); @@ -474,11 +488,12 @@ public async Task WriteReadBinary_Test(Type protocolType) try { var tuple = GetProtocolInstance(protocolType); - using (var stream = tuple.Item1) + using (var stream = tuple.Stream) { - var protocol = tuple.Item2; + var protocol = tuple.Protocol; await protocol.WriteBinaryAsync(expected, default); + await tuple.Transport.FlushAsync(default); stream?.Seek(0, SeekOrigin.Begin); @@ -494,12 +509,14 @@ public async Task WriteReadBinary_Test(Type protocolType) } } - private static Tuple GetProtocolInstance(Type protocolType) + private record struct ProtocolTransportStack(Stream Stream, TTransport Transport, TProtocol Protocol); + + private static ProtocolTransportStack GetProtocolInstance(Type protocolType) { var memoryStream = new MemoryStream(); var streamClientTransport = new TStreamTransport(memoryStream, memoryStream,Configuration); if( Activator.CreateInstance(protocolType, streamClientTransport) is TProtocol protocol) - return new Tuple(memoryStream, protocol); + return new ProtocolTransportStack(memoryStream, streamClientTransport, protocol); throw new Exception("Unexpected"); } } From a675c4f858b543af1b6bd2f33400076934175820 Mon Sep 17 00:00:00 2001 From: Cameron Martin Date: Wed, 15 Jan 2025 16:38:07 +0000 Subject: [PATCH 209/430] THRIFT-5564: Add nodets tests to Github Actions Client: nodets This adds the tests for the "nodets" library. This isn't an actual library, and are just another set of tests for the nodejs library, but also using typescript. Therefore I have added them in the existing "nodejs" job. --- .github/workflows/build.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5de80864924..57730c076fd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -531,7 +531,7 @@ jobs: - name: Run configure run: | - ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-nodejs/with-nodejs/') + ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed -E 's/without-node([tj])s/with-node\1s/g') - uses: actions/download-artifact@v4 with: @@ -543,9 +543,12 @@ jobs: chmod a+x compiler/cpp/thrift compiler/cpp/thrift -version - - name: Run tests + - name: Run js tests run: make -C lib/nodejs check + - name: Run ts tests + run: make -C lib/nodets check + cross-test: needs: - lib-java-kotlin From a84f02209e3beaf3d05f35b2b632b2edef96c4e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 21:16:35 +0000 Subject: [PATCH 210/430] Bump elliptic from 6.6.0 to 6.6.1 in /lib/js Bumps [elliptic](https://github.com/indutny/elliptic) from 6.6.0 to 6.6.1. - [Commits](https://github.com/indutny/elliptic/compare/v6.6.0...v6.6.1) --- updated-dependencies: - dependency-name: elliptic dependency-type: indirect ... Signed-off-by: dependabot[bot] --- lib/js/package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/js/package-lock.json b/lib/js/package-lock.json index 715cbde8775..cb202ca75e2 100644 --- a/lib/js/package-lock.json +++ b/lib/js/package-lock.json @@ -1060,10 +1060,11 @@ } }, "node_modules/elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", From eec0b584e657e4250e22f3fd492858d632e2aa7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Feb 2025 08:58:32 +0000 Subject: [PATCH 211/430] Bump elliptic from 6.6.0 to 6.6.1 in /lib/ts Bumps [elliptic](https://github.com/indutny/elliptic) from 6.6.0 to 6.6.1. - [Commits](https://github.com/indutny/elliptic/compare/v6.6.0...v6.6.1) --- updated-dependencies: - dependency-name: elliptic dependency-type: indirect ... Signed-off-by: dependabot[bot] --- lib/ts/package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/ts/package-lock.json b/lib/ts/package-lock.json index 70052b4096f..244d91d7655 100644 --- a/lib/ts/package-lock.json +++ b/lib/ts/package-lock.json @@ -1270,10 +1270,11 @@ } }, "node_modules/elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", From 5903c721bfc97b60aed02e9521a881bc6d5b81db Mon Sep 17 00:00:00 2001 From: Alkis Evlogimenos Date: Wed, 4 Sep 2024 12:55:32 +0000 Subject: [PATCH 212/430] Add `no_constructors` option to C++ compiler --- .../src/thrift/generate/t_cpp_generator.cc | 119 ++++++++++-------- 1 file changed, 68 insertions(+), 51 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc index 13d27a1b18c..c0767c33ec0 100644 --- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc @@ -66,6 +66,7 @@ class t_cpp_generator : public t_oop_generator { gen_moveable_ = false; gen_no_ostream_operators_ = false; gen_no_skeleton_ = false; + gen_no_constructors_ = false; has_members_ = false; for( iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) { @@ -88,6 +89,8 @@ class t_cpp_generator : public t_oop_generator { gen_no_ostream_operators_ = true; } else if ( iter->first.compare("no_skeleton") == 0) { gen_no_skeleton_ = true; + } else if ( iter->first.compare("no_constructors") == 0) { + gen_no_constructors_ = true; } else { throw "unknown option cpp:" + iter->first; } @@ -124,7 +127,7 @@ class t_cpp_generator : public t_oop_generator { void generate_service(t_service* tservice) override; void print_const_value(std::ostream& out, std::string name, t_type* type, t_const_value* value); - std::string render_const_value(std::ostream& out, + std::string render_const_value(std::ostream* out, std::string name, t_type* type, t_const_value* value); @@ -369,10 +372,15 @@ class t_cpp_generator : public t_oop_generator { bool gen_no_default_operators_; /** - * True if we should generate skeleton. + * True if we should omit generating skeleton. */ bool gen_no_skeleton_; + /** + * True if we should omit generating constructors/destructors/assignment/destructors. + */ + bool gen_no_constructors_; + /** * True if thrift has member(s) */ @@ -786,7 +794,7 @@ void t_cpp_generator::print_const_value(ostream& out, t_const_value* value) { type = get_true_type(type); if (type->is_base_type()) { - string v2 = render_const_value(out, name, type, value); + string v2 = render_const_value(&out, name, type, value); indent(out) << name << " = " << v2 << ";" << '\n' << '\n'; } else if (type->is_enum()) { indent(out) << name @@ -810,7 +818,7 @@ void t_cpp_generator::print_const_value(ostream& out, if (field_type == nullptr) { throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string(); } - string item_val = render_const_value(out, name, field_type, v_iter->second); + string item_val = render_const_value(&out, name, field_type, v_iter->second); indent(out) << name << "." << v_iter->first->get_string() << " = " << item_val << ";" << '\n'; if (is_nonrequired_field) { indent(out) << name << ".__isset." << v_iter->first->get_string() << " = true;" << '\n'; @@ -823,8 +831,8 @@ void t_cpp_generator::print_const_value(ostream& out, const map& val = value->get_map(); map::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { - string key = render_const_value(out, name, ktype, v_iter->first); - string item_val = render_const_value(out, name, vtype, v_iter->second); + string key = render_const_value(&out, name, ktype, v_iter->first); + string item_val = render_const_value(&out, name, vtype, v_iter->second); indent(out) << name << ".insert(std::make_pair(" << key << ", " << item_val << "));" << '\n'; } out << '\n'; @@ -833,7 +841,7 @@ void t_cpp_generator::print_const_value(ostream& out, const vector& val = value->get_list(); vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { - string item_val = render_const_value(out, name, etype, *v_iter); + string item_val = render_const_value(&out, name, etype, *v_iter); indent(out) << name << ".push_back(" << item_val << ");" << '\n'; } out << '\n'; @@ -842,7 +850,7 @@ void t_cpp_generator::print_const_value(ostream& out, const vector& val = value->get_list(); vector::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { - string item_val = render_const_value(out, name, etype, *v_iter); + string item_val = render_const_value(&out, name, etype, *v_iter); indent(out) << name << ".insert(" << item_val << ");" << '\n'; } out << '\n'; @@ -854,7 +862,7 @@ void t_cpp_generator::print_const_value(ostream& out, /** * */ -string t_cpp_generator::render_const_value(ostream& out, +string t_cpp_generator::render_const_value(ostream* out, string name, t_type* type, t_const_value* value) { @@ -891,10 +899,10 @@ string t_cpp_generator::render_const_value(ostream& out, } else if (type->is_enum()) { render << "static_cast<" << type_name(type) << '>' << '(' << value->get_integer() << ')'; - } else { + } else if (out) { string t = tmp("tmp"); - indent(out) << type_name(type) << " " << t << ";" << '\n'; - print_const_value(out, t, type, value); + indent(*out) << type_name(type) << " " << t << ";" << '\n'; + print_const_value(*out, t, type, value); render << t; } @@ -924,13 +932,15 @@ void t_cpp_generator::generate_cpp_struct(t_struct* tstruct, bool is_exception) if (!gen_no_default_operators_) { generate_equality_operator(f_types_impl_, tstruct); } - generate_copy_constructor(f_types_impl_, tstruct, is_exception); - if (gen_moveable_) { - generate_move_constructor(f_types_impl_, tstruct, is_exception); - } - generate_assignment_operator(f_types_impl_, tstruct); - if (gen_moveable_) { - generate_move_assignment_operator(f_types_impl_, tstruct); + if (!gen_no_constructors_) { + generate_copy_constructor(f_types_impl_, tstruct, is_exception); + if (gen_moveable_) { + generate_move_constructor(f_types_impl_, tstruct, is_exception); + } + generate_assignment_operator(f_types_impl_, tstruct); + if (gen_moveable_) { + generate_move_assignment_operator(f_types_impl_, tstruct); + } } if (!has_custom_ostream(tstruct)) { @@ -1026,7 +1036,7 @@ void t_cpp_generator::generate_default_constructor(ostream& out, string dval; t_const_value* cv = (*m_iter)->get_value(); if (cv != nullptr) { - dval += render_const_value(out, (*m_iter)->get_name(), t, cv); + dval += render_const_value(&out, (*m_iter)->get_name(), t, cv); } else if (t->is_enum()) { dval += "static_cast<" + type_name(t) + ">(0)"; } else { @@ -1266,7 +1276,7 @@ void t_cpp_generator::generate_struct_declaration(ostream& out, << " public:" << '\n' << '\n'; indent_up(); - if (!pointers) { + if (!gen_no_constructors_ && !pointers) { bool ok_noexcept = is_struct_storage_not_throwing(tstruct); // Copy constructor indent(out) << tstruct->get_name() << "(const " << tstruct->get_name() << "&)" @@ -1295,15 +1305,17 @@ void t_cpp_generator::generate_struct_declaration(ostream& out, indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept") << ";" << '\n'; } - if (tstruct->annotations_.find("final") == tstruct->annotations_.end()) { - out << '\n' << indent() << "virtual ~" << tstruct->get_name() << "() noexcept;" << '\n'; + if (!gen_no_constructors_ && tstruct->annotations_.find("final") == tstruct->annotations_.end()) { + out << '\n' << indent(); + if (!gen_templates_) out << "virtual "; + out << "~" << tstruct->get_name() << "() noexcept;\n"; } // Declare all fields for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { generate_java_doc(out, *m_iter); indent(out) << declare_field(*m_iter, - false, + !pointers && gen_no_constructors_, (pointers && !(*m_iter)->get_type()->is_xception()), !read) << '\n'; } @@ -1376,7 +1388,8 @@ void t_cpp_generator::generate_struct_declaration(ostream& out, out << '\n'; if (is_user_struct && !has_custom_ostream(tstruct)) { - out << indent() << "virtual "; + out << indent(); + if (!gen_templates_) out << "virtual "; generate_struct_print_method_decl(out, nullptr); out << ";" << '\n'; } @@ -1419,7 +1432,7 @@ void t_cpp_generator::generate_struct_definition(ostream& out, const vector& members = tstruct->get_members(); // Destructor - if (tstruct->annotations_.find("final") == tstruct->annotations_.end()) { + if (!gen_no_constructors_ && tstruct->annotations_.find("final") == tstruct->annotations_.end()) { force_cpp_out << '\n' << indent() << tstruct->get_name() << "::~" << tstruct->get_name() << "() noexcept {" << '\n'; indent_up(); @@ -1428,7 +1441,7 @@ void t_cpp_generator::generate_struct_definition(ostream& out, force_cpp_out << indent() << "}" << '\n' << '\n'; } - if (!pointers) + if (!gen_no_constructors_ && !pointers) { // 'force_cpp_out' always goes into the .cpp file, and never into a .tcc // file in case templates are involved. Since the constructor is not templated, @@ -4607,31 +4620,35 @@ string t_cpp_generator::declare_field(t_field* tfield, result += " " + tfield->get_name(); if (init) { t_type* type = get_true_type(tfield->get_type()); - - if (type->is_base_type()) { - t_base_type::t_base tbase = ((t_base_type*)type)->get_base(); - switch (tbase) { - case t_base_type::TYPE_VOID: - case t_base_type::TYPE_STRING: - case t_base_type::TYPE_UUID: - break; - case t_base_type::TYPE_BOOL: - result += " = false"; - break; - case t_base_type::TYPE_I8: - case t_base_type::TYPE_I16: - case t_base_type::TYPE_I32: - case t_base_type::TYPE_I64: - result += " = 0"; - break; - case t_base_type::TYPE_DOUBLE: - result += " = 0.0"; - break; - default: - throw "compiler error: no C++ initializer for base type " + t_base_type::t_base_name(tbase); + if (t_const_value* cv = tfield->get_value()) { + result += " = " + render_const_value(nullptr, tfield->get_name(), type, cv); + } else { + if (type->is_base_type()) { + t_base_type::t_base tbase = ((t_base_type*)type)->get_base(); + + switch (tbase) { + case t_base_type::TYPE_VOID: + case t_base_type::TYPE_STRING: + case t_base_type::TYPE_UUID: + break; + case t_base_type::TYPE_BOOL: + result += " = false"; + break; + case t_base_type::TYPE_I8: + case t_base_type::TYPE_I16: + case t_base_type::TYPE_I32: + case t_base_type::TYPE_I64: + result += " = 0"; + break; + case t_base_type::TYPE_DOUBLE: + result += " = 0.0"; + break; + default: + throw "compiler error: no C++ initializer for base type " + t_base_type::t_base_name(tbase); + } + } else if (type->is_enum()) { + result += " = static_cast<" + type_name(type) + ">(0)"; } - } else if (type->is_enum()) { - result += " = static_cast<" + type_name(type) + ">(0)"; } } if (!reference) { From 24df0a5d1fb02a6c562cbea0d0ea86b76220fb65 Mon Sep 17 00:00:00 2001 From: Alexandre Detiste Date: Thu, 16 Jan 2025 00:39:20 +0100 Subject: [PATCH 213/430] test/crossrunner: merge in old Py2vs3 compat.py --- test/crossrunner/compat.py | 7 ------- test/crossrunner/report.py | 21 ++++++++++++--------- test/crossrunner/run.py | 3 +-- test/crossrunner/test.py | 5 ++--- 4 files changed, 15 insertions(+), 21 deletions(-) delete mode 100644 test/crossrunner/compat.py diff --git a/test/crossrunner/compat.py b/test/crossrunner/compat.py deleted file mode 100644 index a670c33f266..00000000000 --- a/test/crossrunner/compat.py +++ /dev/null @@ -1,7 +0,0 @@ -import os - -path_join = os.path.join -str_join = str.join - -def logfile_open(*args): - return open(*args, errors='replace') diff --git a/test/crossrunner/report.py b/test/crossrunner/report.py index 7e1b0c747e9..9231a8b1ace 100644 --- a/test/crossrunner/report.py +++ b/test/crossrunner/report.py @@ -28,7 +28,6 @@ import time import traceback -from .compat import logfile_open, path_join, str_join from .test import TestEntry LOG_DIR = 'log' @@ -37,6 +36,10 @@ FAIL_JSON = 'known_failures_%s.json' +def logfile_open(*args): + return open(*args, errors='replace') + + def generate_known_failures(testdir, overwrite, save, out): def collect_failures(results): success_index = 5 @@ -44,7 +47,7 @@ def collect_failures(results): if not r[success_index]: yield TestEntry.get_name(*r) try: - with logfile_open(path_join(testdir, RESULT_JSON), 'r') as fp: + with logfile_open(os.path.join(testdir, RESULT_JSON), 'r') as fp: results = json.load(fp) except IOError: sys.stderr.write('Unable to load last result. Did you run tests ?\n') @@ -67,7 +70,7 @@ def collect_failures(results): def load_known_failures(testdir): try: - with logfile_open(path_join(testdir, FAIL_JSON % platform.system()), 'r') as fp: + with logfile_open(os.path.join(testdir, FAIL_JSON % platform.system()), 'r') as fp: return json.load(fp) except IOError: return [] @@ -84,8 +87,8 @@ def __init__(self): @classmethod def test_logfile(cls, test_name, prog_kind, dir=None): - relpath = path_join('log', '%s_%s.log' % (test_name, prog_kind)) - return relpath if not dir else os.path.realpath(path_join(dir, relpath)) + relpath = os.path.join('log', '%s_%s.log' % (test_name, prog_kind)) + return relpath if not dir else os.path.realpath(os.path.join(dir, relpath)) def _start(self): self._start_time = time.time() @@ -199,7 +202,7 @@ def _close(self): def _print_header(self): self._print_date() - print('Executing: %s' % str_join(' ', self._prog.command), file=self.out) + print('Executing: %s' % ' '.join(self._prog.command), file=self.out) print('Directory: %s' % self._prog.workdir, file=self.out) print('config:delay: %s' % self._test.delay, file=self.out) print('config:timeout: %s' % self._test.timeout, file=self.out) @@ -221,8 +224,8 @@ def __init__(self, basedir, testdir_relative, concurrent=True): super(SummaryReporter, self).__init__() self._basedir = basedir self._testdir_rel = testdir_relative - self.logdir = path_join(self.testdir, LOG_DIR) - self.out_path = path_join(self.testdir, RESULT_JSON) + self.logdir = os.path.join(self.testdir, LOG_DIR) + self.out_path = os.path.join(self.testdir, RESULT_JSON) self.concurrent = concurrent self.out = sys.stdout self._platform = platform.system() @@ -239,7 +242,7 @@ def __init__(self, basedir, testdir_relative, concurrent=True): @property def testdir(self): - return path_join(self._basedir, self._testdir_rel) + return os.path.join(self._basedir, self._testdir_rel) def _result_string(self, test): if test.success: diff --git a/test/crossrunner/run.py b/test/crossrunner/run.py index 126b7ec886a..3ccc6e32bd3 100644 --- a/test/crossrunner/run.py +++ b/test/crossrunner/run.py @@ -28,7 +28,6 @@ import sys import time -from .compat import str_join from .report import ExecReporter, SummaryReporter from .test import TestEntry from .util import domain_socket_path @@ -72,7 +71,7 @@ def _popen_args(self): return args def start(self): - joined = str_join(' ', self.cmd) + joined = ' '.join(self.cmd) self._log.debug('COMMAND: %s', joined) self._log.debug('WORKDIR: %s', self.cwd) self._log.debug('LOGFILE: %s', self.report.logpath) diff --git a/test/crossrunner/test.py b/test/crossrunner/test.py index 0e912843ab7..2a1a4da7c48 100644 --- a/test/crossrunner/test.py +++ b/test/crossrunner/test.py @@ -21,7 +21,6 @@ import multiprocessing import os import sys -from .compat import path_join from .util import merge_dict, domain_socket_path @@ -50,7 +49,7 @@ def __init__(self, kind, name, protocol, transport, socket, workdir, stop_signal def _fix_cmd_path(self, cmd): # if the arg is a file in the current directory, make it path def abs_if_exists(arg): - p = path_join(self.workdir, arg) + p = os.path.join(self.workdir, arg) return p if os.path.exists(p) else arg if cmd[0] == 'python': @@ -125,7 +124,7 @@ def _fix_workdir(self, config): if os.path.isabs(path): path = os.path.realpath(path) else: - path = os.path.realpath(path_join(self.testdir, path)) + path = os.path.realpath(os.path.join(self.testdir, path)) config.update({key: path}) return config From 951bb184059748c40e208eba82ebd42cf74bedaa Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Tue, 8 Nov 2022 17:38:49 +0900 Subject: [PATCH 214/430] THRIFT-5667: Make ThriftConfig.cmake relocatable Client: cpp The current ThriftConfig.cmake isn't relocatable. It means that we can't move ThriftConfig.cmake installed by "make install". In general, users don't need to move ThriftConfig.cmake installed by "make install" but some packaging systems such as conda and MSYS2 needs to move. Because users of these packaging systems may use different prefix. For example, conda may be used with ~alice/my-conda and ~bob/conda as base directory. CMake has a feature to make Config.cmake relocatable: https://cmake.org/cmake/help/latest/module/CMakePackageConfigHelpers.html We can use it to make ThriftConfig.cmake relocatable. --- build/cmake/GenerateConfigModule.cmake | 11 ++++------- build/cmake/ThriftConfig.cmake.in | 5 +++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/build/cmake/GenerateConfigModule.cmake b/build/cmake/GenerateConfigModule.cmake index 597ffd8f72c..15c094296ff 100644 --- a/build/cmake/GenerateConfigModule.cmake +++ b/build/cmake/GenerateConfigModule.cmake @@ -18,19 +18,16 @@ # include(CMakePackageConfigHelpers) -set(PACKAGE_INCLUDE_INSTALL_DIR "${includedir}/thrift") -set(PACKAGE_CMAKE_INSTALL_DIR "${cmakedir}/thrift") -set(PACKAGE_BIN_INSTALL_DIR "${exec_prefix}") -# In CYGWIN enviroment below commands does not work properly +# In CYGWIN environment below commands does not work properly if (NOT CYGWIN) configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/ThriftConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/ThriftConfig.cmake" INSTALL_DESTINATION "${CMAKE_INSTALL_DIR}/thrift" PATH_VARS - PACKAGE_INCLUDE_INSTALL_DIR - PACKAGE_CMAKE_INSTALL_DIR - PACKAGE_BIN_INSTALL_DIR + INCLUDE_INSTALL_DIR + CMAKE_INSTALL_DIR + BIN_INSTALL_DIR ) write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/ThriftConfigVersion.cmake" diff --git a/build/cmake/ThriftConfig.cmake.in b/build/cmake/ThriftConfig.cmake.in index f132fe11f54..7c12c3f52bd 100644 --- a/build/cmake/ThriftConfig.cmake.in +++ b/build/cmake/ThriftConfig.cmake.in @@ -21,8 +21,9 @@ set(THRIFT_VERSION @thrift_VERSION@) @PACKAGE_INIT@ -set_and_check(THRIFT_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") -set_and_check(THRIFT_CMAKE_DIR "@PACKAGE_CMAKE_INSTALL_DIR@") +set_and_check(THRIFT_CMAKE_DIR "${CMAKE_CURRENT_LIST_DIR}") + +set_and_check(THRIFT_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@/thrift") set_and_check(THRIFT_BIN_DIR "@PACKAGE_BIN_INSTALL_DIR@") if(NOT DEFINED THRIFT_COMPILER) set(THRIFT_COMPILER "${THRIFT_BIN_DIR}/thrift@CMAKE_EXECUTABLE_SUFFIX@") From caef0eda24dd82aadc504d7a2f645add57a7e468 Mon Sep 17 00:00:00 2001 From: Cameron Martin Date: Wed, 15 Jan 2025 11:58:39 +0100 Subject: [PATCH 215/430] THRIFT-5811: Update eslint & prettier Client: js Patch: Cameron Martin This closes #3087 --- .eslintignore | 9 - .eslintrc.json | 24 - eslint.config.mjs | 44 + lib/js/Gruntfile.js | 297 ++- lib/nodejs/examples/client.js | 24 +- lib/nodejs/examples/client_multitransport.js | 64 +- lib/nodejs/examples/hello.js | 56 +- lib/nodejs/examples/httpClient.js | 24 +- lib/nodejs/examples/httpServer.js | 37 +- lib/nodejs/examples/parse.js | 6 +- lib/nodejs/examples/server.js | 10 +- lib/nodejs/examples/server_http.js | 38 +- lib/nodejs/examples/server_multitransport.js | 26 +- lib/nodejs/lib/thrift/binary.js | 53 +- lib/nodejs/lib/thrift/binary_protocol.js | 216 +-- lib/nodejs/lib/thrift/browser.js | 32 +- lib/nodejs/lib/thrift/buffered_transport.js | 85 +- lib/nodejs/lib/thrift/compact_protocol.js | 479 ++--- lib/nodejs/lib/thrift/connection.js | 340 ++-- lib/nodejs/lib/thrift/create_client.js | 4 +- lib/nodejs/lib/thrift/framed_transport.js | 70 +- lib/nodejs/lib/thrift/header_protocol.js | 118 +- lib/nodejs/lib/thrift/header_transport.js | 107 +- lib/nodejs/lib/thrift/http_connection.js | 93 +- lib/nodejs/lib/thrift/index.js | 38 +- .../lib/thrift/input_buffer_underrun_error.js | 2 +- lib/nodejs/lib/thrift/int64_util.js | 44 +- lib/nodejs/lib/thrift/json_parse.js | 515 +++-- lib/nodejs/lib/thrift/json_protocol.js | 322 ++-- lib/nodejs/lib/thrift/log.js | 30 +- .../lib/thrift/multiplexed_processor.js | 29 +- lib/nodejs/lib/thrift/multiplexed_protocol.js | 50 +- lib/nodejs/lib/thrift/ohos_connection.js | 73 +- lib/nodejs/lib/thrift/protocol.js | 6 +- lib/nodejs/lib/thrift/server.js | 129 +- lib/nodejs/lib/thrift/thrift.js | 158 +- lib/nodejs/lib/thrift/transport.js | 6 +- lib/nodejs/lib/thrift/web_server.js | 481 ++--- lib/nodejs/lib/thrift/ws_connection.js | 83 +- lib/nodejs/lib/thrift/ws_transport.js | 109 +- lib/nodejs/lib/thrift/xhr_connection.js | 98 +- lib/nodejs/test/binary.test.js | 74 +- lib/nodejs/test/client.js | 26 +- lib/nodejs/test/deep-constructor.test.js | 152 +- .../episodic-code-generation-test/client.js | 16 +- .../episodic-code-generation-test/server.js | 6 +- lib/nodejs/test/exceptions.js | 36 +- lib/nodejs/test/header.test.js | 20 +- lib/nodejs/test/helpers.js | 4 +- lib/nodejs/test/int64.test.js | 24 +- lib/nodejs/test/server.js | 22 +- lib/nodejs/test/test-cases.js | 40 +- lib/nodejs/test/test_driver.js | 102 +- lib/nodejs/test/test_handler.js | 14 +- lib/nodets/test/client.ts | 8 +- lib/nodets/test/int64.test.ts | 48 +- lib/nodets/test/server.ts | 27 +- lib/nodets/test/test-cases.ts | 168 +- lib/nodets/test/test_driver.ts | 185 +- lib/nodets/test/test_handler.ts | 192 +- lib/ts/Gruntfile.js | 145 +- lib/ts/test/phantom-client.ts | 655 +++---- lib/ts/test/server_http.js | 28 +- lib/ts/test/test-int64.ts | 136 +- lib/ts/test/test.ts | 665 +++---- lib/ts/test/test_handler.js | 132 +- lib/ts/thrift.d.ts | 175 +- package-lock.json | 1673 ++++++++--------- package.json | 16 +- test/result.js | 99 +- tutorial/nodejs/NodeClient.js | 35 +- tutorial/nodejs/NodeClientPromise.js | 58 +- tutorial/nodejs/NodeServer.js | 19 +- tutorial/nodejs/NodeServerPromise.js | 21 +- 74 files changed, 4880 insertions(+), 4570 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.json create mode 100644 eslint.config.mjs diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index dde2dba1845..00000000000 --- a/.eslintignore +++ /dev/null @@ -1,9 +0,0 @@ -# TODO: Use eslint on js lib and generated code - -# Ignore lib/js for now, which uses jshint currently -lib/js/* -# Ignore all generated code for now -**/gen-* - -# Don't lint nested node_modules -**/node_modules diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 0aae820ecdb..00000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "env": { - "es6": true, - "node": true - }, - "extends": [ - "eslint:recommended", - "plugin:prettier/recommended" - ], - "parserOptions": { - "ecmaVersion": 2017 - }, - "rules": { - "no-console": "off", - "no-var": "error", - "prefer-const": "error", - "no-constant-condition": [ - "error", - { - "checkLoops": false - } - ] - } -} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000000..a27b211ec7f --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,44 @@ +import globals from "globals"; +import js from "@eslint/js"; +import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; + +export default [ + { + ignores: [ + // TODO: Use eslint on js lib and generated code + + // Ignore lib/js for now, which uses jshint currently + "lib/js/*", + // Ignore all generated code for now + "**/gen-*/", + + // Don't lint nested node_modules + "**/node_modules/", + ], + }, + js.configs.recommended, + eslintPluginPrettierRecommended, + { + languageOptions: { + globals: { + ...globals.node, + }, + + ecmaVersion: 2017, + sourceType: "commonjs", + }, + + rules: { + "no-console": "off", + "no-var": "error", + "prefer-const": "error", + + "no-constant-condition": [ + "error", + { + checkLoops: false, + }, + ], + }, + }, +]; diff --git a/lib/js/Gruntfile.js b/lib/js/Gruntfile.js index 97713140a25..089ef8f6610 100644 --- a/lib/js/Gruntfile.js +++ b/lib/js/Gruntfile.js @@ -5,47 +5,48 @@ // Grunt Setup - npm install //reads the ./package.json and installs project dependencies // Run grunt - npx grunt // uses project-local installed version of grunt (from package.json) -module.exports = function(grunt) { - 'use strict'; +module.exports = function (grunt) { + "use strict"; grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), + pkg: grunt.file.readJSON("package.json"), concat: { options: { - separator: ';' + separator: ";", }, dist: { - src: ['src/**/*.js'], - dest: 'dist/<%= pkg.name %>.js' - } + src: ["src/**/*.js"], + dest: "dist/<%= pkg.name %>.js", + }, }, - jsdoc : { - dist : { - src: ['src/*.js', './README.md'], - options: { - destination: 'doc' - } - } + jsdoc: { + dist: { + src: ["src/*.js", "./README.md"], + options: { + destination: "doc", + }, + }, }, uglify: { options: { - banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n' + banner: + '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n', }, dist: { files: { - 'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>'] - } - } + "dist/<%= pkg.name %>.min.js": ["<%= concat.dist.dest %>"], + }, + }, }, shell: { InstallThriftJS: { - command: 'cp src/thrift.js test/build/js/thrift.js' + command: "cp src/thrift.js test/build/js/thrift.js", }, InstallThriftNodeJSDep: { - command: 'cd ../.. && npm install' + command: "cd ../.. && npm install", }, InstallTestLibs: { - command: 'cd test && ant download_jslibs' + command: "cd test && ant download_jslibs", }, ThriftGen: { command: [ @@ -55,34 +56,38 @@ module.exports = function(grunt) { '"../../compiler/cpp/thrift" -gen js:node --out test/gen-nodejs ../../test/v0.16/ThriftTest.thrift', '"../../compiler/cpp/thrift" -gen js:es6 --out test/gen-js-es6 ../../test/v0.16/ThriftTest.thrift', '"../../compiler/cpp/thrift" -gen js:node,es6 --out ./test/gen-nodejs-es6 ../../test/v0.16/ThriftTest.thrift', - ].join(' && ') + ].join(" && "), }, ThriftGenJQ: { - command: '../../compiler/cpp/thrift -gen js:jquery -gen js:node -o test ../../test/v0.16/ThriftTest.thrift' + command: + "../../compiler/cpp/thrift -gen js:jquery -gen js:node -o test ../../test/v0.16/ThriftTest.thrift", }, ThriftGenDeepConstructor: { - command: '../../compiler/cpp/thrift -gen js -o test ../../test/JsDeepConstructorTest.thrift' + command: + "../../compiler/cpp/thrift -gen js -o test ../../test/JsDeepConstructorTest.thrift", }, ThriftBrowserifyNodeInt64: { command: [ - './node_modules/browserify/bin/cmd.js ./node_modules/node-int64/Int64.js -s Int64 -o test/build/js/lib/Int64.js', - './node_modules/browserify/bin/cmd.js ../nodejs/lib/thrift/int64_util.js -s Int64Util -o test/build/js/lib/Int64Util.js', - './node_modules/browserify/bin/cmd.js ./node_modules/json-int64/index.js -s JSONInt64 -o test/build/js/lib/JSONInt64.js' - ].join(' && ') + "./node_modules/browserify/bin/cmd.js ./node_modules/node-int64/Int64.js -s Int64 -o test/build/js/lib/Int64.js", + "./node_modules/browserify/bin/cmd.js ../nodejs/lib/thrift/int64_util.js -s Int64Util -o test/build/js/lib/Int64Util.js", + "./node_modules/browserify/bin/cmd.js ./node_modules/json-int64/index.js -s JSONInt64 -o test/build/js/lib/JSONInt64.js", + ].join(" && "), }, ThriftGenInt64: { - command: '../../compiler/cpp/thrift -gen js -o test ../../test/Int64Test.thrift' + command: + "../../compiler/cpp/thrift -gen js -o test ../../test/Int64Test.thrift", }, ThriftGenDoubleConstants: { - command: '../../compiler/cpp/thrift -gen js -o test ../../test/DoubleConstantsTest.thrift' + command: + "../../compiler/cpp/thrift -gen js -o test ../../test/DoubleConstantsTest.thrift", }, ThriftTestServer: { options: { async: true, execOptions: { cwd: "./test", - env: {NODE_PATH: "../../nodejs/lib:../../../node_modules"} - } + env: { NODE_PATH: "../../nodejs/lib:../../../node_modules" }, + }, }, command: "node server_http.js", }, @@ -91,8 +96,8 @@ module.exports = function(grunt) { async: true, execOptions: { cwd: "./test", - env: {NODE_PATH: "../../nodejs/lib:../../../node_modules"} - } + env: { NODE_PATH: "../../nodejs/lib:../../../node_modules" }, + }, }, command: "node server_http.js --es6", }, @@ -101,8 +106,8 @@ module.exports = function(grunt) { async: true, execOptions: { cwd: "./test", - env: {NODE_PATH: "../../nodejs/lib:../../../node_modules"} - } + env: { NODE_PATH: "../../nodejs/lib:../../../node_modules" }, + }, }, command: "node server_https.js", }, @@ -111,8 +116,8 @@ module.exports = function(grunt) { async: true, execOptions: { cwd: "./test", - env: {NODE_PATH: "../../nodejs/lib:../../../node_modules"} - } + env: { NODE_PATH: "../../nodejs/lib:../../../node_modules" }, + }, }, command: "node server_https.js --es6", }, @@ -120,213 +125,201 @@ module.exports = function(grunt) { qunit: { ThriftJS: { options: { - urls: [ - 'http://localhost:8089/test-nojq.html' - ], + urls: ["http://localhost:8089/test-nojq.html"], puppeteer: { headless: true, - args: ['--no-sandbox'], + args: ["--no-sandbox"], }, - } + }, }, ThriftJSJQ: { options: { - urls: [ - 'http://localhost:8089/test.html' - ], + urls: ["http://localhost:8089/test.html"], puppeteer: { headless: true, - args: ['--no-sandbox'], + args: ["--no-sandbox"], }, - } + }, }, ThriftJS_DoubleRendering: { options: { - urls: [ - 'http://localhost:8089/test-double-rendering.html' - ], + urls: ["http://localhost:8089/test-double-rendering.html"], puppeteer: { headless: true, - args: ['--no-sandbox'], + args: ["--no-sandbox"], ignoreHTTPSErrors: true, }, - } + }, }, ThriftJS_Int64: { options: { - urls: [ - 'http://localhost:8089/test-int64.html' - ], + urls: ["http://localhost:8089/test-int64.html"], puppeteer: { headless: true, - args: ['--no-sandbox'], + args: ["--no-sandbox"], ignoreHTTPSErrors: true, }, - } + }, }, ThriftWS: { options: { - urls: [ - 'http://localhost:8089/testws.html' - ], + urls: ["http://localhost:8089/testws.html"], puppeteer: { headless: true, - args: ['--no-sandbox'], + args: ["--no-sandbox"], }, - } + }, }, ThriftJS_TLS: { options: { - urls: [ - 'https://localhost:8091/test-nojq.html' - ], + urls: ["https://localhost:8091/test-nojq.html"], puppeteer: { headless: true, - args: ['--no-sandbox'], + args: ["--no-sandbox"], ignoreHTTPSErrors: true, }, - } + }, }, ThriftJSJQ_TLS: { options: { - urls: [ - 'https://localhost:8091/test.html' - ], + urls: ["https://localhost:8091/test.html"], puppeteer: { headless: true, - args: ['--no-sandbox'], + args: ["--no-sandbox"], ignoreHTTPSErrors: true, }, - } + }, }, ThriftWS_TLS: { options: { - urls: [ - 'https://localhost:8091/testws.html' - ], + urls: ["https://localhost:8091/testws.html"], puppeteer: { headless: true, - args: ['--no-sandbox'], + args: ["--no-sandbox"], ignoreHTTPSErrors: true, }, - } + }, }, ThriftDeepConstructor: { options: { - urls: [ - 'http://localhost:8089/test-deep-constructor.html' - ], + urls: ["http://localhost:8089/test-deep-constructor.html"], puppeteer: { headless: true, - args: ['--no-sandbox'], + args: ["--no-sandbox"], }, - } + }, }, ThriftWSES6: { options: { - urls: [ - 'http://localhost:8088/test-es6.html' - ], + urls: ["http://localhost:8088/test-es6.html"], puppeteer: { headless: true, - args: ['--no-sandbox'], + args: ["--no-sandbox"], }, - } - } + }, + }, }, jshint: { // The main Thrift library file. not es6 yet :( lib: { - src: ['src/**/*.js'], + src: ["src/**/*.js"], }, // The test files use es6 test: { - src: ['Gruntfile.js', 'test/*.js'], + src: ["Gruntfile.js", "test/*.js"], options: { esversion: 6, - } + }, }, gen_js_code: { - src: ['test/gen-js/*.js', 'test/gen-js-jquery/*.js'], + src: ["test/gen-js/*.js", "test/gen-js-jquery/*.js"], }, gen_es6_code: { - src: ['test/gen-js-es6/*.js'], + src: ["test/gen-js-es6/*.js"], options: { esversion: 6, - } + }, }, gen_node_code: { - src: ['test/gen-nodejs/*.js'], + src: ["test/gen-nodejs/*.js"], options: { node: true, - } + }, }, gen_node_es6_code: { - src: ['test/gen-nodejs-es6/*.js'], + src: ["test/gen-nodejs-es6/*.js"], options: { node: true, esversion: 6, - } - } + }, + }, }, }); - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-qunit'); - grunt.loadNpmTasks('grunt-contrib-concat'); - grunt.loadNpmTasks('grunt-jsdoc'); - grunt.loadNpmTasks('grunt-shell-spawn'); + grunt.loadNpmTasks("grunt-contrib-uglify"); + grunt.loadNpmTasks("grunt-contrib-jshint"); + grunt.loadNpmTasks("grunt-contrib-qunit"); + grunt.loadNpmTasks("grunt-contrib-concat"); + grunt.loadNpmTasks("grunt-jsdoc"); + grunt.loadNpmTasks("grunt-shell-spawn"); - grunt.registerTask('wait', 'Wait just one second for the server to start', function () { - var done = this.async(); - setTimeout(function() { - done(true); - }, 1000); - }); + grunt.registerTask( + "wait", + "Wait just one second for the server to start", + function () { + var done = this.async(); + setTimeout(function () { + done(true); + }, 1000); + }, + ); - grunt.registerTask('CreateDirectories', 'Creating required local directories', function () { - grunt.file.mkdir('test/build/js/lib'); - grunt.file.mkdir('test/gen-js'); - grunt.file.mkdir('test/gen-js-jquery'); - grunt.file.mkdir('test/gen-nodejs'); - grunt.file.mkdir('test/gen-js-es6'); - grunt.file.mkdir('test/gen-nodejs-es6'); -}); + grunt.registerTask( + "CreateDirectories", + "Creating required local directories", + function () { + grunt.file.mkdir("test/build/js/lib"); + grunt.file.mkdir("test/gen-js"); + grunt.file.mkdir("test/gen-js-jquery"); + grunt.file.mkdir("test/gen-nodejs"); + grunt.file.mkdir("test/gen-js-es6"); + grunt.file.mkdir("test/gen-nodejs-es6"); + }, + ); - grunt.registerTask('installAndGenerate', [ - 'CreateDirectories', - 'shell:InstallThriftJS', - 'shell:InstallThriftNodeJSDep', - 'shell:ThriftGen', - 'shell:ThriftGenDeepConstructor', - 'shell:ThriftGenDoubleConstants', - 'shell:InstallTestLibs', - 'shell:ThriftBrowserifyNodeInt64', - 'shell:ThriftGenInt64' + grunt.registerTask("installAndGenerate", [ + "CreateDirectories", + "shell:InstallThriftJS", + "shell:InstallThriftNodeJSDep", + "shell:ThriftGen", + "shell:ThriftGenDeepConstructor", + "shell:ThriftGenDoubleConstants", + "shell:InstallTestLibs", + "shell:ThriftBrowserifyNodeInt64", + "shell:ThriftGenInt64", ]); - grunt.registerTask('test', [ - 'installAndGenerate', - 'jshint', - 'shell:ThriftTestServer', - 'shell:ThriftTestServer_TLS', - 'shell:ThriftTestServerES6', - 'shell:ThriftTestServerES6_TLS', - 'wait', - 'qunit:ThriftDeepConstructor', - 'qunit:ThriftJS', - 'qunit:ThriftJS_TLS', - 'qunit:ThriftJS_DoubleRendering', - 'qunit:ThriftWS', - 'qunit:ThriftJSJQ', - 'qunit:ThriftJSJQ_TLS', - 'qunit:ThriftWSES6', - 'qunit:ThriftJS_Int64', - 'shell:ThriftTestServer:kill', - 'shell:ThriftTestServer_TLS:kill', - 'shell:ThriftTestServerES6:kill', - 'shell:ThriftTestServerES6_TLS:kill', + grunt.registerTask("test", [ + "installAndGenerate", + "jshint", + "shell:ThriftTestServer", + "shell:ThriftTestServer_TLS", + "shell:ThriftTestServerES6", + "shell:ThriftTestServerES6_TLS", + "wait", + "qunit:ThriftDeepConstructor", + "qunit:ThriftJS", + "qunit:ThriftJS_TLS", + "qunit:ThriftJS_DoubleRendering", + "qunit:ThriftWS", + "qunit:ThriftJSJQ", + "qunit:ThriftJSJQ_TLS", + "qunit:ThriftWSES6", + "qunit:ThriftJS_Int64", + "shell:ThriftTestServer:kill", + "shell:ThriftTestServer_TLS:kill", + "shell:ThriftTestServerES6:kill", + "shell:ThriftTestServerES6_TLS:kill", ]); - grunt.registerTask('default', ['test', 'concat', 'uglify', 'jsdoc']); + grunt.registerTask("default", ["test", "concat", "uglify", "jsdoc"]); }; diff --git a/lib/nodejs/examples/client.js b/lib/nodejs/examples/client.js index c83b342349f..29dac26b98f 100644 --- a/lib/nodejs/examples/client.js +++ b/lib/nodejs/examples/client.js @@ -16,28 +16,30 @@ * specific language governing permissions and limitations * under the License. */ -var thrift = require('thrift'); +var thrift = require("thrift"); -var UserStorage = require('./gen-nodejs/UserStorage.js'), - ttypes = require('./gen-nodejs/user_types'); +var UserStorage = require("./gen-nodejs/UserStorage.js"), + ttypes = require("./gen-nodejs/user_types"); -var connection = thrift.createConnection('localhost', 9090), - client = thrift.createClient(UserStorage, connection); +var connection = thrift.createConnection("localhost", 9090), + client = thrift.createClient(UserStorage, connection); -var user = new ttypes.UserProfile({uid: 1, - name: "Mark Slee", - blurb: "I'll find something to put here."}); +var user = new ttypes.UserProfile({ + uid: 1, + name: "Mark Slee", + blurb: "I'll find something to put here.", +}); -connection.on('error', function(err) { +connection.on("error", function (err) { console.error(err); }); -client.store(user, function(err, response) { +client.store(user, function (err, response) { if (err) { console.error(err); } else { console.log("client stored:", user.uid); - client.retrieve(user.uid, function(err, responseUser) { + client.retrieve(user.uid, function (err, responseUser) { if (err) { console.error(err); } else { diff --git a/lib/nodejs/examples/client_multitransport.js b/lib/nodejs/examples/client_multitransport.js index 1e37de32f4f..05e5c315d22 100644 --- a/lib/nodejs/examples/client_multitransport.js +++ b/lib/nodejs/examples/client_multitransport.js @@ -16,43 +16,61 @@ * specific language governing permissions and limitations * under the License. */ -var thrift = require('thrift'), - ttransport = require('thrift/transport'); +var thrift = require("thrift"), + ttransport = require("thrift/transport"); -var UserStorage = require('./gen-nodejs/UserStorage'), - ttypes = require('./gen-nodejs/user_types'); +var UserStorage = require("./gen-nodejs/UserStorage"), + ttypes = require("./gen-nodejs/user_types"); -var f_conn = thrift.createConnection('localhost', 9090), // default: framed - f_client = thrift.createClient(UserStorage, f_conn); -var b_conn = thrift.createConnection('localhost', 9091, {transport: ttransport.TBufferedTransport}), - b_client = thrift.createClient(UserStorage, b_conn); -var user1 = new ttypes.UserProfile({uid: 1, - name: "Mark Slee", - blurb: "I'll find something to put here."}); -var user2 = new ttypes.UserProfile({uid: 2, - name: "Satoshi Tagomori", - blurb: "ok, let's test with buffered transport."}); +var f_conn = thrift.createConnection("localhost", 9090), // default: framed + f_client = thrift.createClient(UserStorage, f_conn); +var b_conn = thrift.createConnection("localhost", 9091, { + transport: ttransport.TBufferedTransport, + }), + b_client = thrift.createClient(UserStorage, b_conn); +var user1 = new ttypes.UserProfile({ + uid: 1, + name: "Mark Slee", + blurb: "I'll find something to put here.", +}); +var user2 = new ttypes.UserProfile({ + uid: 2, + name: "Satoshi Tagomori", + blurb: "ok, let's test with buffered transport.", +}); -f_conn.on('error', function(err) { +f_conn.on("error", function (err) { console.error("framed:", err); }); -f_client.store(user1, function(err, response) { - if (err) { console.error(err); return; } +f_client.store(user1, function (err, response) { + if (err) { + console.error(err); + return; + } console.log("stored:", user1.uid, " as ", user1.name); - b_client.retrieve(user1.uid, function(err, responseUser) { - if (err) { console.error(err); return; } + b_client.retrieve(user1.uid, function (err, responseUser) { + if (err) { + console.error(err); + return; + } console.log("retrieved:", responseUser.uid, " as ", responseUser.name); }); }); -b_client.store(user2, function(err, response) { - if (err) { console.error(err); return; } +b_client.store(user2, function (err, response) { + if (err) { + console.error(err); + return; + } console.log("stored:", user2.uid, " as ", user2.name); - f_client.retrieve(user2.uid, function(err, responseUser) { - if (err) { console.error(err); return; } + f_client.retrieve(user2.uid, function (err, responseUser) { + if (err) { + console.error(err); + return; + } console.log("retrieved:", responseUser.uid, " as ", responseUser.name); }); }); diff --git a/lib/nodejs/examples/hello.js b/lib/nodejs/examples/hello.js index 8b7c4e4ea00..5f1b6822519 100644 --- a/lib/nodejs/examples/hello.js +++ b/lib/nodejs/examples/hello.js @@ -16,46 +16,46 @@ * specific language governing permissions and limitations * under the License. */ -var thrift = require('thrift'); -var HelloSvc = require('./gen-nodejs/HelloSvc.js'); -var TimesTwoSvc = require('./gen-nodejs/TimesTwo.js'); +var thrift = require("thrift"); +var HelloSvc = require("./gen-nodejs/HelloSvc.js"); +var TimesTwoSvc = require("./gen-nodejs/TimesTwo.js"); var helloHandler = { - hello_func: function(result) { - this.call_counter = this.call_counter || 0; - console.log("Client call: " + (++this.call_counter)); - result(null, "Hello Apache Thrift for JavaScript " + this.call_counter); - } -} + hello_func: function (result) { + this.call_counter = this.call_counter || 0; + console.log("Client call: " + ++this.call_counter); + result(null, "Hello Apache Thrift for JavaScript " + this.call_counter); + }, +}; var timesTwoHandler = { - dbl: function(val, result) { - console.log("Client call: " + val); - result(null, val * 2); - } -} + dbl: function (val, result) { + console.log("Client call: " + val); + result(null, val * 2); + }, +}; var helloService = { - transport: thrift.TBufferedTransport, - protocol: thrift.TJSONProtocol, - processor: HelloSvc, - handler: helloHandler + transport: thrift.TBufferedTransport, + protocol: thrift.TJSONProtocol, + processor: HelloSvc, + handler: helloHandler, }; var dblService = { - transport: thrift.TBufferedTransport, - protocol: thrift.TJSONProtocol, - processor: TimesTwoSvc, - handler: timesTwoHandler + transport: thrift.TBufferedTransport, + protocol: thrift.TJSONProtocol, + processor: TimesTwoSvc, + handler: timesTwoHandler, }; var ServerOptions = { - files: ".", - services: { - "/hello": helloService, - "/dbl": dblService, - } -} + files: ".", + services: { + "/hello": helloService, + "/dbl": dblService, + }, +}; var server = thrift.createWebServer(ServerOptions); var port = 8585; diff --git a/lib/nodejs/examples/httpClient.js b/lib/nodejs/examples/httpClient.js index 19cc0c36278..155b5f48915 100644 --- a/lib/nodejs/examples/httpClient.js +++ b/lib/nodejs/examples/httpClient.js @@ -1,23 +1,21 @@ -var thrift = require('thrift'); -var helloSvc = require('./gen-nodejs/HelloSvc.js'); +var thrift = require("thrift"); +var helloSvc = require("./gen-nodejs/HelloSvc.js"); var options = { - transport: thrift.TBufferedTransport, - protocol: thrift.TJSONProtocol, - path: "/hello", - headers: {"Connection": "close"}, - https: false + transport: thrift.TBufferedTransport, + protocol: thrift.TJSONProtocol, + path: "/hello", + headers: { Connection: "close" }, + https: false, }; var connection = thrift.createHttpConnection("localhost", 9090, options); var client = thrift.createHttpClient(helloSvc, connection); -connection.on("error", function(err) { - console.log("Error: " + err); +connection.on("error", function (err) { + console.log("Error: " + err); }); -client.hello_func(function(error, result) { - console.log("Msg from server: " + result); +client.hello_func(function (error, result) { + console.log("Msg from server: " + result); }); - - diff --git a/lib/nodejs/examples/httpServer.js b/lib/nodejs/examples/httpServer.js index acae1369a2f..c4cbc9f8961 100644 --- a/lib/nodejs/examples/httpServer.js +++ b/lib/nodejs/examples/httpServer.js @@ -1,31 +1,30 @@ -var thrift = require('thrift'); -var helloSvc = require('./gen-nodejs/HelloSvc'); +var thrift = require("thrift"); +var helloSvc = require("./gen-nodejs/HelloSvc"); -//ServiceHandler: Implement the hello service +//ServiceHandler: Implement the hello service var helloHandler = { hello_func: function (result) { console.log("Received Hello call"); result(null, "Hello from Node.js"); - } + }, }; //ServiceOptions: The I/O stack for the service -var helloSvcOpt = { - handler: helloHandler, - processor: helloSvc, - protocol: thrift.TJSONProtocol, - transport: thrift.TBufferedTransport -}; +var helloSvcOpt = { + handler: helloHandler, + processor: helloSvc, + protocol: thrift.TJSONProtocol, + transport: thrift.TBufferedTransport, +}; //ServerOptions: Define server features -var serverOpt = { - services: { - "/hello": helloSvcOpt - } -} +var serverOpt = { + services: { + "/hello": helloSvcOpt, + }, +}; -//Create and start the web server -var port = 9090; -thrift.createWebServer(serverOpt).listen(port); +//Create and start the web server +var port = 9090; +thrift.createWebServer(serverOpt).listen(port); console.log("Http/Thrift Server running on port: " + port); - diff --git a/lib/nodejs/examples/parse.js b/lib/nodejs/examples/parse.js index 168a1aeeace..8513e4c2f02 100644 --- a/lib/nodejs/examples/parse.js +++ b/lib/nodejs/examples/parse.js @@ -35,11 +35,11 @@ */ function parseThrift(thriftEncodedData, callback) { - var thrift = require('thrift'); + var thrift = require("thrift"); var transport = new thrift.TFramedTransport(thriftEncodedData); - var protocol = new thrift.TBinaryProtocol(transport); + var protocol = new thrift.TBinaryProtocol(transport); - var clientClass = require('../gen-nodejs/GENERATED').YOUR_CLASS_NAME; + var clientClass = require("../gen-nodejs/GENERATED").YOUR_CLASS_NAME; var client = new clientClass(); client.read(protocol); callback(null, client); diff --git a/lib/nodejs/examples/server.js b/lib/nodejs/examples/server.js index 1c482fe71f7..41492cbe471 100644 --- a/lib/nodejs/examples/server.js +++ b/lib/nodejs/examples/server.js @@ -16,21 +16,21 @@ * specific language governing permissions and limitations * under the License. */ -var thrift = require('thrift'); +var thrift = require("thrift"); -var UserStorage = require('./gen-nodejs/UserStorage.js'), - ttypes = require('./gen-nodejs/user_types'); +var UserStorage = require("./gen-nodejs/UserStorage.js"), + ttypes = require("./gen-nodejs/user_types"); var users = {}; var server = thrift.createServer(UserStorage, { - store: function(user, result) { + store: function (user, result) { console.log("server stored:", user.uid); users[user.uid] = user; result(null); }, - retrieve: function(uid, result) { + retrieve: function (uid, result) { console.log("server retrieved:", uid); result(null, users[uid]); }, diff --git a/lib/nodejs/examples/server_http.js b/lib/nodejs/examples/server_http.js index ef2dc83a295..235f6754885 100644 --- a/lib/nodejs/examples/server_http.js +++ b/lib/nodejs/examples/server_http.js @@ -16,38 +16,46 @@ * specific language governing permissions and limitations * under the License. */ -var connect = require('connect'); -var thrift = require('thrift'); +var connect = require("connect"); +var thrift = require("thrift"); -var UserStorage = require('./gen-nodejs/UserStorage'), - ttypes = require('./gen-nodejs/user_types'); +var UserStorage = require("./gen-nodejs/UserStorage"), + ttypes = require("./gen-nodejs/user_types"); var users = {}; -var store = function(user, result) { +var store = function (user, result) { console.log("stored:", user.uid); users[user.uid] = user; result(null); }; -var retrieve = function(uid, result) { +var retrieve = function (uid, result) { console.log("retrieved:", uid); result(null, users[uid]); }; var server_http = thrift.createHttpServer(UserStorage, { store: store, - retrieve: retrieve + retrieve: retrieve, }); server_http.listen(9090); -var server_connect = connect(thrift.httpMiddleware(UserStorage, { - store: store, - retrieve: retrieve -})); +var server_connect = connect( + thrift.httpMiddleware(UserStorage, { + store: store, + retrieve: retrieve, + }), +); server_http.listen(9091); -var server_connect_json = connect(thrift.httpMiddleware(UserStorage, { - store: store, - retrieve: retrieve -}, {protocol: thrift.TJSONProtocol})); +var server_connect_json = connect( + thrift.httpMiddleware( + UserStorage, + { + store: store, + retrieve: retrieve, + }, + { protocol: thrift.TJSONProtocol }, + ), +); server_connect_json.listen(9092); diff --git a/lib/nodejs/examples/server_multitransport.js b/lib/nodejs/examples/server_multitransport.js index a348e684798..3dc0b17113c 100644 --- a/lib/nodejs/examples/server_multitransport.js +++ b/lib/nodejs/examples/server_multitransport.js @@ -16,31 +16,35 @@ * specific language governing permissions and limitations * under the License. */ -var thrift = require('thrift'), - ttransport = require('thrift/transport'); +var thrift = require("thrift"), + ttransport = require("thrift/transport"); -var UserStorage = require('./gen-nodejs/UserStorage'), - ttypes = require('./gen-nodejs/user_types'); +var UserStorage = require("./gen-nodejs/UserStorage"), + ttypes = require("./gen-nodejs/user_types"); var users = {}; -var store = function(user, result) { +var store = function (user, result) { console.log("stored:", user.uid); users[user.uid] = user; result(null); }; -var retrieve = function(uid, result) { +var retrieve = function (uid, result) { console.log("retrieved:", uid); result(null, users[uid]); }; var server_framed = thrift.createServer(UserStorage, { store: store, - retrieve: retrieve + retrieve: retrieve, }); server_framed.listen(9090); -var server_buffered = thrift.createServer(UserStorage, { - store: store, - retrieve: retrieve -}, {transport: ttransport.TBufferedTransport}); +var server_buffered = thrift.createServer( + UserStorage, + { + store: store, + retrieve: retrieve, + }, + { transport: ttransport.TBufferedTransport }, +); server_buffered.listen(9091); diff --git a/lib/nodejs/lib/thrift/binary.js b/lib/nodejs/lib/thrift/binary.js index 9813ffdb146..e8bbee76f23 100644 --- a/lib/nodejs/lib/thrift/binary.js +++ b/lib/nodejs/lib/thrift/binary.js @@ -26,11 +26,11 @@ var POW_48 = Math.pow(2, 48); var POW_52 = Math.pow(2, 52); var POW_1022 = Math.pow(2, 1022); -exports.readByte = function(b){ - return b > 127 ? b-256 : b; +exports.readByte = function (b) { + return b > 127 ? b - 256 : b; }; -exports.readI16 = function(buff, off) { +exports.readI16 = function (buff, off) { off = off || 0; var v = buff[off + 1]; v += buff[off] << 8; @@ -40,7 +40,7 @@ exports.readI16 = function(buff, off) { return v; }; -exports.readI32 = function(buff, off) { +exports.readI32 = function (buff, off) { off = off || 0; var v = buff[off + 3]; v += buff[off + 2] << 8; @@ -52,14 +52,14 @@ exports.readI32 = function(buff, off) { return v; }; -exports.writeI16 = function(buff, v) { +exports.writeI16 = function (buff, v) { buff[1] = v & 0xff; v >>= 8; buff[0] = v & 0xff; return buff; }; -exports.writeI32 = function(buff, v) { +exports.writeI32 = function (buff, v) { buff[3] = v & 0xff; v >>= 8; buff[2] = v & 0xff; @@ -70,26 +70,26 @@ exports.writeI32 = function(buff, v) { return buff; }; -exports.readDouble = function(buff, off) { +exports.readDouble = function (buff, off) { off = off || 0; var signed = buff[off] & 0x80; - var e = (buff[off+1] & 0xF0) >> 4; - e += (buff[off] & 0x7F) << 4; + var e = (buff[off + 1] & 0xf0) >> 4; + e += (buff[off] & 0x7f) << 4; - var m = buff[off+7]; - m += buff[off+6] << 8; - m += buff[off+5] << 16; - m += buff[off+4] * POW_24; - m += buff[off+3] * POW_32; - m += buff[off+2] * POW_40; - m += (buff[off+1] & 0x0F) * POW_48; + var m = buff[off + 7]; + m += buff[off + 6] << 8; + m += buff[off + 5] << 16; + m += buff[off + 4] * POW_24; + m += buff[off + 3] * POW_32; + m += buff[off + 2] * POW_40; + m += (buff[off + 1] & 0x0f) * POW_48; switch (e) { case 0: e = -1022; break; case 2047: - return m ? NaN : (signed ? -Infinity : Infinity); + return m ? NaN : signed ? -Infinity : Infinity; default: m += POW_52; e -= 1023; @@ -106,10 +106,10 @@ exports.readDouble = function(buff, off) { * Based on code from the jspack module: * http://code.google.com/p/jspack/ */ -exports.writeDouble = function(buff, v) { +exports.writeDouble = function (buff, v) { var m, e, c; - buff[0] = (v < 0 ? 0x80 : 0x00); + buff[0] = v < 0 ? 0x80 : 0x00; v = Math.abs(v); if (v !== v) { @@ -127,22 +127,17 @@ exports.writeDouble = function(buff, v) { c *= 2; } - if (e + 1023 >= 2047) - { + if (e + 1023 >= 2047) { // Overflow m = 0; e = 2047; - } - else if (e + 1023 >= 1) - { + } else if (e + 1023 >= 1) { // Normalized - term order matters, as Math.pow(2, 52-e) and v*Math.pow(2, 52) can overflow - m = (v*c-1) * POW_52; + m = (v * c - 1) * POW_52; e += 1023; - } - else - { + } else { // Denormalized - also catches the '0' case, somewhat by chance - m = (v * POW_1022) * POW_52; + m = v * POW_1022 * POW_52; e = 0; } } diff --git a/lib/nodejs/lib/thrift/binary_protocol.js b/lib/nodejs/lib/thrift/binary_protocol.js index af8836cf52c..fc4df4ae95e 100644 --- a/lib/nodejs/lib/thrift/binary_protocol.js +++ b/lib/nodejs/lib/thrift/binary_protocol.js @@ -17,10 +17,10 @@ * under the License. */ -var log = require('./log'); -var binary = require('./binary'); -var Int64 = require('node-int64'); -var Thrift = require('./thrift'); +var log = require("./log"); +var binary = require("./binary"); +var Int64 = require("node-int64"); +var Thrift = require("./thrift"); var Type = Thrift.Type; module.exports = TBinaryProtocol; @@ -29,96 +29,90 @@ module.exports = TBinaryProtocol; // The largest integer value which can be represented in JavaScript is +/-2^53. // Bitwise operations convert numbers to 32 bit integers but perform sign extension // upon assigning values back to variables. -var VERSION_MASK = -65536, // 0xffff0000 - VERSION_1 = -2147418112, // 0x80010000 - TYPE_MASK = 0x000000ff; +var VERSION_MASK = -65536, // 0xffff0000 + VERSION_1 = -2147418112, // 0x80010000 + TYPE_MASK = 0x000000ff; TBinaryProtocol.VERSION_MASK = VERSION_MASK; TBinaryProtocol.VERSION_1 = VERSION_1; -TBinaryProtocol.TYPE_MASK = TYPE_MASK +TBinaryProtocol.TYPE_MASK = TYPE_MASK; function TBinaryProtocol(trans, strictRead, strictWrite) { this.trans = trans; - this.strictRead = (strictRead !== undefined ? strictRead : false); - this.strictWrite = (strictWrite !== undefined ? strictWrite : true); + this.strictRead = strictRead !== undefined ? strictRead : false; + this.strictWrite = strictWrite !== undefined ? strictWrite : true; this._seqid = null; -}; +} -TBinaryProtocol.prototype.flush = function() { +TBinaryProtocol.prototype.flush = function () { return this.trans.flush(); }; -TBinaryProtocol.prototype.writeMessageBegin = function(name, type, seqid) { - if (this.strictWrite) { - this.writeI32(VERSION_1 | type); - this.writeString(name); - this.writeI32(seqid); - } else { - this.writeString(name); - this.writeByte(type); - this.writeI32(seqid); - } - // Record client seqid to find callback again - if (this._seqid !== null) { - log.warning('SeqId already set', { 'name': name }); - } else { - this._seqid = seqid; - this.trans.setCurrSeqId(seqid); - } +TBinaryProtocol.prototype.writeMessageBegin = function (name, type, seqid) { + if (this.strictWrite) { + this.writeI32(VERSION_1 | type); + this.writeString(name); + this.writeI32(seqid); + } else { + this.writeString(name); + this.writeByte(type); + this.writeI32(seqid); + } + // Record client seqid to find callback again + if (this._seqid !== null) { + log.warning("SeqId already set", { name: name }); + } else { + this._seqid = seqid; + this.trans.setCurrSeqId(seqid); + } }; -TBinaryProtocol.prototype.writeMessageEnd = function() { - if (this._seqid !== null) { - this._seqid = null; - } else { - log.warning('No seqid to unset'); - } +TBinaryProtocol.prototype.writeMessageEnd = function () { + if (this._seqid !== null) { + this._seqid = null; + } else { + log.warning("No seqid to unset"); + } }; -TBinaryProtocol.prototype.writeStructBegin = function(name) { -}; +TBinaryProtocol.prototype.writeStructBegin = function (name) {}; -TBinaryProtocol.prototype.writeStructEnd = function() { -}; +TBinaryProtocol.prototype.writeStructEnd = function () {}; -TBinaryProtocol.prototype.writeFieldBegin = function(name, type, id) { +TBinaryProtocol.prototype.writeFieldBegin = function (name, type, id) { this.writeByte(type); this.writeI16(id); }; -TBinaryProtocol.prototype.writeFieldEnd = function() { -}; +TBinaryProtocol.prototype.writeFieldEnd = function () {}; -TBinaryProtocol.prototype.writeFieldStop = function() { +TBinaryProtocol.prototype.writeFieldStop = function () { this.writeByte(Type.STOP); }; -TBinaryProtocol.prototype.writeMapBegin = function(ktype, vtype, size) { +TBinaryProtocol.prototype.writeMapBegin = function (ktype, vtype, size) { this.writeByte(ktype); this.writeByte(vtype); this.writeI32(size); }; -TBinaryProtocol.prototype.writeMapEnd = function() { -}; +TBinaryProtocol.prototype.writeMapEnd = function () {}; -TBinaryProtocol.prototype.writeListBegin = function(etype, size) { +TBinaryProtocol.prototype.writeListBegin = function (etype, size) { this.writeByte(etype); this.writeI32(size); }; -TBinaryProtocol.prototype.writeListEnd = function() { -}; +TBinaryProtocol.prototype.writeListEnd = function () {}; -TBinaryProtocol.prototype.writeSetBegin = function(etype, size) { +TBinaryProtocol.prototype.writeSetBegin = function (etype, size) { this.writeByte(etype); this.writeI32(size); }; -TBinaryProtocol.prototype.writeSetEnd = function() { -}; +TBinaryProtocol.prototype.writeSetEnd = function () {}; -TBinaryProtocol.prototype.writeBool = function(bool) { +TBinaryProtocol.prototype.writeBool = function (bool) { if (bool) { this.writeByte(1); } else { @@ -126,19 +120,19 @@ TBinaryProtocol.prototype.writeBool = function(bool) { } }; -TBinaryProtocol.prototype.writeByte = function(b) { +TBinaryProtocol.prototype.writeByte = function (b) { this.trans.write(new Buffer([b])); }; -TBinaryProtocol.prototype.writeI16 = function(i16) { +TBinaryProtocol.prototype.writeI16 = function (i16) { this.trans.write(binary.writeI16(new Buffer(2), i16)); }; -TBinaryProtocol.prototype.writeI32 = function(i32) { +TBinaryProtocol.prototype.writeI32 = function (i32) { this.trans.write(binary.writeI32(new Buffer(4), i32)); }; -TBinaryProtocol.prototype.writeI64 = function(i64) { +TBinaryProtocol.prototype.writeI64 = function (i64) { if (i64.buffer) { this.trans.write(i64.buffer); } else { @@ -146,108 +140,110 @@ TBinaryProtocol.prototype.writeI64 = function(i64) { } }; -TBinaryProtocol.prototype.writeDouble = function(dub) { +TBinaryProtocol.prototype.writeDouble = function (dub) { this.trans.write(binary.writeDouble(new Buffer(8), dub)); }; -TBinaryProtocol.prototype.writeStringOrBinary = function(name, encoding, arg) { - if (typeof(arg) === 'string') { +TBinaryProtocol.prototype.writeStringOrBinary = function (name, encoding, arg) { + if (typeof arg === "string") { this.writeI32(Buffer.byteLength(arg, encoding)); this.trans.write(new Buffer(arg, encoding)); - } else if ((arg instanceof Buffer) || - (Object.prototype.toString.call(arg) == '[object Uint8Array]')) { + } else if ( + arg instanceof Buffer || + Object.prototype.toString.call(arg) == "[object Uint8Array]" + ) { // Buffers in Node.js under Browserify may extend UInt8Array instead of // defining a new object. We detect them here so we can write them // correctly this.writeI32(arg.length); this.trans.write(arg); } else { - throw new Error(name + ' called without a string/Buffer argument: ' + arg); + throw new Error(name + " called without a string/Buffer argument: " + arg); } }; -TBinaryProtocol.prototype.writeString = function(arg) { - this.writeStringOrBinary('writeString', 'utf8', arg); +TBinaryProtocol.prototype.writeString = function (arg) { + this.writeStringOrBinary("writeString", "utf8", arg); }; -TBinaryProtocol.prototype.writeBinary = function(arg) { - this.writeStringOrBinary('writeBinary', 'binary', arg); +TBinaryProtocol.prototype.writeBinary = function (arg) { + this.writeStringOrBinary("writeBinary", "binary", arg); }; -TBinaryProtocol.prototype.readMessageBegin = function() { +TBinaryProtocol.prototype.readMessageBegin = function () { var sz = this.readI32(); var type, name, seqid; if (sz < 0) { var version = sz & VERSION_MASK; if (version != VERSION_1) { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.BAD_VERSION, "Bad version in readMessageBegin: " + sz); + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.BAD_VERSION, + "Bad version in readMessageBegin: " + sz, + ); } type = sz & TYPE_MASK; name = this.readString(); seqid = this.readI32(); } else { if (this.strictRead) { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.BAD_VERSION, "No protocol version header"); + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.BAD_VERSION, + "No protocol version header", + ); } name = this.trans.read(sz); type = this.readByte(); seqid = this.readI32(); } - return {fname: name, mtype: type, rseqid: seqid}; + return { fname: name, mtype: type, rseqid: seqid }; }; -TBinaryProtocol.prototype.readMessageEnd = function() { -}; +TBinaryProtocol.prototype.readMessageEnd = function () {}; -TBinaryProtocol.prototype.readStructBegin = function() { - return {fname: ''}; +TBinaryProtocol.prototype.readStructBegin = function () { + return { fname: "" }; }; -TBinaryProtocol.prototype.readStructEnd = function() { -}; +TBinaryProtocol.prototype.readStructEnd = function () {}; -TBinaryProtocol.prototype.readFieldBegin = function() { +TBinaryProtocol.prototype.readFieldBegin = function () { var type = this.readByte(); if (type == Type.STOP) { - return {fname: null, ftype: type, fid: 0}; + return { fname: null, ftype: type, fid: 0 }; } var id = this.readI16(); - return {fname: null, ftype: type, fid: id}; + return { fname: null, ftype: type, fid: id }; }; -TBinaryProtocol.prototype.readFieldEnd = function() { -}; +TBinaryProtocol.prototype.readFieldEnd = function () {}; -TBinaryProtocol.prototype.readMapBegin = function() { +TBinaryProtocol.prototype.readMapBegin = function () { var ktype = this.readByte(); var vtype = this.readByte(); var size = this.readI32(); - return {ktype: ktype, vtype: vtype, size: size}; + return { ktype: ktype, vtype: vtype, size: size }; }; -TBinaryProtocol.prototype.readMapEnd = function() { -}; +TBinaryProtocol.prototype.readMapEnd = function () {}; -TBinaryProtocol.prototype.readListBegin = function() { +TBinaryProtocol.prototype.readListBegin = function () { var etype = this.readByte(); var size = this.readI32(); - return {etype: etype, size: size}; + return { etype: etype, size: size }; }; -TBinaryProtocol.prototype.readListEnd = function() { -}; +TBinaryProtocol.prototype.readListEnd = function () {}; -TBinaryProtocol.prototype.readSetBegin = function() { +TBinaryProtocol.prototype.readSetBegin = function () { var etype = this.readByte(); var size = this.readI32(); - return {etype: etype, size: size}; + return { etype: etype, size: size }; }; -TBinaryProtocol.prototype.readSetEnd = function() { -}; +TBinaryProtocol.prototype.readSetEnd = function () {}; -TBinaryProtocol.prototype.readBool = function() { +TBinaryProtocol.prototype.readBool = function () { var b = this.readByte(); if (b === 0) { return false; @@ -255,56 +251,62 @@ TBinaryProtocol.prototype.readBool = function() { return true; }; -TBinaryProtocol.prototype.readByte = function() { +TBinaryProtocol.prototype.readByte = function () { return this.trans.readByte(); }; -TBinaryProtocol.prototype.readI16 = function() { +TBinaryProtocol.prototype.readI16 = function () { return this.trans.readI16(); }; -TBinaryProtocol.prototype.readI32 = function() { +TBinaryProtocol.prototype.readI32 = function () { return this.trans.readI32(); }; -TBinaryProtocol.prototype.readI64 = function() { +TBinaryProtocol.prototype.readI64 = function () { var buff = this.trans.read(8); return new Int64(buff); }; -TBinaryProtocol.prototype.readDouble = function() { +TBinaryProtocol.prototype.readDouble = function () { return this.trans.readDouble(); }; -TBinaryProtocol.prototype.readBinary = function() { +TBinaryProtocol.prototype.readBinary = function () { var len = this.readI32(); if (len === 0) { return new Buffer(0); } if (len < 0) { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.NEGATIVE_SIZE, "Negative binary size"); + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.NEGATIVE_SIZE, + "Negative binary size", + ); } return this.trans.read(len); }; -TBinaryProtocol.prototype.readString = function() { +TBinaryProtocol.prototype.readString = function () { var len = this.readI32(); if (len === 0) { return ""; } if (len < 0) { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.NEGATIVE_SIZE, "Negative string size"); + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.NEGATIVE_SIZE, + "Negative string size", + ); } return this.trans.readString(len); }; -TBinaryProtocol.prototype.getTransport = function() { +TBinaryProtocol.prototype.getTransport = function () { return this.trans; }; -TBinaryProtocol.prototype.skip = function(type) { +TBinaryProtocol.prototype.skip = function (type) { switch (type) { case Type.BOOL: this.readBool(); @@ -362,6 +364,6 @@ TBinaryProtocol.prototype.skip = function(type) { this.readListEnd(); break; default: - throw new Error("Invalid type: " + type); + throw new Error("Invalid type: " + type); } }; diff --git a/lib/nodejs/lib/thrift/browser.js b/lib/nodejs/lib/thrift/browser.js index 5915cf605c6..5c843d07137 100644 --- a/lib/nodejs/lib/thrift/browser.js +++ b/lib/nodejs/lib/thrift/browser.js @@ -16,42 +16,42 @@ * specific language governing permissions and limitations * under the License. */ -exports.Thrift = require('./thrift'); +exports.Thrift = require("./thrift"); -var wsConnection = require('./ws_connection'); +var wsConnection = require("./ws_connection"); exports.WSConnection = wsConnection.WSConnection; exports.createWSConnection = wsConnection.createWSConnection; exports.createWSClient = wsConnection.createWSClient; -var xhrConnection = require('./xhr_connection'); +var xhrConnection = require("./xhr_connection"); exports.XHRConnection = xhrConnection.XHRConnection; exports.createXHRConnection = xhrConnection.createXHRConnection; exports.createXHRClient = xhrConnection.createXHRClient; -var ohosConnection = require('./ohos_connection'); +var ohosConnection = require("./ohos_connection"); exports.OhosConnection = ohosConnection.OhosConnection; exports.createOhosConnection = ohosConnection.createOhosConnection; exports.createOhosClient = ohosConnection.createOhosClient; -exports.createClient = require('./create_client'); +exports.createClient = require("./create_client"); -exports.Int64 = require('node-int64'); -exports.Q = require('q'); +exports.Int64 = require("node-int64"); +exports.Q = require("q"); -var mpxProtocol = require('./multiplexed_protocol'); +var mpxProtocol = require("./multiplexed_protocol"); exports.Multiplexer = mpxProtocol.Multiplexer; /* * Export transport and protocol so they can be used outside of a * cassandra/server context */ -exports.TBufferedTransport = require('./buffered_transport'); -exports.TFramedTransport = require('./framed_transport'); -exports.TWebSocketTransport = require('./ws_transport'); +exports.TBufferedTransport = require("./buffered_transport"); +exports.TFramedTransport = require("./framed_transport"); +exports.TWebSocketTransport = require("./ws_transport"); -exports.Protocol = require('./json_protocol'); -exports.TJSONProtocol = require('./json_protocol'); -exports.TBinaryProtocol = require('./binary_protocol'); -exports.TCompactProtocol = require('./compact_protocol'); +exports.Protocol = require("./json_protocol"); +exports.TJSONProtocol = require("./json_protocol"); +exports.TBinaryProtocol = require("./binary_protocol"); +exports.TCompactProtocol = require("./compact_protocol"); -exports.InputBufferUnderrunError = require('./input_buffer_underrun_error'); +exports.InputBufferUnderrunError = require("./input_buffer_underrun_error"); diff --git a/lib/nodejs/lib/thrift/buffered_transport.js b/lib/nodejs/lib/thrift/buffered_transport.js index f0d5d4aa1e4..27d682d8fd0 100644 --- a/lib/nodejs/lib/thrift/buffered_transport.js +++ b/lib/nodejs/lib/thrift/buffered_transport.js @@ -17,9 +17,9 @@ * under the License. */ -var binary = require('./binary'); -var InputBufferUnderrunError = require('./input_buffer_underrun_error'); -var THeaderTransport = require('./header_transport'); +var binary = require("./binary"); +var InputBufferUnderrunError = require("./input_buffer_underrun_error"); +var THeaderTransport = require("./header_transport"); module.exports = TBufferedTransport; @@ -33,22 +33,22 @@ function TBufferedTransport(buffer, callback) { this.outBuffers = []; this.outCount = 0; this.onFlush = callback; -}; +} Object.setPrototypeOf(TBufferedTransport.prototype, THeaderTransport.prototype); -TBufferedTransport.prototype.reset = function() { +TBufferedTransport.prototype.reset = function () { this.inBuf = new Buffer(this.defaultReadBufferSize); this.readCursor = 0; this.writeCursor = 0; this.outBuffers = []; this.outCount = 0; -} +}; -TBufferedTransport.receiver = function(callback, seqid) { +TBufferedTransport.receiver = function (callback, seqid) { var reader = new TBufferedTransport(); - return function(data) { + return function (data) { if (reader.writeCursor + data.length > reader.inBuf.length) { var buf = new Buffer(reader.writeCursor + data.length); reader.inBuf.copy(buf, 0, 0, reader.writeCursor); @@ -61,11 +61,12 @@ TBufferedTransport.receiver = function(callback, seqid) { }; }; - -TBufferedTransport.prototype.commitPosition = function(){ +TBufferedTransport.prototype.commitPosition = function () { var unreadSize = this.writeCursor - this.readCursor; - var bufSize = (unreadSize * 2 > this.defaultReadBufferSize) ? - unreadSize * 2 : this.defaultReadBufferSize; + var bufSize = + unreadSize * 2 > this.defaultReadBufferSize + ? unreadSize * 2 + : this.defaultReadBufferSize; var buf = new Buffer(bufSize); if (unreadSize > 0) { this.inBuf.copy(buf, 0, this.readCursor, this.writeCursor); @@ -75,34 +76,32 @@ TBufferedTransport.prototype.commitPosition = function(){ this.inBuf = buf; }; -TBufferedTransport.prototype.rollbackPosition = function(){ +TBufferedTransport.prototype.rollbackPosition = function () { this.readCursor = 0; -} +}; - // TODO: Implement open/close support -TBufferedTransport.prototype.isOpen = function() { +// TODO: Implement open/close support +TBufferedTransport.prototype.isOpen = function () { return true; }; -TBufferedTransport.prototype.open = function() { -}; +TBufferedTransport.prototype.open = function () {}; -TBufferedTransport.prototype.close = function() { -}; +TBufferedTransport.prototype.close = function () {}; - // Set the seqid of the message in the client - // So that callbacks can be found -TBufferedTransport.prototype.setCurrSeqId = function(seqid) { +// Set the seqid of the message in the client +// So that callbacks can be found +TBufferedTransport.prototype.setCurrSeqId = function (seqid) { this._seqid = seqid; }; -TBufferedTransport.prototype.ensureAvailable = function(len) { +TBufferedTransport.prototype.ensureAvailable = function (len) { if (this.readCursor + len > this.writeCursor) { throw new InputBufferUnderrunError(); } }; -TBufferedTransport.prototype.read = function(len) { +TBufferedTransport.prototype.read = function (len) { this.ensureAvailable(len); var buf = new Buffer(len); this.inBuf.copy(buf, 0, this.readCursor, this.readCursor + len); @@ -110,57 +109,61 @@ TBufferedTransport.prototype.read = function(len) { return buf; }; -TBufferedTransport.prototype.readByte = function() { +TBufferedTransport.prototype.readByte = function () { this.ensureAvailable(1); return binary.readByte(this.inBuf[this.readCursor++]); }; -TBufferedTransport.prototype.readI16 = function() { +TBufferedTransport.prototype.readI16 = function () { this.ensureAvailable(2); var i16 = binary.readI16(this.inBuf, this.readCursor); this.readCursor += 2; return i16; }; -TBufferedTransport.prototype.readI32 = function() { +TBufferedTransport.prototype.readI32 = function () { this.ensureAvailable(4); var i32 = binary.readI32(this.inBuf, this.readCursor); this.readCursor += 4; return i32; }; -TBufferedTransport.prototype.readDouble = function() { +TBufferedTransport.prototype.readDouble = function () { this.ensureAvailable(8); var d = binary.readDouble(this.inBuf, this.readCursor); this.readCursor += 8; return d; }; -TBufferedTransport.prototype.readString = function(len) { +TBufferedTransport.prototype.readString = function (len) { this.ensureAvailable(len); - var str = this.inBuf.toString('utf8', this.readCursor, this.readCursor + len); + var str = this.inBuf.toString("utf8", this.readCursor, this.readCursor + len); this.readCursor += len; return str; }; -TBufferedTransport.prototype.borrow = function() { - var obj = {buf: this.inBuf, readIndex: this.readCursor, writeIndex: this.writeCursor}; +TBufferedTransport.prototype.borrow = function () { + var obj = { + buf: this.inBuf, + readIndex: this.readCursor, + writeIndex: this.writeCursor, + }; return obj; }; -TBufferedTransport.prototype.consume = function(bytesConsumed) { +TBufferedTransport.prototype.consume = function (bytesConsumed) { this.readCursor += bytesConsumed; }; -TBufferedTransport.prototype.write = function(buf) { - if (typeof(buf) === "string") { - buf = new Buffer(buf, 'utf8'); +TBufferedTransport.prototype.write = function (buf) { + if (typeof buf === "string") { + buf = new Buffer(buf, "utf8"); } this.outBuffers.push(buf); this.outCount += buf.length; }; -TBufferedTransport.prototype.flush = function() { +TBufferedTransport.prototype.flush = function () { // If the seqid of the callback is available pass it to the onFlush // Then remove the current seqid var seqid = this._seqid; @@ -171,8 +174,8 @@ TBufferedTransport.prototype.flush = function() { } var msg = new Buffer(this.outCount), - pos = 0; - this.outBuffers.forEach(function(buf) { + pos = 0; + this.outBuffers.forEach(function (buf) { buf.copy(msg, pos, 0); pos += buf.length; }); @@ -184,4 +187,4 @@ TBufferedTransport.prototype.flush = function() { this.outBuffers = []; this.outCount = 0; -} +}; diff --git a/lib/nodejs/lib/thrift/compact_protocol.js b/lib/nodejs/lib/thrift/compact_protocol.js index 302a88d4d84..e946dc886c0 100644 --- a/lib/nodejs/lib/thrift/compact_protocol.js +++ b/lib/nodejs/lib/thrift/compact_protocol.js @@ -17,9 +17,9 @@ * under the License. */ -var log = require('./log'); -var Int64 = require('node-int64'); -var Thrift = require('./thrift'); +var log = require("./log"); +var Int64 = require("node-int64"); +var Thrift = require("./thrift"); var Type = Thrift.Type; module.exports = TCompactProtocol; @@ -50,59 +50,58 @@ function TCompactProtocol(trans) { this.container_limit_ = 0; this.booleanField_ = { name: null, - hasBoolValue: false + hasBoolValue: false, }; this.boolValue_ = { hasBoolValue: false, - boolValue: false + boolValue: false, }; -}; - +} // // Compact Protocol Constants // /** - * Compact Protocol ID number. - * @readonly - * @const {number} PROTOCOL_ID - */ -TCompactProtocol.PROTOCOL_ID = -126; //1000 0010 + * Compact Protocol ID number. + * @readonly + * @const {number} PROTOCOL_ID + */ +TCompactProtocol.PROTOCOL_ID = -126; //1000 0010 /** - * Compact Protocol version number. - * @readonly - * @const {number} VERSION_N - */ + * Compact Protocol version number. + * @readonly + * @const {number} VERSION_N + */ TCompactProtocol.VERSION_N = 1; /** - * Compact Protocol version mask for combining protocol version and message type in one byte. - * @readonly - * @const {number} VERSION_MASK - */ + * Compact Protocol version mask for combining protocol version and message type in one byte. + * @readonly + * @const {number} VERSION_MASK + */ TCompactProtocol.VERSION_MASK = 0x1f; //0001 1111 /** - * Compact Protocol message type mask for combining protocol version and message type in one byte. - * @readonly - * @const {number} TYPE_MASK - */ -TCompactProtocol.TYPE_MASK = -32; //1110 0000 + * Compact Protocol message type mask for combining protocol version and message type in one byte. + * @readonly + * @const {number} TYPE_MASK + */ +TCompactProtocol.TYPE_MASK = -32; //1110 0000 /** - * Compact Protocol message type bits for ensuring message type bit size. - * @readonly - * @const {number} TYPE_BITS - */ + * Compact Protocol message type bits for ensuring message type bit size. + * @readonly + * @const {number} TYPE_BITS + */ TCompactProtocol.TYPE_BITS = 7; //0000 0111 /** - * Compact Protocol message type shift amount for combining protocol version and message type in one byte. - * @readonly - * @const {number} TYPE_SHIFT_AMOUNT - */ + * Compact Protocol message type shift amount for combining protocol version and message type in one byte. + * @readonly + * @const {number} TYPE_SHIFT_AMOUNT + */ TCompactProtocol.TYPE_SHIFT_AMOUNT = 5; /** @@ -123,19 +122,19 @@ TCompactProtocol.TYPE_SHIFT_AMOUNT = 5; * @property {number} CT_STRUCT - A multifield type. */ TCompactProtocol.Types = { - CT_STOP: 0x00, - CT_BOOLEAN_TRUE: 0x01, - CT_BOOLEAN_FALSE: 0x02, - CT_BYTE: 0x03, - CT_I16: 0x04, - CT_I32: 0x05, - CT_I64: 0x06, - CT_DOUBLE: 0x07, - CT_BINARY: 0x08, - CT_LIST: 0x09, - CT_SET: 0x0A, - CT_MAP: 0x0B, - CT_STRUCT: 0x0C + CT_STOP: 0x00, + CT_BOOLEAN_TRUE: 0x01, + CT_BOOLEAN_FALSE: 0x02, + CT_BYTE: 0x03, + CT_I16: 0x04, + CT_I32: 0x05, + CT_I64: 0x06, + CT_DOUBLE: 0x07, + CT_BINARY: 0x08, + CT_LIST: 0x09, + CT_SET: 0x0a, + CT_MAP: 0x0b, + CT_STRUCT: 0x0c, }; /** @@ -143,25 +142,24 @@ TCompactProtocol.Types = { * @readonly */ TCompactProtocol.TTypeToCType = [ - TCompactProtocol.Types.CT_STOP, // T_STOP - 0, // unused + TCompactProtocol.Types.CT_STOP, // T_STOP + 0, // unused TCompactProtocol.Types.CT_BOOLEAN_TRUE, // T_BOOL - TCompactProtocol.Types.CT_BYTE, // T_BYTE - TCompactProtocol.Types.CT_DOUBLE, // T_DOUBLE - 0, // unused - TCompactProtocol.Types.CT_I16, // T_I16 - 0, // unused - TCompactProtocol.Types.CT_I32, // T_I32 - 0, // unused - TCompactProtocol.Types.CT_I64, // T_I64 - TCompactProtocol.Types.CT_BINARY, // T_STRING - TCompactProtocol.Types.CT_STRUCT, // T_STRUCT - TCompactProtocol.Types.CT_MAP, // T_MAP - TCompactProtocol.Types.CT_SET, // T_SET - TCompactProtocol.Types.CT_LIST, // T_LIST + TCompactProtocol.Types.CT_BYTE, // T_BYTE + TCompactProtocol.Types.CT_DOUBLE, // T_DOUBLE + 0, // unused + TCompactProtocol.Types.CT_I16, // T_I16 + 0, // unused + TCompactProtocol.Types.CT_I32, // T_I32 + 0, // unused + TCompactProtocol.Types.CT_I64, // T_I64 + TCompactProtocol.Types.CT_BINARY, // T_STRING + TCompactProtocol.Types.CT_STRUCT, // T_STRUCT + TCompactProtocol.Types.CT_MAP, // T_MAP + TCompactProtocol.Types.CT_SET, // T_SET + TCompactProtocol.Types.CT_LIST, // T_LIST ]; - // // Compact Protocol Utilities // @@ -169,7 +167,7 @@ TCompactProtocol.TTypeToCType = [ /** * Returns the underlying transport layer. * @return {object} The underlying transport layer. - */TCompactProtocol.prototype.getTransport = function() { + */ TCompactProtocol.prototype.getTransport = function () { return this.trans; }; @@ -179,7 +177,7 @@ TCompactProtocol.TTypeToCType = [ * @param {number} ttype - Thrift type value * @returns {number} Compact protocol type value */ -TCompactProtocol.prototype.getCompactType = function(ttype) { +TCompactProtocol.prototype.getCompactType = function (ttype) { return TCompactProtocol.TTypeToCType[ttype]; }; @@ -189,7 +187,7 @@ TCompactProtocol.prototype.getCompactType = function(ttype) { * @param {number} type - Compact Protocol type value * @returns {number} Thrift Type value */ -TCompactProtocol.prototype.getTType = function(type) { +TCompactProtocol.prototype.getTType = function (type) { switch (type) { case Type.STOP: return Type.STOP; @@ -217,12 +215,14 @@ TCompactProtocol.prototype.getTType = function(type) { case TCompactProtocol.Types.CT_STRUCT: return Type.STRUCT; default: - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.INVALID_DATA, "Unknown type: " + type); + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.INVALID_DATA, + "Unknown type: " + type, + ); } return Type.STOP; }; - // // Compact Protocol write operations // @@ -230,7 +230,7 @@ TCompactProtocol.prototype.getTType = function(type) { /** * Send any buffered bytes to the end point. */ -TCompactProtocol.prototype.flush = function() { +TCompactProtocol.prototype.flush = function () { return this.trans.flush(); }; @@ -240,31 +240,33 @@ TCompactProtocol.prototype.flush = function() { * @param {number} type - The type of message (CALL, REPLY, EXCEPTION, ONEWAY). * @param {number} seqid - The call sequence number (if any). */ -TCompactProtocol.prototype.writeMessageBegin = function(name, type, seqid) { +TCompactProtocol.prototype.writeMessageBegin = function (name, type, seqid) { this.writeByte(TCompactProtocol.PROTOCOL_ID); - this.writeByte((TCompactProtocol.VERSION_N & TCompactProtocol.VERSION_MASK) | - ((type << TCompactProtocol.TYPE_SHIFT_AMOUNT) & TCompactProtocol.TYPE_MASK)); + this.writeByte( + (TCompactProtocol.VERSION_N & TCompactProtocol.VERSION_MASK) | + ((type << TCompactProtocol.TYPE_SHIFT_AMOUNT) & + TCompactProtocol.TYPE_MASK), + ); this.writeVarint32(seqid); this.writeString(name); // Record client seqid to find callback again if (this._seqid) { - log.warning('SeqId already set', { 'name': name }); + log.warning("SeqId already set", { name: name }); } else { this._seqid = seqid; this.trans.setCurrSeqId(seqid); } }; -TCompactProtocol.prototype.writeMessageEnd = function() { -}; +TCompactProtocol.prototype.writeMessageEnd = function () {}; -TCompactProtocol.prototype.writeStructBegin = function(name) { +TCompactProtocol.prototype.writeStructBegin = function (name) { this.lastField_.push(this.lastFieldId_); this.lastFieldId_ = 0; }; -TCompactProtocol.prototype.writeStructEnd = function() { +TCompactProtocol.prototype.writeStructEnd = function () { this.lastFieldId_ = this.lastField_.pop(); }; @@ -274,7 +276,7 @@ TCompactProtocol.prototype.writeStructEnd = function() { * @param {number} type - The field data type (a normal Thrift field Type). * @param {number} id - The IDL field Id. */ -TCompactProtocol.prototype.writeFieldBegin = function(name, type, id) { +TCompactProtocol.prototype.writeFieldBegin = function (name, type, id) { if (type != Type.BOOL) { return this.writeFieldBeginInternal(name, type, id, -1); } @@ -284,10 +286,9 @@ TCompactProtocol.prototype.writeFieldBegin = function(name, type, id) { this.booleanField_.fieldId = id; }; -TCompactProtocol.prototype.writeFieldEnd = function() { -}; +TCompactProtocol.prototype.writeFieldEnd = function () {}; -TCompactProtocol.prototype.writeFieldStop = function() { +TCompactProtocol.prototype.writeFieldStop = function () { this.writeByte(TCompactProtocol.Types.CT_STOP); }; @@ -297,80 +298,85 @@ TCompactProtocol.prototype.writeFieldStop = function() { * @param {number} valType - The Thrift type of the map values. * @param {number} size - The number of k/v pairs in the map. */ -TCompactProtocol.prototype.writeMapBegin = function(keyType, valType, size) { +TCompactProtocol.prototype.writeMapBegin = function (keyType, valType, size) { if (size === 0) { this.writeByte(0); } else { this.writeVarint32(size); - this.writeByte(this.getCompactType(keyType) << 4 | this.getCompactType(valType)); + this.writeByte( + (this.getCompactType(keyType) << 4) | this.getCompactType(valType), + ); } }; -TCompactProtocol.prototype.writeMapEnd = function() { -}; +TCompactProtocol.prototype.writeMapEnd = function () {}; /** * Writes a list collection header * @param {number} elemType - The Thrift type of the list elements. * @param {number} size - The number of elements in the list. */ -TCompactProtocol.prototype.writeListBegin = function(elemType, size) { +TCompactProtocol.prototype.writeListBegin = function (elemType, size) { this.writeCollectionBegin(elemType, size); }; -TCompactProtocol.prototype.writeListEnd = function() { -}; +TCompactProtocol.prototype.writeListEnd = function () {}; /** * Writes a set collection header * @param {number} elemType - The Thrift type of the set elements. * @param {number} size - The number of elements in the set. */ -TCompactProtocol.prototype.writeSetBegin = function(elemType, size) { +TCompactProtocol.prototype.writeSetBegin = function (elemType, size) { this.writeCollectionBegin(elemType, size); }; -TCompactProtocol.prototype.writeSetEnd = function() { -}; +TCompactProtocol.prototype.writeSetEnd = function () {}; -TCompactProtocol.prototype.writeBool = function(value) { +TCompactProtocol.prototype.writeBool = function (value) { if (this.booleanField_.name !== null) { // we haven't written the field header yet - this.writeFieldBeginInternal(this.booleanField_.name, - this.booleanField_.fieldType, - this.booleanField_.fieldId, - (value ? TCompactProtocol.Types.CT_BOOLEAN_TRUE - : TCompactProtocol.Types.CT_BOOLEAN_FALSE)); + this.writeFieldBeginInternal( + this.booleanField_.name, + this.booleanField_.fieldType, + this.booleanField_.fieldId, + value + ? TCompactProtocol.Types.CT_BOOLEAN_TRUE + : TCompactProtocol.Types.CT_BOOLEAN_FALSE, + ); this.booleanField_.name = null; } else { // we're not part of a field, so just write the value - this.writeByte((value ? TCompactProtocol.Types.CT_BOOLEAN_TRUE - : TCompactProtocol.Types.CT_BOOLEAN_FALSE)); + this.writeByte( + value + ? TCompactProtocol.Types.CT_BOOLEAN_TRUE + : TCompactProtocol.Types.CT_BOOLEAN_FALSE, + ); } }; -TCompactProtocol.prototype.writeByte = function(b) { +TCompactProtocol.prototype.writeByte = function (b) { this.trans.write(new Buffer([b])); }; -TCompactProtocol.prototype.writeI16 = function(i16) { +TCompactProtocol.prototype.writeI16 = function (i16) { this.writeVarint32(this.i32ToZigzag(i16)); }; -TCompactProtocol.prototype.writeI32 = function(i32) { +TCompactProtocol.prototype.writeI32 = function (i32) { this.writeVarint32(this.i32ToZigzag(i32)); }; -TCompactProtocol.prototype.writeI64 = function(i64) { +TCompactProtocol.prototype.writeI64 = function (i64) { this.writeVarint64(this.i64ToZigzag(i64)); }; // Little-endian, unlike TBinaryProtocol -TCompactProtocol.prototype.writeDouble = function(v) { +TCompactProtocol.prototype.writeDouble = function (v) { var buff = new Buffer(8); var m, e, c; - buff[7] = (v < 0 ? 0x80 : 0x00); + buff[7] = v < 0 ? 0x80 : 0x00; v = Math.abs(v); if (v !== v) { @@ -388,22 +394,17 @@ TCompactProtocol.prototype.writeDouble = function(v) { c *= 2; } - if (e + 1023 >= 2047) - { + if (e + 1023 >= 2047) { // Overflow m = 0; e = 2047; - } - else if (e + 1023 >= 1) - { + } else if (e + 1023 >= 1) { // Normalized - term order matters, as Math.pow(2, 52-e) and v*Math.pow(2, 52) can overflow - m = (v*c-1) * POW_52; + m = (v * c - 1) * POW_52; e += 1023; - } - else - { + } else { // Denormalized - also catches the '0' case, somewhat by chance - m = (v * POW_1022) * POW_52; + m = v * POW_1022 * POW_52; e = 0; } } @@ -428,45 +429,53 @@ TCompactProtocol.prototype.writeDouble = function(v) { this.trans.write(buff); }; -TCompactProtocol.prototype.writeStringOrBinary = function(name, encoding, arg) { - if (typeof arg === 'string') { - this.writeVarint32(Buffer.byteLength(arg, encoding)) ; +TCompactProtocol.prototype.writeStringOrBinary = function ( + name, + encoding, + arg, +) { + if (typeof arg === "string") { + this.writeVarint32(Buffer.byteLength(arg, encoding)); this.trans.write(new Buffer(arg, encoding)); - } else if (arg instanceof Buffer || - Object.prototype.toString.call(arg) == '[object Uint8Array]') { + } else if ( + arg instanceof Buffer || + Object.prototype.toString.call(arg) == "[object Uint8Array]" + ) { // Buffers in Node.js under Browserify may extend UInt8Array instead of // defining a new object. We detect them here so we can write them // correctly this.writeVarint32(arg.length); this.trans.write(arg); } else { - throw new Error(name + ' called without a string/Buffer argument: ' + arg); + throw new Error(name + " called without a string/Buffer argument: " + arg); } }; -TCompactProtocol.prototype.writeString = function(arg) { - this.writeStringOrBinary('writeString', 'utf8', arg); +TCompactProtocol.prototype.writeString = function (arg) { + this.writeStringOrBinary("writeString", "utf8", arg); }; -TCompactProtocol.prototype.writeBinary = function(arg) { - this.writeStringOrBinary('writeBinary', 'binary', arg); +TCompactProtocol.prototype.writeBinary = function (arg) { + this.writeStringOrBinary("writeBinary", "binary", arg); }; - // // Compact Protocol internal write methods // -TCompactProtocol.prototype.writeFieldBeginInternal = function(name, - fieldType, - fieldId, - typeOverride) { +TCompactProtocol.prototype.writeFieldBeginInternal = function ( + name, + fieldType, + fieldId, + typeOverride, +) { //If there's a type override, use that. - var typeToWrite = (typeOverride == -1 ? this.getCompactType(fieldType) : typeOverride); + var typeToWrite = + typeOverride == -1 ? this.getCompactType(fieldType) : typeOverride; //Check if we can delta encode the field id if (fieldId > this.lastFieldId_ && fieldId - this.lastFieldId_ <= 15) { //Include the type delta with the field ID - this.writeByte((fieldId - this.lastFieldId_) << 4 | typeToWrite); + this.writeByte(((fieldId - this.lastFieldId_) << 4) | typeToWrite); } else { //Write separate type and ID values this.writeByte(typeToWrite); @@ -475,10 +484,10 @@ TCompactProtocol.prototype.writeFieldBeginInternal = function(name, this.lastFieldId_ = fieldId; }; -TCompactProtocol.prototype.writeCollectionBegin = function(elemType, size) { +TCompactProtocol.prototype.writeCollectionBegin = function (elemType, size) { if (size <= 14) { //Combine size and type in one byte if possible - this.writeByte(size << 4 | this.getCompactType(elemType)); + this.writeByte((size << 4) | this.getCompactType(elemType)); } else { this.writeByte(0xf0 | this.getCompactType(elemType)); this.writeVarint32(size); @@ -488,20 +497,20 @@ TCompactProtocol.prototype.writeCollectionBegin = function(elemType, size) { /** * Write an i32 as a varint. Results in 1-5 bytes on the wire. */ -TCompactProtocol.prototype.writeVarint32 = function(n) { +TCompactProtocol.prototype.writeVarint32 = function (n) { var buf = new Buffer(5); var wsize = 0; while (true) { - if ((n & ~0x7F) === 0) { + if ((n & ~0x7f) === 0) { buf[wsize++] = n; break; } else { - buf[wsize++] = ((n & 0x7F) | 0x80); + buf[wsize++] = (n & 0x7f) | 0x80; n = n >>> 7; } } var wbuf = new Buffer(wsize); - buf.copy(wbuf,0,0,wsize); + buf.copy(wbuf, 0, 0, wsize); this.trans.write(wbuf); }; @@ -509,12 +518,15 @@ TCompactProtocol.prototype.writeVarint32 = function(n) { * Write an i64 as a varint. Results in 1-10 bytes on the wire. * N.B. node-int64 is always big endian */ -TCompactProtocol.prototype.writeVarint64 = function(n) { - if (typeof n === "number"){ +TCompactProtocol.prototype.writeVarint64 = function (n) { + if (typeof n === "number") { n = new Int64(n); } - if (! (n instanceof Int64)) { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.INVALID_DATA, "Expected Int64 or Number, found: " + n); + if (!(n instanceof Int64)) { + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.INVALID_DATA, + "Expected Int64 or Number, found: " + n, + ); } var buf = new Buffer(10); @@ -523,11 +535,11 @@ TCompactProtocol.prototype.writeVarint64 = function(n) { var lo = n.buffer.readUInt32BE(4, true); var mask = 0; while (true) { - if (((lo & ~0x7F) === 0) && (hi === 0)) { + if ((lo & ~0x7f) === 0 && hi === 0) { buf[wsize++] = lo; break; } else { - buf[wsize++] = ((lo & 0x7F) | 0x80); + buf[wsize++] = (lo & 0x7f) | 0x80; mask = hi << 25; lo = lo >>> 7; hi = hi >>> 7; @@ -535,7 +547,7 @@ TCompactProtocol.prototype.writeVarint64 = function(n) { } } var wbuf = new Buffer(wsize); - buf.copy(wbuf,0,0,wsize); + buf.copy(wbuf, 0, 0, wsize); this.trans.write(wbuf); }; @@ -543,20 +555,23 @@ TCompactProtocol.prototype.writeVarint64 = function(n) { * Convert l into a zigzag long. This allows negative numbers to be * represented compactly as a varint. */ -TCompactProtocol.prototype.i64ToZigzag = function(l) { - if (typeof l === 'string') { +TCompactProtocol.prototype.i64ToZigzag = function (l) { + if (typeof l === "string") { l = new Int64(parseInt(l, 10)); - } else if (typeof l === 'number') { + } else if (typeof l === "number") { l = new Int64(l); } - if (! (l instanceof Int64)) { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.INVALID_DATA, "Expected Int64 or Number, found: " + l); + if (!(l instanceof Int64)) { + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.INVALID_DATA, + "Expected Int64 or Number, found: " + l, + ); } var hi = l.buffer.readUInt32BE(0, true); var lo = l.buffer.readUInt32BE(4, true); var sign = hi >>> 31; - hi = ((hi << 1) | (lo >>> 31)) ^ ((!!sign) ? 0xFFFFFFFF : 0); - lo = (lo << 1) ^ ((!!sign) ? 0xFFFFFFFF : 0); + hi = ((hi << 1) | (lo >>> 31)) ^ (!!sign ? 0xffffffff : 0); + lo = (lo << 1) ^ (!!sign ? 0xffffffff : 0); return new Int64(hi, lo); }; @@ -564,29 +579,36 @@ TCompactProtocol.prototype.i64ToZigzag = function(l) { * Convert n into a zigzag int. This allows negative numbers to be * represented compactly as a varint. */ -TCompactProtocol.prototype.i32ToZigzag = function(n) { - return (n << 1) ^ ((n & 0x80000000) ? 0xFFFFFFFF : 0); +TCompactProtocol.prototype.i32ToZigzag = function (n) { + return (n << 1) ^ (n & 0x80000000 ? 0xffffffff : 0); }; - // // Compact Protocol read operations // -TCompactProtocol.prototype.readMessageBegin = function() { +TCompactProtocol.prototype.readMessageBegin = function () { //Read protocol ID var protocolId = this.trans.readByte(); if (protocolId != TCompactProtocol.PROTOCOL_ID) { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.BAD_VERSION, "Bad protocol identifier " + protocolId); + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.BAD_VERSION, + "Bad protocol identifier " + protocolId, + ); } //Read Version and Type var versionAndType = this.trans.readByte(); - var version = (versionAndType & TCompactProtocol.VERSION_MASK); + var version = versionAndType & TCompactProtocol.VERSION_MASK; if (version != TCompactProtocol.VERSION_N) { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.BAD_VERSION, "Bad protocol version " + version); + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.BAD_VERSION, + "Bad protocol version " + version, + ); } - var type = ((versionAndType >> TCompactProtocol.TYPE_SHIFT_AMOUNT) & TCompactProtocol.TYPE_BITS); + var type = + (versionAndType >> TCompactProtocol.TYPE_SHIFT_AMOUNT) & + TCompactProtocol.TYPE_BITS; //Read SeqId var seqid = this.readVarint32(); @@ -594,62 +616,65 @@ TCompactProtocol.prototype.readMessageBegin = function() { //Read name var name = this.readString(); - return {fname: name, mtype: type, rseqid: seqid}; + return { fname: name, mtype: type, rseqid: seqid }; }; -TCompactProtocol.prototype.readMessageEnd = function() { -}; +TCompactProtocol.prototype.readMessageEnd = function () {}; -TCompactProtocol.prototype.readStructBegin = function() { +TCompactProtocol.prototype.readStructBegin = function () { this.lastField_.push(this.lastFieldId_); this.lastFieldId_ = 0; - return {fname: ''}; + return { fname: "" }; }; -TCompactProtocol.prototype.readStructEnd = function() { +TCompactProtocol.prototype.readStructEnd = function () { this.lastFieldId_ = this.lastField_.pop(); }; -TCompactProtocol.prototype.readFieldBegin = function() { +TCompactProtocol.prototype.readFieldBegin = function () { var fieldId = 0; var b = this.trans.readByte(b); - var type = (b & 0x0f); + var type = b & 0x0f; if (type == TCompactProtocol.Types.CT_STOP) { - return {fname: null, ftype: Thrift.Type.STOP, fid: 0}; + return { fname: null, ftype: Thrift.Type.STOP, fid: 0 }; } //Mask off the 4 MSB of the type header to check for field id delta. - var modifier = ((b & 0x000000f0) >>> 4); + var modifier = (b & 0x000000f0) >>> 4; if (modifier === 0) { //If not a delta read the field id. fieldId = this.readI16(); } else { //Recover the field id from the delta - fieldId = (this.lastFieldId_ + modifier); + fieldId = this.lastFieldId_ + modifier; } var fieldType = this.getTType(type); //Boolean are encoded with the type - if (type == TCompactProtocol.Types.CT_BOOLEAN_TRUE || - type == TCompactProtocol.Types.CT_BOOLEAN_FALSE) { + if ( + type == TCompactProtocol.Types.CT_BOOLEAN_TRUE || + type == TCompactProtocol.Types.CT_BOOLEAN_FALSE + ) { this.boolValue_.hasBoolValue = true; this.boolValue_.boolValue = - (type == TCompactProtocol.Types.CT_BOOLEAN_TRUE ? true : false); + type == TCompactProtocol.Types.CT_BOOLEAN_TRUE ? true : false; } //Save the new field for the next delta computation. this.lastFieldId_ = fieldId; - return {fname: null, ftype: fieldType, fid: fieldId}; + return { fname: null, ftype: fieldType, fid: fieldId }; }; -TCompactProtocol.prototype.readFieldEnd = function() { -}; +TCompactProtocol.prototype.readFieldEnd = function () {}; -TCompactProtocol.prototype.readMapBegin = function() { +TCompactProtocol.prototype.readMapBegin = function () { var msize = this.readVarint32(); if (msize < 0) { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.NEGATIVE_SIZE, "Negative map size"); + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.NEGATIVE_SIZE, + "Negative map size", + ); } var kvType = 0; @@ -659,13 +684,12 @@ TCompactProtocol.prototype.readMapBegin = function() { var keyType = this.getTType((kvType & 0xf0) >>> 4); var valType = this.getTType(kvType & 0xf); - return {ktype: keyType, vtype: valType, size: msize}; + return { ktype: keyType, vtype: valType, size: msize }; }; -TCompactProtocol.prototype.readMapEnd = function() { -}; +TCompactProtocol.prototype.readMapEnd = function () {}; -TCompactProtocol.prototype.readListBegin = function() { +TCompactProtocol.prototype.readListBegin = function () { var size_and_type = this.trans.readByte(); var lsize = (size_and_type >>> 4) & 0x0000000f; @@ -674,25 +698,26 @@ TCompactProtocol.prototype.readListBegin = function() { } if (lsize < 0) { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.NEGATIVE_SIZE, "Negative list size"); + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.NEGATIVE_SIZE, + "Negative list size", + ); } var elemType = this.getTType(size_and_type & 0x0000000f); - return {etype: elemType, size: lsize}; + return { etype: elemType, size: lsize }; }; -TCompactProtocol.prototype.readListEnd = function() { -}; +TCompactProtocol.prototype.readListEnd = function () {}; -TCompactProtocol.prototype.readSetBegin = function() { +TCompactProtocol.prototype.readSetBegin = function () { return this.readListBegin(); }; -TCompactProtocol.prototype.readSetEnd = function() { -}; +TCompactProtocol.prototype.readSetEnd = function () {}; -TCompactProtocol.prototype.readBool = function() { +TCompactProtocol.prototype.readBool = function () { var value = false; var rsize = 0; if (this.boolValue_.hasBoolValue === true) { @@ -701,50 +726,50 @@ TCompactProtocol.prototype.readBool = function() { } else { var res = this.trans.readByte(); rsize = res.rsize; - value = (res.value == TCompactProtocol.Types.CT_BOOLEAN_TRUE); + value = res.value == TCompactProtocol.Types.CT_BOOLEAN_TRUE; } return value; }; -TCompactProtocol.prototype.readByte = function() { +TCompactProtocol.prototype.readByte = function () { return this.trans.readByte(); }; -TCompactProtocol.prototype.readI16 = function() { +TCompactProtocol.prototype.readI16 = function () { return this.readI32(); }; -TCompactProtocol.prototype.readI32 = function() { +TCompactProtocol.prototype.readI32 = function () { return this.zigzagToI32(this.readVarint32()); }; -TCompactProtocol.prototype.readI64 = function() { +TCompactProtocol.prototype.readI64 = function () { return this.zigzagToI64(this.readVarint64()); }; // Little-endian, unlike TBinaryProtocol -TCompactProtocol.prototype.readDouble = function() { +TCompactProtocol.prototype.readDouble = function () { var buff = this.trans.read(8); var off = 0; var signed = buff[off + 7] & 0x80; - var e = (buff[off+6] & 0xF0) >> 4; - e += (buff[off+7] & 0x7F) << 4; + var e = (buff[off + 6] & 0xf0) >> 4; + e += (buff[off + 7] & 0x7f) << 4; var m = buff[off]; - m += buff[off+1] << 8; - m += buff[off+2] << 16; - m += buff[off+3] * POW_24; - m += buff[off+4] * POW_32; - m += buff[off+5] * POW_40; - m += (buff[off+6] & 0x0F) * POW_48; + m += buff[off + 1] << 8; + m += buff[off + 2] << 16; + m += buff[off + 3] * POW_24; + m += buff[off + 4] * POW_32; + m += buff[off + 5] * POW_40; + m += (buff[off + 6] & 0x0f) * POW_48; switch (e) { case 0: e = -1022; break; case 2047: - return m ? NaN : (signed ? -Infinity : Infinity); + return m ? NaN : signed ? -Infinity : Infinity; default: m += POW_52; e -= 1023; @@ -757,19 +782,22 @@ TCompactProtocol.prototype.readDouble = function() { return m * Math.pow(2, e - 52); }; -TCompactProtocol.prototype.readBinary = function() { +TCompactProtocol.prototype.readBinary = function () { var size = this.readVarint32(); if (size === 0) { return new Buffer(0); } if (size < 0) { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.NEGATIVE_SIZE, "Negative binary size"); + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.NEGATIVE_SIZE, + "Negative binary size", + ); } return this.trans.read(size); }; -TCompactProtocol.prototype.readString = function() { +TCompactProtocol.prototype.readString = function () { var size = this.readVarint32(); // Catch empty string case if (size === 0) { @@ -778,12 +806,14 @@ TCompactProtocol.prototype.readString = function() { // Catch error cases if (size < 0) { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.NEGATIVE_SIZE, "Negative string size"); + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.NEGATIVE_SIZE, + "Negative string size", + ); } return this.trans.readString(size); }; - // // Compact Protocol internal read operations // @@ -792,7 +822,7 @@ TCompactProtocol.prototype.readString = function() { * Read an i32 from the wire as a varint. The MSB of each byte is set * if there is another byte to follow. This can read up to 5 bytes. */ -TCompactProtocol.prototype.readVarint32 = function() { +TCompactProtocol.prototype.readVarint32 = function () { return this.readVarint64().toNumber(); }; @@ -800,28 +830,31 @@ TCompactProtocol.prototype.readVarint32 = function() { * Read an i64 from the wire as a proper varint. The MSB of each byte is set * if there is another byte to follow. This can read up to 10 bytes. */ -TCompactProtocol.prototype.readVarint64 = function() { +TCompactProtocol.prototype.readVarint64 = function () { var rsize = 0; var lo = 0; var hi = 0; var shift = 0; while (true) { var b = this.trans.readByte(); - rsize ++; + rsize++; if (shift <= 25) { lo = lo | ((b & 0x7f) << shift); } else if (25 < shift && shift < 32) { lo = lo | ((b & 0x7f) << shift); - hi = hi | ((b & 0x7f) >>> (32-shift)); + hi = hi | ((b & 0x7f) >>> (32 - shift)); } else { - hi = hi | ((b & 0x7f) << (shift-32)); + hi = hi | ((b & 0x7f) << (shift - 32)); } shift += 7; if (!(b & 0x80)) { break; } if (rsize >= 10) { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.INVALID_DATA, "Variable-length int over 10 bytes."); + throw new Thrift.TProtocolException( + Thrift.TProtocolExceptionType.INVALID_DATA, + "Variable-length int over 10 bytes.", + ); } } return new Int64(hi, lo); @@ -830,14 +863,14 @@ TCompactProtocol.prototype.readVarint64 = function() { /** * Convert from zigzag int to int. */ -TCompactProtocol.prototype.zigzagToI32 = function(n) { +TCompactProtocol.prototype.zigzagToI32 = function (n) { return (n >>> 1) ^ (-1 * (n & 1)); }; /** * Convert from zigzag long to long. */ -TCompactProtocol.prototype.zigzagToI64 = function(n) { +TCompactProtocol.prototype.zigzagToI64 = function (n) { var hi = n.buffer.readUInt32BE(0, true); var lo = n.buffer.readUInt32BE(4, true); @@ -846,13 +879,13 @@ TCompactProtocol.prototype.zigzagToI64 = function(n) { var hi_neg = neg.buffer.readUInt32BE(0, true); var lo_neg = neg.buffer.readUInt32BE(4, true); - var hi_lo = (hi << 31); - hi = (hi >>> 1) ^ (hi_neg); - lo = ((lo >>> 1) | hi_lo) ^ (lo_neg); + var hi_lo = hi << 31; + hi = (hi >>> 1) ^ hi_neg; + lo = ((lo >>> 1) | hi_lo) ^ lo_neg; return new Int64(hi, lo); }; -TCompactProtocol.prototype.skip = function(type) { +TCompactProtocol.prototype.skip = function (type) { switch (type) { case Type.BOOL: this.readBool(); @@ -910,6 +943,6 @@ TCompactProtocol.prototype.skip = function(type) { this.readListEnd(); break; default: - throw new Error("Invalid type: " + type); + throw new Error("Invalid type: " + type); } }; diff --git a/lib/nodejs/lib/thrift/connection.js b/lib/nodejs/lib/thrift/connection.js index b4e5a05277d..dcade80dc88 100644 --- a/lib/nodejs/lib/thrift/connection.js +++ b/lib/nodejs/lib/thrift/connection.js @@ -16,29 +16,29 @@ * specific language governing permissions and limitations * under the License. */ -var util = require('util'); -var EventEmitter = require('events').EventEmitter; -var constants = require('constants'); -var net = require('net'); -var tls = require('tls'); -var thrift = require('./thrift'); -var log = require('./log'); +var util = require("util"); +var EventEmitter = require("events").EventEmitter; +var constants = require("constants"); +var net = require("net"); +var tls = require("tls"); +var thrift = require("./thrift"); +var log = require("./log"); -var TBufferedTransport = require('./buffered_transport'); -var TBinaryProtocol = require('./binary_protocol'); -var InputBufferUnderrunError = require('./input_buffer_underrun_error'); +var TBufferedTransport = require("./buffered_transport"); +var TBinaryProtocol = require("./binary_protocol"); +var InputBufferUnderrunError = require("./input_buffer_underrun_error"); -var createClient = require('./create_client'); +var createClient = require("./create_client"); -var binary = require('./binary'); +var binary = require("./binary"); -var Connection = exports.Connection = function(stream, options) { +var Connection = (exports.Connection = function (stream, options) { var self = this; EventEmitter.call(this); this.seqId2Service = {}; this.connection = stream; - this.ssl = (stream.encrypted); + this.ssl = stream.encrypted; this.options = options || {}; this.transport = this.options.transport || TBufferedTransport; this.protocol = this.options.protocol || TBinaryProtocol; @@ -48,123 +48,139 @@ var Connection = exports.Connection = function(stream, options) { this.initialize_retry_vars(); this._debug = this.options.debug || false; - if (this.options.max_attempts && - !isNaN(this.options.max_attempts) && - this.options.max_attempts > 0) { - this.max_attempts = +this.options.max_attempts; + if ( + this.options.max_attempts && + !isNaN(this.options.max_attempts) && + this.options.max_attempts > 0 + ) { + this.max_attempts = +this.options.max_attempts; } this.retry_max_delay = null; - if (this.options.retry_max_delay !== undefined && - !isNaN(this.options.retry_max_delay) && - this.options.retry_max_delay > 0) { - this.retry_max_delay = this.options.retry_max_delay; + if ( + this.options.retry_max_delay !== undefined && + !isNaN(this.options.retry_max_delay) && + this.options.retry_max_delay > 0 + ) { + this.retry_max_delay = this.options.retry_max_delay; } this.connect_timeout = false; - if (this.options.connect_timeout && - !isNaN(this.options.connect_timeout) && - this.options.connect_timeout > 0) { - this.connect_timeout = +this.options.connect_timeout; + if ( + this.options.connect_timeout && + !isNaN(this.options.connect_timeout) && + this.options.connect_timeout > 0 + ) { + this.connect_timeout = +this.options.connect_timeout; } - this.connection.addListener(this.ssl ? "secureConnect" : "connect", function() { - self.connected = true; + this.connection.addListener( + this.ssl ? "secureConnect" : "connect", + function () { + self.connected = true; - this.setTimeout(self.options.timeout || 0); - this.setNoDelay(); - this.frameLeft = 0; - this.framePos = 0; - this.frame = null; - self.initialize_retry_vars(); - self.flush_offline_queue(); + this.setTimeout(self.options.timeout || 0); + this.setNoDelay(); + this.frameLeft = 0; + this.framePos = 0; + this.frame = null; + self.initialize_retry_vars(); + self.flush_offline_queue(); - self.emit("connect"); - }); + self.emit("connect"); + }, + ); - this.connection.addListener("error", function(err) { + this.connection.addListener("error", function (err) { // Only emit the error if no-one else is listening on the connection // or if someone is listening on us, because Node turns unhandled // 'error' events into exceptions. - if (self.connection.listeners('error').length === 1 || - self.listeners('error').length > 0) { + if ( + self.connection.listeners("error").length === 1 || + self.listeners("error").length > 0 + ) { self.emit("error", err); } }); // Add a close listener - this.connection.addListener("close", function() { + this.connection.addListener("close", function () { self.connection_gone(); // handle close event. try to reconnect }); - this.connection.addListener("timeout", function() { + this.connection.addListener("timeout", function () { self.emit("timeout"); }); - this.connection.addListener("data", self.transport.receiver(function(transport_with_data) { - var message = new self.protocol(transport_with_data); - try { - while (true) { - var header = message.readMessageBegin(); - var dummy_seqid = header.rseqid * -1; - var client = self.client; - //The Multiplexed Protocol stores a hash of seqid to service names - // in seqId2Service. If the SeqId is found in the hash we need to - // lookup the appropriate client for this call. - // The connection.client object is a single client object when not - // multiplexing, when using multiplexing it is a service name keyed - // hash of client objects. - //NOTE: The 2 way interdependencies between protocols, transports, - // connections and clients in the Node.js implementation are irregular - // and make the implementation difficult to extend and maintain. We - // should bring this stuff inline with typical thrift I/O stack - // operation soon. - // --ra - var service_name = self.seqId2Service[header.rseqid]; - if (service_name) { - client = self.client[service_name]; - } - /*jshint -W083 */ - client._reqs[dummy_seqid] = function(err, success){ - transport_with_data.commitPosition(); - - var callback = client._reqs[header.rseqid]; - delete client._reqs[header.rseqid]; + this.connection.addListener( + "data", + self.transport.receiver(function (transport_with_data) { + var message = new self.protocol(transport_with_data); + try { + while (true) { + var header = message.readMessageBegin(); + var dummy_seqid = header.rseqid * -1; + var client = self.client; + //The Multiplexed Protocol stores a hash of seqid to service names + // in seqId2Service. If the SeqId is found in the hash we need to + // lookup the appropriate client for this call. + // The connection.client object is a single client object when not + // multiplexing, when using multiplexing it is a service name keyed + // hash of client objects. + //NOTE: The 2 way interdependencies between protocols, transports, + // connections and clients in the Node.js implementation are irregular + // and make the implementation difficult to extend and maintain. We + // should bring this stuff inline with typical thrift I/O stack + // operation soon. + // --ra + var service_name = self.seqId2Service[header.rseqid]; if (service_name) { - delete self.seqId2Service[header.rseqid]; + client = self.client[service_name]; } - if (callback) { - callback(err, success); + /*jshint -W083 */ + client._reqs[dummy_seqid] = function (err, success) { + transport_with_data.commitPosition(); + + var callback = client._reqs[header.rseqid]; + delete client._reqs[header.rseqid]; + if (service_name) { + delete self.seqId2Service[header.rseqid]; + } + if (callback) { + callback(err, success); + } + }; + /*jshint +W083 */ + + if (client["recv_" + header.fname]) { + client["recv_" + header.fname](message, header.mtype, dummy_seqid); + } else { + delete client._reqs[dummy_seqid]; + self.emit( + "error", + new thrift.TApplicationException( + thrift.TApplicationExceptionType.WRONG_METHOD_NAME, + "Received a response to an unknown RPC function", + ), + ); } - }; - /*jshint +W083 */ - - if(client['recv_' + header.fname]) { - client['recv_' + header.fname](message, header.mtype, dummy_seqid); + } + } catch (e) { + if (e instanceof InputBufferUnderrunError) { + transport_with_data.rollbackPosition(); } else { - delete client._reqs[dummy_seqid]; - self.emit("error", - new thrift.TApplicationException(thrift.TApplicationExceptionType.WRONG_METHOD_NAME, - "Received a response to an unknown RPC function")); + self.emit("error", e); } } - } - catch (e) { - if (e instanceof InputBufferUnderrunError) { - transport_with_data.rollbackPosition(); - } - else { - self.emit('error', e); - } - } - })); -}; + }), + ); +}); util.inherits(Connection, EventEmitter); -Connection.prototype.end = function() { +Connection.prototype.end = function () { this.forceClose = true; this.connection.end(); }; -Connection.prototype.destroy = function() { +Connection.prototype.destroy = function () { this.connection.destroy(); }; @@ -183,12 +199,12 @@ Connection.prototype.flush_offline_queue = function () { // Reset offline queue this.offline_queue = []; // Attempt to write queued items - offline_queue.forEach(function(data) { + offline_queue.forEach(function (data) { self.write(data); }); }; -Connection.prototype.write = function(data) { +Connection.prototype.write = function (data) { if (!this.connected) { this.offline_queue.push(data); return; @@ -201,7 +217,7 @@ Connection.prototype.connection_gone = function () { this.connected = false; // If closed by manual, emit close event and cancel reconnect process - if(this.forceClose) { + if (this.forceClose) { if (this.retry_timer) { clearTimeout(this.retry_timer); this.retry_timer = null; @@ -220,7 +236,10 @@ Connection.prototype.connection_gone = function () { return; } - if (this.retry_max_delay !== null && this.retry_delay >= this.retry_max_delay) { + if ( + this.retry_max_delay !== null && + this.retry_delay >= this.retry_max_delay + ) { this.retry_delay = this.retry_max_delay; } else { this.retry_delay = Math.floor(this.retry_delay * this.retry_backoff); @@ -230,7 +249,11 @@ Connection.prototype.connection_gone = function () { if (this.max_attempts && this.attempts >= this.max_attempts) { this.retry_timer = null; - console.error("thrift: Couldn't get thrift connection after " + this.max_attempts + " attempts."); + console.error( + "thrift: Couldn't get thrift connection after " + + this.max_attempts + + " attempts.", + ); self.emit("close"); return; } @@ -238,7 +261,7 @@ Connection.prototype.connection_gone = function () { this.attempts += 1; this.emit("reconnecting", { delay: self.retry_delay, - attempt: self.attempts + attempt: self.attempts, }); this.retry_timer = setTimeout(function () { @@ -247,10 +270,14 @@ Connection.prototype.connection_gone = function () { self.retry_totaltime += self.retry_delay; if (self.connect_timeout && self.retry_totaltime >= self.connect_timeout) { - self.retry_timer = null; - console.error("thrift: Couldn't get thrift connection after " + self.retry_totaltime + "ms."); - self.emit("close"); - return; + self.retry_timer = null; + console.error( + "thrift: Couldn't get thrift connection after " + + self.retry_totaltime + + "ms.", + ); + self.emit("close"); + return; } if (self.path !== undefined) { @@ -262,11 +289,11 @@ Connection.prototype.connection_gone = function () { }, this.retry_delay); }; -exports.createConnection = function(host, port, options) { - var stream = net.createConnection( { +exports.createConnection = function (host, port, options) { + var stream = net.createConnection({ port: port, host: host, - timeout: options.connect_timeout || options.timeout || 0 + timeout: options.connect_timeout || options.timeout || 0, }); var connection = new Connection(stream, options); connection.host = host; @@ -275,7 +302,7 @@ exports.createConnection = function(host, port, options) { return connection; }; -exports.createUDSConnection = function(path, options) { +exports.createUDSConnection = function (path, options) { var stream = net.createConnection(path); var connection = new Connection(stream, options); connection.path = path; @@ -283,10 +310,11 @@ exports.createUDSConnection = function(path, options) { return connection; }; -exports.createSSLConnection = function(host, port, options) { - if (!('secureProtocol' in options) && !('secureOptions' in options)) { +exports.createSSLConnection = function (host, port, options) { + if (!("secureProtocol" in options) && !("secureOptions" in options)) { options.secureProtocol = "SSLv23_method"; - options.secureOptions = constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3; + options.secureOptions = + constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3; } var stream = tls.connect(port, host, options); @@ -297,15 +325,14 @@ exports.createSSLConnection = function(host, port, options) { return connection; }; - exports.createClient = createClient; -var child_process = require('child_process'); -var StdIOConnection = exports.StdIOConnection = function(command, options) { - var command_parts = command.split(' '); +var child_process = require("child_process"); +var StdIOConnection = (exports.StdIOConnection = function (command, options) { + var command_parts = command.split(" "); command = command_parts[0]; - var args = command_parts.splice(1,command_parts.length -1); - var child = this.child = child_process.spawn(command,args); + var args = command_parts.splice(1, command_parts.length - 1); + var child = (this.child = child_process.spawn(command, args)); var self = this; EventEmitter.call(this); @@ -316,13 +343,13 @@ var StdIOConnection = exports.StdIOConnection = function(command, options) { this.protocol = this.options.protocol || TBinaryProtocol; this.offline_queue = []; - if (log.getLogLevel() === 'debug') { - this.child.stderr.on('data', function (err) { - log.debug(err.toString(), 'CHILD ERROR'); + if (log.getLogLevel() === "debug") { + this.child.stderr.on("data", function (err) { + log.debug(err.toString(), "CHILD ERROR"); }); - this.child.on('exit', function (code,signal) { - log.debug(code + ':' + signal, 'CHILD EXITED'); + this.child.on("exit", function (code, signal) { + log.debug(code + ":" + signal, "CHILD EXITED"); }); } @@ -333,46 +360,47 @@ var StdIOConnection = exports.StdIOConnection = function(command, options) { self.flush_offline_queue(); - this.connection.addListener("error", function(err) { + this.connection.addListener("error", function (err) { self.emit("error", err); }); // Add a close listener - this.connection.addListener("close", function() { + this.connection.addListener("close", function () { self.emit("close"); }); - child.stdout.addListener("data", self.transport.receiver(function(transport_with_data) { - var message = new self.protocol(transport_with_data); - try { - var header = message.readMessageBegin(); - var dummy_seqid = header.rseqid * -1; - var client = self.client; - client._reqs[dummy_seqid] = function(err, success){ - transport_with_data.commitPosition(); - - var callback = client._reqs[header.rseqid]; - delete client._reqs[header.rseqid]; - if (callback) { - callback(err, success); + child.stdout.addListener( + "data", + self.transport.receiver(function (transport_with_data) { + var message = new self.protocol(transport_with_data); + try { + var header = message.readMessageBegin(); + var dummy_seqid = header.rseqid * -1; + var client = self.client; + client._reqs[dummy_seqid] = function (err, success) { + transport_with_data.commitPosition(); + + var callback = client._reqs[header.rseqid]; + delete client._reqs[header.rseqid]; + if (callback) { + callback(err, success); + } + }; + client["recv_" + header.fname](message, header.mtype, dummy_seqid); + } catch (e) { + if (e instanceof InputBufferUnderrunError) { + transport_with_data.rollbackPosition(); + } else { + throw e; } - }; - client['recv_' + header.fname](message, header.mtype, dummy_seqid); - } - catch (e) { - if (e instanceof InputBufferUnderrunError) { - transport_with_data.rollbackPosition(); - } - else { - throw e; } - } - })); -}; + }), + ); +}); util.inherits(StdIOConnection, EventEmitter); -StdIOConnection.prototype.end = function() { +StdIOConnection.prototype.end = function () { this.connection.end(); }; @@ -383,12 +411,12 @@ StdIOConnection.prototype.flush_offline_queue = function () { // Reset offline queue this.offline_queue = []; // Attempt to write queued items - offline_queue.forEach(function(data) { + offline_queue.forEach(function (data) { self.write(data); }); }; -StdIOConnection.prototype.write = function(data) { +StdIOConnection.prototype.write = function (data) { if (!this.connected) { this.offline_queue.push(data); return; @@ -396,8 +424,8 @@ StdIOConnection.prototype.write = function(data) { this.connection.write(data); }; -exports.createStdIOConnection = function(command,options){ - return new StdIOConnection(command,options); +exports.createStdIOConnection = function (command, options) { + return new StdIOConnection(command, options); }; exports.createStdIOClient = createClient; diff --git a/lib/nodejs/lib/thrift/create_client.js b/lib/nodejs/lib/thrift/create_client.js index d6b77a8339d..b9021bd4290 100644 --- a/lib/nodejs/lib/thrift/create_client.js +++ b/lib/nodejs/lib/thrift/create_client.js @@ -43,7 +43,7 @@ function createClient(ServiceClient, connection) { // - Callback to call on flush // Wrap the write method - var writeCb = function(buf, seqid) { + var writeCb = function (buf, seqid) { connection.write(buf, seqid); }; var transport = new connection.transport(undefined, writeCb); @@ -51,4 +51,4 @@ function createClient(ServiceClient, connection) { transport.client = client; connection.client = client; return client; -}; +} diff --git a/lib/nodejs/lib/thrift/framed_transport.js b/lib/nodejs/lib/thrift/framed_transport.js index 058d2301ff3..7ede2225e5f 100644 --- a/lib/nodejs/lib/thrift/framed_transport.js +++ b/lib/nodejs/lib/thrift/framed_transport.js @@ -17,9 +17,9 @@ * under the License. */ -var binary = require('./binary'); -var InputBufferUnderrunError = require('./input_buffer_underrun_error'); -var THeaderTransport = require('./header_transport'); +var binary = require("./binary"); +var InputBufferUnderrunError = require("./input_buffer_underrun_error"); +var THeaderTransport = require("./header_transport"); module.exports = TFramedTransport; @@ -30,14 +30,14 @@ function TFramedTransport(buffer, callback) { this.outCount = 0; this.readPos = 0; this.onFlush = callback; -}; +} Object.setPrototypeOf(TFramedTransport.prototype, THeaderTransport.prototype); -TFramedTransport.receiver = function(callback, seqid) { +TFramedTransport.receiver = function (callback, seqid) { var residual = new Buffer(0); - return function(data) { + return function (data) { residual = Buffer.concat([residual, Buffer.from(data)]); while (residual.length > 0) { @@ -61,34 +61,34 @@ TFramedTransport.receiver = function(callback, seqid) { }; }; -TFramedTransport.prototype.commitPosition = function(){}, -TFramedTransport.prototype.rollbackPosition = function(){}, - +(TFramedTransport.prototype.commitPosition = function () {}), + (TFramedTransport.prototype.rollbackPosition = function () {}), // TODO: Implement open/close support -TFramedTransport.prototype.isOpen = function() { - return true; -}; -TFramedTransport.prototype.open = function() {}; -TFramedTransport.prototype.close = function() {}; + (TFramedTransport.prototype.isOpen = function () { + return true; + }); +TFramedTransport.prototype.open = function () {}; +TFramedTransport.prototype.close = function () {}; - // Set the seqid of the message in the client - // So that callbacks can be found -TFramedTransport.prototype.setCurrSeqId = function(seqid) { +// Set the seqid of the message in the client +// So that callbacks can be found +TFramedTransport.prototype.setCurrSeqId = function (seqid) { this._seqid = seqid; }; -TFramedTransport.prototype.ensureAvailable = function(len) { +TFramedTransport.prototype.ensureAvailable = function (len) { if (this.readPos + len > this.inBuf.length) { throw new InputBufferUnderrunError(); } }; -TFramedTransport.prototype.read = function(len) { // this function will be used for each frames. +TFramedTransport.prototype.read = function (len) { + // this function will be used for each frames. this.ensureAvailable(len); var end = this.readPos + len; if (this.inBuf.length < end) { - throw new Error('read(' + len + ') failed - not enough data'); + throw new Error("read(" + len + ") failed - not enough data"); } var buf = this.inBuf.slice(this.readPos, end); @@ -96,68 +96,68 @@ TFramedTransport.prototype.read = function(len) { // this function will be used return buf; }; -TFramedTransport.prototype.readByte = function() { +TFramedTransport.prototype.readByte = function () { this.ensureAvailable(1); return binary.readByte(this.inBuf[this.readPos++]); }; -TFramedTransport.prototype.readI16 = function() { +TFramedTransport.prototype.readI16 = function () { this.ensureAvailable(2); var i16 = binary.readI16(this.inBuf, this.readPos); this.readPos += 2; return i16; }; -TFramedTransport.prototype.readI32 = function() { +TFramedTransport.prototype.readI32 = function () { this.ensureAvailable(4); var i32 = binary.readI32(this.inBuf, this.readPos); this.readPos += 4; return i32; }; -TFramedTransport.prototype.readDouble = function() { +TFramedTransport.prototype.readDouble = function () { this.ensureAvailable(8); var d = binary.readDouble(this.inBuf, this.readPos); this.readPos += 8; return d; }; -TFramedTransport.prototype.readString = function(len) { +TFramedTransport.prototype.readString = function (len) { this.ensureAvailable(len); - var str = this.inBuf.toString('utf8', this.readPos, this.readPos + len); + var str = this.inBuf.toString("utf8", this.readPos, this.readPos + len); this.readPos += len; return str; }; -TFramedTransport.prototype.borrow = function() { +TFramedTransport.prototype.borrow = function () { return { buf: this.inBuf, readIndex: this.readPos, - writeIndex: this.inBuf.length + writeIndex: this.inBuf.length, }; }; -TFramedTransport.prototype.consume = function(bytesConsumed) { +TFramedTransport.prototype.consume = function (bytesConsumed) { this.readPos += bytesConsumed; }; -TFramedTransport.prototype.write = function(buf, encoding) { - if (typeof(buf) === "string") { - buf = new Buffer(buf, encoding || 'utf8'); +TFramedTransport.prototype.write = function (buf, encoding) { + if (typeof buf === "string") { + buf = new Buffer(buf, encoding || "utf8"); } this.outBuffers.push(buf); this.outCount += buf.length; }; -TFramedTransport.prototype.flush = function() { +TFramedTransport.prototype.flush = function () { // If the seqid of the callback is available pass it to the onFlush // Then remove the current seqid var seqid = this._seqid; this._seqid = null; var out = new Buffer(this.outCount), - pos = 0; - this.outBuffers.forEach(function(buf) { + pos = 0; + this.outBuffers.forEach(function (buf) { buf.copy(out, pos, 0); pos += buf.length; }); diff --git a/lib/nodejs/lib/thrift/header_protocol.js b/lib/nodejs/lib/thrift/header_protocol.js index 8971751fb75..2a48a4d7d2a 100644 --- a/lib/nodejs/lib/thrift/header_protocol.js +++ b/lib/nodejs/lib/thrift/header_protocol.js @@ -16,10 +16,10 @@ * specific language governing permissions and limitations * under the License. */ -var util = require('util'); -var TBinaryProtocol = require('./binary_protocol'); -var TCompactProtocol = require('./compact_protocol'); -var THeaderTransport = require('./header_transport'); +var util = require("util"); +var TBinaryProtocol = require("./binary_protocol"); +var TCompactProtocol = require("./compact_protocol"); +var THeaderTransport = require("./header_transport"); var ProtocolMap = {}; ProtocolMap[THeaderTransport.SubprotocolId.BINARY] = TBinaryProtocol; @@ -54,204 +54,206 @@ util.inherits(THeaderProtocolError, Error); function THeaderProtocol(trans) { if (!(trans instanceof THeaderTransport)) { throw new THeaderProtocolError( - 'Only transports that inherit THeaderTransport can be' + - ' used with THeaderProtocol' + "Only transports that inherit THeaderTransport can be" + + " used with THeaderProtocol", ); } this.trans = trans; this.setProtocol(); -}; +} -THeaderProtocol.prototype.flush = function() { - // Headers must be written prior to flushing because because - // you need to calculate the length of the payload for the length - // field of the header +THeaderProtocol.prototype.flush = function () { + // Headers must be written prior to flushing because because + // you need to calculate the length of the payload for the length + // field of the header this.trans.writeHeaders(); return this.trans.flush(); }; -THeaderProtocol.prototype.writeMessageBegin = function(name, type, seqid) { +THeaderProtocol.prototype.writeMessageBegin = function (name, type, seqid) { return this.protocol.writeMessageBegin(name, type, seqid); }; -THeaderProtocol.prototype.writeMessageEnd = function() { +THeaderProtocol.prototype.writeMessageEnd = function () { return this.protocol.writeMessageEnd(); }; -THeaderProtocol.prototype.writeStructBegin = function(name) { +THeaderProtocol.prototype.writeStructBegin = function (name) { return this.protocol.writeStructBegin(name); }; -THeaderProtocol.prototype.writeStructEnd = function() { +THeaderProtocol.prototype.writeStructEnd = function () { return this.protocol.writeStructEnd(); }; -THeaderProtocol.prototype.writeFieldBegin = function(name, type, id) { +THeaderProtocol.prototype.writeFieldBegin = function (name, type, id) { return this.protocol.writeFieldBegin(name, type, id); -} +}; -THeaderProtocol.prototype.writeFieldEnd = function() { +THeaderProtocol.prototype.writeFieldEnd = function () { return this.protocol.writeFieldEnd(); }; -THeaderProtocol.prototype.writeFieldStop = function() { +THeaderProtocol.prototype.writeFieldStop = function () { return this.protocol.writeFieldStop(); }; -THeaderProtocol.prototype.writeMapBegin = function(ktype, vtype, size) { +THeaderProtocol.prototype.writeMapBegin = function (ktype, vtype, size) { return this.protocol.writeMapBegin(ktype, vtype, size); }; -THeaderProtocol.prototype.writeMapEnd = function() { +THeaderProtocol.prototype.writeMapEnd = function () { return this.protocol.writeMapEnd(); }; -THeaderProtocol.prototype.writeListBegin = function(etype, size) { +THeaderProtocol.prototype.writeListBegin = function (etype, size) { return this.protocol.writeListBegin(etype, size); }; -THeaderProtocol.prototype.writeListEnd = function() { +THeaderProtocol.prototype.writeListEnd = function () { return this.protocol.writeListEnd(); }; -THeaderProtocol.prototype.writeSetBegin = function(etype, size) { +THeaderProtocol.prototype.writeSetBegin = function (etype, size) { return this.protocol.writeSetBegin(etype, size); }; -THeaderProtocol.prototype.writeSetEnd = function() { +THeaderProtocol.prototype.writeSetEnd = function () { return this.protocol.writeSetEnd(); }; -THeaderProtocol.prototype.writeBool = function(b) { +THeaderProtocol.prototype.writeBool = function (b) { return this.protocol.writeBool(b); }; -THeaderProtocol.prototype.writeByte = function(b) { +THeaderProtocol.prototype.writeByte = function (b) { return this.protocol.writeByte(b); }; -THeaderProtocol.prototype.writeI16 = function(i16) { +THeaderProtocol.prototype.writeI16 = function (i16) { return this.protocol.writeI16(i16); }; -THeaderProtocol.prototype.writeI32 = function(i32) { +THeaderProtocol.prototype.writeI32 = function (i32) { return this.protocol.writeI32(i32); }; -THeaderProtocol.prototype.writeI64 = function(i64) { +THeaderProtocol.prototype.writeI64 = function (i64) { return this.protocol.writeI64(i64); }; -THeaderProtocol.prototype.writeDouble = function(dub) { +THeaderProtocol.prototype.writeDouble = function (dub) { return this.protocol.writeDouble(dub); }; -THeaderProtocol.prototype.writeStringOrBinary = function(name, encoding, arg) { +THeaderProtocol.prototype.writeStringOrBinary = function (name, encoding, arg) { return this.protocol.writeStringOrBinary(name, encoding, arg); }; -THeaderProtocol.prototype.writeString = function(arg) { +THeaderProtocol.prototype.writeString = function (arg) { return this.protocol.writeString(arg); }; -THeaderProtocol.prototype.writeBinary = function(arg) { +THeaderProtocol.prototype.writeBinary = function (arg) { return this.protocol.writeBinary(arg); }; -THeaderProtocol.prototype.readMessageBegin = function() { +THeaderProtocol.prototype.readMessageBegin = function () { this.trans.readHeaders(); this.setProtocol(); return this.protocol.readMessageBegin(); }; -THeaderProtocol.prototype.readMessageEnd = function() { +THeaderProtocol.prototype.readMessageEnd = function () { return this.protocol.readMessageEnd(); }; -THeaderProtocol.prototype.readStructBegin = function() { +THeaderProtocol.prototype.readStructBegin = function () { return this.protocol.readStructBegin(); }; -THeaderProtocol.prototype.readStructEnd = function() { +THeaderProtocol.prototype.readStructEnd = function () { return this.protocol.readStructEnd(); }; -THeaderProtocol.prototype.readFieldBegin = function() { +THeaderProtocol.prototype.readFieldBegin = function () { return this.protocol.readFieldBegin(); }; -THeaderProtocol.prototype.readFieldEnd = function() { +THeaderProtocol.prototype.readFieldEnd = function () { return this.protocol.readFieldEnd(); }; -THeaderProtocol.prototype.readMapBegin = function() { +THeaderProtocol.prototype.readMapBegin = function () { return this.protocol.readMapBegin(); }; -THeaderProtocol.prototype.readMapEnd = function() { +THeaderProtocol.prototype.readMapEnd = function () { return this.protocol.readMapEnd(); }; -THeaderProtocol.prototype.readListBegin = function() { +THeaderProtocol.prototype.readListBegin = function () { return this.protocol.readListBegin(); }; -THeaderProtocol.prototype.readListEnd = function() { +THeaderProtocol.prototype.readListEnd = function () { return this.protocol.readListEnd(); }; -THeaderProtocol.prototype.readSetBegin = function() { +THeaderProtocol.prototype.readSetBegin = function () { return this.protocol.readSetBegin(); }; -THeaderProtocol.prototype.readSetEnd = function() { +THeaderProtocol.prototype.readSetEnd = function () { return this.protocol.readSetEnd(); }; -THeaderProtocol.prototype.readBool = function() { +THeaderProtocol.prototype.readBool = function () { return this.protocol.readBool(); }; -THeaderProtocol.prototype.readByte = function() { +THeaderProtocol.prototype.readByte = function () { return this.protocol.readByte(); }; -THeaderProtocol.prototype.readI16 = function() { +THeaderProtocol.prototype.readI16 = function () { return this.protocol.readI16(); }; -THeaderProtocol.prototype.readI32 = function() { +THeaderProtocol.prototype.readI32 = function () { return this.protocol.readI32(); }; -THeaderProtocol.prototype.readI64 = function() { +THeaderProtocol.prototype.readI64 = function () { return this.protocol.readI64(); }; -THeaderProtocol.prototype.readDouble = function() { +THeaderProtocol.prototype.readDouble = function () { return this.protocol.readDouble(); }; -THeaderProtocol.prototype.readBinary = function() { +THeaderProtocol.prototype.readBinary = function () { return this.protocol.readBinary(); }; -THeaderProtocol.prototype.readString = function() { +THeaderProtocol.prototype.readString = function () { return this.protocol.readString(); }; -THeaderProtocol.prototype.getTransport = function() { +THeaderProtocol.prototype.getTransport = function () { return this.trans; }; -THeaderProtocol.prototype.skip = function(type) { +THeaderProtocol.prototype.skip = function (type) { return this.protocol.skip(type); }; -THeaderProtocol.prototype.setProtocol = function(subProtocolId) { +THeaderProtocol.prototype.setProtocol = function (subProtocolId) { var subProtocolId = this.trans.getProtocolId(); if (!ProtocolMap[subProtocolId]) { - throw new THeaderProtocolError('Headers not supported for protocol ' + subProtocolId); + throw new THeaderProtocolError( + "Headers not supported for protocol " + subProtocolId, + ); } this.protocol = new ProtocolMap[subProtocolId](this.trans); diff --git a/lib/nodejs/lib/thrift/header_transport.js b/lib/nodejs/lib/thrift/header_transport.js index ec8624b02a7..37da4924129 100644 --- a/lib/nodejs/lib/thrift/header_transport.js +++ b/lib/nodejs/lib/thrift/header_transport.js @@ -17,10 +17,10 @@ * under the License. */ -var util = require('util'); -var TCompactProtocol = require('./compact_protocol'); -var TBinaryProtocol = require('./binary_protocol'); -var InputBufferUnderrunError = require('./input_buffer_underrun_error'); +var util = require("util"); +var TCompactProtocol = require("./compact_protocol"); +var TBinaryProtocol = require("./binary_protocol"); +var InputBufferUnderrunError = require("./input_buffer_underrun_error"); function THeaderTransportError(message) { Error.call(this); @@ -45,51 +45,51 @@ var SEQID_OFFSET = 64 / 8; var HEADER_SIZE_OFFSET = 96 / 8; var HEADER_START_OFFSET = 112 / 8; -var HEADER_MAGIC = 0x0FFF; +var HEADER_MAGIC = 0x0fff; var TINFO_HEADER_KEY_VALUE_TYPE = 0x01; -var MAX_FRAME_SIZE = 0x3FFFFFFF; +var MAX_FRAME_SIZE = 0x3fffffff; - // A helper class for reading/writing varints. Uses - // TCompactProtocol under the hood +// A helper class for reading/writing varints. Uses +// TCompactProtocol under the hood function VarintHelper(readBuffer) { - var TBufferedTransport = require('./buffered_transport'); + var TBufferedTransport = require("./buffered_transport"); this.outputBuffer = null; var _this = this; - this.transport = new TBufferedTransport(null, function(output) { + this.transport = new TBufferedTransport(null, function (output) { _this.outputBuffer = output; }); this.transport.inBuf = readBuffer || Buffer.alloc(0); this.transport.writeCursor = this.transport.inBuf.length; this.protocol = new TCompactProtocol(this.transport); -}; +} -VarintHelper.prototype.readVarint32 = function() { +VarintHelper.prototype.readVarint32 = function () { return this.protocol.readVarint32(); }; -VarintHelper.prototype.writeVarint32 = function(i) { +VarintHelper.prototype.writeVarint32 = function (i) { this.protocol.writeVarint32(i); }; -VarintHelper.prototype.readString = function() { +VarintHelper.prototype.readString = function () { return this.protocol.readString(); }; -VarintHelper.prototype.writeString = function(str) { +VarintHelper.prototype.writeString = function (str) { this.protocol.writeString(str); -} +}; -VarintHelper.prototype.getOutCount = function() { +VarintHelper.prototype.getOutCount = function () { return this.transport.outCount; }; -VarintHelper.prototype.write = function(str) { +VarintHelper.prototype.write = function (str) { this.transport.write(str); }; -VarintHelper.prototype.toBuffer = function() { +VarintHelper.prototype.toBuffer = function () { this.transport.flush(); return this.outputBuffer; }; @@ -127,87 +127,90 @@ function THeaderTransport() { this.flags = null; this.seqid = 0; this.shouldWriteHeaders = true; -}; +} -var validateHeaders = function(key, value) { - if (typeof key !== 'string' || typeof value !== 'string') { - throw new THeaderTransportError('Header key and values must be strings'); +var validateHeaders = function (key, value) { + if (typeof key !== "string" || typeof value !== "string") { + throw new THeaderTransportError("Header key and values must be strings"); } }; -var validateProtocolId = function(protocolId) { +var validateProtocolId = function (protocolId) { var protocols = Object.keys(THeaderTransport.SubprotocolId); for (var i = 0; i < protocols.length; i++) { - if (protocolId === THeaderTransport.SubprotocolId[protocols[i]]) return true; + if (protocolId === THeaderTransport.SubprotocolId[protocols[i]]) + return true; } - throw new Error(protocolId + ' is not a valid protocol id'); + throw new Error(protocolId + " is not a valid protocol id"); }; -THeaderTransport.prototype.setSeqId = function(seqid) { +THeaderTransport.prototype.setSeqId = function (seqid) { this.seqid = seqid; }; -THeaderTransport.prototype.getSeqId = function(seqid) { +THeaderTransport.prototype.getSeqId = function (seqid) { return this.seqid; }; -THeaderTransport.prototype.setFlags = function(flags) { +THeaderTransport.prototype.setFlags = function (flags) { this.flags = flags; }; -THeaderTransport.prototype.getReadHeaders = function() { +THeaderTransport.prototype.getReadHeaders = function () { return this.rheaders; }; -THeaderTransport.prototype.setReadHeader = function(key, value) { +THeaderTransport.prototype.setReadHeader = function (key, value) { validateHeaders(key, value); this.rheaders[key] = value; }; -THeaderTransport.prototype.clearReadHeaders = function() { +THeaderTransport.prototype.clearReadHeaders = function () { this.rheaders = {}; }; -THeaderTransport.prototype.getWriteHeaders = function() { +THeaderTransport.prototype.getWriteHeaders = function () { return this.wheaders; }; -THeaderTransport.prototype.setWriteHeader = function(key, value) { +THeaderTransport.prototype.setWriteHeader = function (key, value) { validateHeaders(key, value); this.wheaders[key] = value; }; -THeaderTransport.prototype.clearWriteHeaders = function() { +THeaderTransport.prototype.clearWriteHeaders = function () { this.wheaders = {}; }; -THeaderTransport.prototype.setMaxFrameSize = function(frameSize) { +THeaderTransport.prototype.setMaxFrameSize = function (frameSize) { this.maxFrameSize = frameSize; }; -THeaderTransport.prototype.setProtocolId = function(protocolId) { +THeaderTransport.prototype.setProtocolId = function (protocolId) { validateProtocolId(protocolId); this.protocolId = protocolId; }; -THeaderTransport.prototype.getProtocolId = function() { +THeaderTransport.prototype.getProtocolId = function () { return this.protocolId; }; -var isUnframedBinary = function(readBuffer) { +var isUnframedBinary = function (readBuffer) { var version = readBuffer.readInt32BE(); return (version & TBinaryProtocol.VERSION_MASK) === TBinaryProtocol.VERSION_1; -} +}; -var isUnframedCompact = function(readBuffer) { +var isUnframedCompact = function (readBuffer) { var protocolId = readBuffer.readInt8(COMPACT_PROTOCOL_OFFSET); var version = readBuffer.readInt8(COMPACT_PROTOCOL_VERSION_OFFSET); - return protocolId === TCompactProtocol.PROTOCOL_ID && - (version & TCompactProtocol.VERSION_MASK) === TCompactProtocol.VERSION_N; -} + return ( + protocolId === TCompactProtocol.PROTOCOL_ID && + (version & TCompactProtocol.VERSION_MASK) === TCompactProtocol.VERSION_N + ); +}; -THeaderTransport.prototype.readHeaders = function() { +THeaderTransport.prototype.readHeaders = function () { var readBuffer = this.inBuf; var isUnframed = false; @@ -228,7 +231,7 @@ THeaderTransport.prototype.readHeaders = function() { var frameSize = readBuffer.readInt32BE(FRAME_SIZE_OFFSET); if (frameSize > this.maxFrameSize) { - throw new THeaderTransportError('Frame exceeds maximum frame size'); + throw new THeaderTransportError("Frame exceeds maximum frame size"); } var headerMagic = readBuffer.readInt16BE(HEADER_MAGIC_OFFSET); @@ -242,7 +245,7 @@ THeaderTransport.prototype.readHeaders = function() { var headerSize = readBuffer.readInt16BE(HEADER_SIZE_OFFSET) * 4; var endOfHeaders = HEADER_START_OFFSET + headerSize; if (endOfHeaders > readBuffer.length) { - throw new THeaderTransportError('Header size is greater than frame size'); + throw new THeaderTransportError("Header size is greater than frame size"); } var headerBuffer = Buffer.alloc(headerSize); @@ -252,7 +255,7 @@ THeaderTransport.prototype.readHeaders = function() { this.setProtocolId(varintHelper.readVarint32()); var transformCount = varintHelper.readVarint32(); if (transformCount > 0) { - throw new THeaderTransportError('Transforms are not yet supported'); + throw new THeaderTransportError("Transforms are not yet supported"); } while (true) { @@ -281,7 +284,7 @@ THeaderTransport.prototype.readHeaders = function() { return this.getReadHeaders(); }; -THeaderTransport.prototype.writeHeaders = function() { +THeaderTransport.prototype.writeHeaders = function () { // only write headers on the server if the client contained headers if (!this.shouldWriteHeaders) { return; @@ -305,11 +308,13 @@ THeaderTransport.prototype.writeHeaders = function() { varintWriter.writeString(value); } } - var headerSizeWithoutPadding = varintWriter.getOutCount(); + var headerSizeWithoutPadding = varintWriter.getOutCount(); var paddingNeeded = (4 - (headerSizeWithoutPadding % 4)) % 4; var headerSize = Buffer.alloc(2); - headerSize.writeInt16BE(Math.floor((headerSizeWithoutPadding + paddingNeeded) / 4)); + headerSize.writeInt16BE( + Math.floor((headerSizeWithoutPadding + paddingNeeded) / 4), + ); var paddingBuffer = Buffer.alloc(paddingNeeded); paddingBuffer.fill(0x00); diff --git a/lib/nodejs/lib/thrift/http_connection.js b/lib/nodejs/lib/thrift/http_connection.js index 17e0d0c2995..50d3312baad 100644 --- a/lib/nodejs/lib/thrift/http_connection.js +++ b/lib/nodejs/lib/thrift/http_connection.js @@ -16,17 +16,17 @@ * specific language governing permissions and limitations * under the License. */ -var util = require('util'); -var http = require('http'); -var https = require('https'); -var EventEmitter = require('events').EventEmitter; -var thrift = require('./thrift'); +var util = require("util"); +var http = require("http"); +var https = require("https"); +var EventEmitter = require("events").EventEmitter; +var thrift = require("./thrift"); -var TBufferedTransport = require('./buffered_transport'); -var TBinaryProtocol = require('./binary_protocol'); -var InputBufferUnderrunError = require('./input_buffer_underrun_error'); +var TBufferedTransport = require("./buffered_transport"); +var TBinaryProtocol = require("./binary_protocol"); +var InputBufferUnderrunError = require("./input_buffer_underrun_error"); -var createClient = require('./create_client'); +var createClient = require("./create_client"); /** * @class @@ -69,7 +69,7 @@ var createClient = require('./create_client'); * semantics implemented over the Node.js http.request() method. * @see {@link createHttpConnection} */ -var HttpConnection = exports.HttpConnection = function(options) { +var HttpConnection = (exports.HttpConnection = function (options) { //Initialize the emitter base object EventEmitter.call(this); @@ -88,17 +88,17 @@ var HttpConnection = exports.HttpConnection = function(options) { host: this.host, port: this.port, socketPath: this.socketPath, - path: this.options.path || '/', - method: 'POST', + path: this.options.path || "/", + method: "POST", headers: this.options.headers || {}, - responseType: this.options.responseType || null + responseType: this.options.responseType || null, }; for (var attrname in this.options.nodeOptions) { this.nodeOptions[attrname] = this.options.nodeOptions[attrname]; } /*jshint -W069 */ - if (! this.nodeOptions.headers['Connection']) { - this.nodeOptions.headers['Connection'] = 'keep-alive'; + if (!this.nodeOptions.headers["Connection"]) { + this.nodeOptions.headers["Connection"] = "keep-alive"; } /*jshint +W069 */ @@ -131,41 +131,42 @@ var HttpConnection = exports.HttpConnection = function(options) { delete self.seqId2Service[header.rseqid]; } /*jshint -W083 */ - client._reqs[dummy_seqid] = function(err, success){ + client._reqs[dummy_seqid] = function (err, success) { transport_with_data.commitPosition(); var clientCallback = client._reqs[header.rseqid]; delete client._reqs[header.rseqid]; if (clientCallback) { - process.nextTick(function() { + process.nextTick(function () { clientCallback(err, success); }); } }; /*jshint +W083 */ - if(client['recv_' + header.fname]) { - client['recv_' + header.fname](proto, header.mtype, dummy_seqid); + if (client["recv_" + header.fname]) { + client["recv_" + header.fname](proto, header.mtype, dummy_seqid); } else { delete client._reqs[dummy_seqid]; - self.emit("error", - new thrift.TApplicationException( - thrift.TApplicationExceptionType.WRONG_METHOD_NAME, - "Received a response to an unknown RPC function")); + self.emit( + "error", + new thrift.TApplicationException( + thrift.TApplicationExceptionType.WRONG_METHOD_NAME, + "Received a response to an unknown RPC function", + ), + ); } } - } - catch (e) { + } catch (e) { if (e instanceof InputBufferUnderrunError) { transport_with_data.rollbackPosition(); } else { - self.emit('error', e); + self.emit("error", e); } } } - //Response handler ////////////////////////////////////////////////// - this.responseCallback = function(response) { + this.responseCallback = function (response) { var data = []; var dataLen = 0; @@ -173,16 +174,18 @@ var HttpConnection = exports.HttpConnection = function(options) { this.emit("error", new THTTPException(response)); } - response.on('error', function (e) { + response.on("error", function (e) { self.emit("error", e); }); // When running directly under node, chunk will be a buffer, // however, when running in a Browser (e.g. Browserify), chunk // will be a string or an ArrayBuffer. - response.on('data', function (chunk) { - if ((typeof chunk == 'string') || - (Object.prototype.toString.call(chunk) == '[object Uint8Array]')) { + response.on("data", function (chunk) { + if ( + typeof chunk == "string" || + Object.prototype.toString.call(chunk) == "[object Uint8Array]" + ) { // Wrap ArrayBuffer/string in a Buffer so data[i].copy will work data.push(new Buffer(chunk)); } else { @@ -191,9 +194,9 @@ var HttpConnection = exports.HttpConnection = function(options) { dataLen += chunk.length; }); - response.on('end', function(){ + response.on("end", function () { var buf = new Buffer(dataLen); - for (var i=0, len=data.length, pos=0; i (negative ? 20 : 19)) { - throw new RangeError('Too many digits for Int64: ' + text); + throw new RangeError("Too many digits for Int64: " + text); } else { // Most significant (up to 5) digits var high5 = +text.slice(negative ? 1 : 0, -15); - var low = +text.slice(-15) + high5 * 2764472320; // The literal is 10^15 % 2^32 - var high = Math.floor(low / POW2_32) + high5 * 232830; // The literal is 10^15 / 2^&32 + var low = +text.slice(-15) + high5 * 2764472320; // The literal is 10^15 % 2^32 + var high = Math.floor(low / POW2_32) + high5 * 232830; // The literal is 10^15 / 2^&32 low = low % POW2_32; - if (high >= POW2_31 && - !(negative && high == POW2_31 && low == 0) // Allow minimum Int64 - ) { - throw new RangeError('The magnitude is too large for Int64.'); + if ( + high >= POW2_31 && + !(negative && high == POW2_31 && low == 0) // Allow minimum Int64 + ) { + throw new RangeError("The magnitude is too large for Int64."); } if (negative) { // 2's complement diff --git a/lib/nodejs/lib/thrift/json_parse.js b/lib/nodejs/lib/thrift/json_parse.js index 93b0bf2ab95..3d111c08e53 100644 --- a/lib/nodejs/lib/thrift/json_parse.js +++ b/lib/nodejs/lib/thrift/json_parse.js @@ -12,7 +12,6 @@ * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. */ - /*jslint for */ /*property @@ -20,280 +19,260 @@ prototype, push, r, t, text */ -var Int64 = require('node-int64'); -var Int64Util = require('./int64_util'); - -var json_parse = module.exports = (function () { - "use strict"; - -// This is a function that can parse a JSON text, producing a JavaScript -// data structure. It is a simple, recursive descent parser. It does not use -// eval or regular expressions, so it can be used as a model for implementing -// a JSON parser in other languages. - -// We are defining the function inside of another function to avoid creating -// global variables. - - var at, // The index of the current character - ch, // The current character - escapee = { - '"': '"', - '\\': '\\', - '/': '/', - b: '\b', - f: '\f', - n: '\n', - r: '\r', - t: '\t' - }, - text, - - error = function (m) { - -// Call error when something is wrong. - - throw new SyntaxError(m); - }, - - next = function (c) { - -// If a c parameter is provided, verify that it matches the current character. - - if (c && c !== ch) { - error("Expected '" + c + "' instead of '" + ch + "'"); - } - -// Get the next character. When there are no more characters, -// return the empty string. - - ch = text.charAt(at); - at += 1; - return ch; - }, - - number = function () { - -// Parse a number value. - - var number, - string = ''; - - if (ch === '-') { - string = '-'; - next('-'); - } - while (ch >= '0' && ch <= '9') { - string += ch; - next(); - } - if (ch === '.') { - string += '.'; - while (next() && ch >= '0' && ch <= '9') { - string += ch; - } - } - if (ch === 'e' || ch === 'E') { - string += ch; - next(); - if (ch === '-' || ch === '+') { - string += ch; - next(); - } - while (ch >= '0' && ch <= '9') { - string += ch; - next(); +var Int64 = require("node-int64"); +var Int64Util = require("./int64_util"); + +var json_parse = (module.exports = (function () { + "use strict"; + + // This is a function that can parse a JSON text, producing a JavaScript + // data structure. It is a simple, recursive descent parser. It does not use + // eval or regular expressions, so it can be used as a model for implementing + // a JSON parser in other languages. + + // We are defining the function inside of another function to avoid creating + // global variables. + + var at, // The index of the current character + ch, // The current character + escapee = { + '"': '"', + "\\": "\\", + "/": "/", + b: "\b", + f: "\f", + n: "\n", + r: "\r", + t: "\t", + }, + text, + error = function (m) { + // Call error when something is wrong. + + throw new SyntaxError(m); + }, + next = function (c) { + // If a c parameter is provided, verify that it matches the current character. + + if (c && c !== ch) { + error("Expected '" + c + "' instead of '" + ch + "'"); + } + + // Get the next character. When there are no more characters, + // return the empty string. + + ch = text.charAt(at); + at += 1; + return ch; + }, + number = function () { + // Parse a number value. + + var number, + string = ""; + + if (ch === "-") { + string = "-"; + next("-"); + } + while (ch >= "0" && ch <= "9") { + string += ch; + next(); + } + if (ch === ".") { + string += "."; + while (next() && ch >= "0" && ch <= "9") { + string += ch; + } + } + if (ch === "e" || ch === "E") { + string += ch; + next(); + if (ch === "-" || ch === "+") { + string += ch; + next(); + } + while (ch >= "0" && ch <= "9") { + string += ch; + next(); + } + } + number = +string; + if (!isFinite(number)) { + error("Bad number"); + } else if (number >= Int64.MAX_INT || number <= Int64.MIN_INT) { + // Return raw string for further process in TJSONProtocol + return string; + } else { + return number; + } + }, + string = function () { + // Parse a string value. + + var hex, + i, + string = "", + uffff; + + // When parsing for string values, we must look for " and \ characters. + + if (ch === '"') { + while (next()) { + if (ch === '"') { + next(); + return string; + } + if (ch === "\\") { + next(); + if (ch === "u") { + uffff = 0; + for (i = 0; i < 4; i += 1) { + hex = parseInt(next(), 16); + if (!isFinite(hex)) { + break; } - } - number = +string; - if (!isFinite(number)) { - error("Bad number"); - } else if (number >= Int64.MAX_INT || number <= Int64.MIN_INT) { - // Return raw string for further process in TJSONProtocol - return string; + uffff = uffff * 16 + hex; + } + string += String.fromCharCode(uffff); + } else if (typeof escapee[ch] === "string") { + string += escapee[ch]; } else { - return number; - } - }, - - string = function () { - -// Parse a string value. - - var hex, - i, - string = '', - uffff; - -// When parsing for string values, we must look for " and \ characters. - - if (ch === '"') { - while (next()) { - if (ch === '"') { - next(); - return string; - } - if (ch === '\\') { - next(); - if (ch === 'u') { - uffff = 0; - for (i = 0; i < 4; i += 1) { - hex = parseInt(next(), 16); - if (!isFinite(hex)) { - break; - } - uffff = uffff * 16 + hex; - } - string += String.fromCharCode(uffff); - } else if (typeof escapee[ch] === 'string') { - string += escapee[ch]; - } else { - break; - } - } else { - string += ch; - } - } + break; } - error("Bad string"); - }, - - white = function () { - -// Skip whitespace. - - while (ch && ch <= ' ') { - next(); - } - }, - - word = function () { - -// true, false, or null. - - switch (ch) { - case 't': - next('t'); - next('r'); - next('u'); - next('e'); - return true; - case 'f': - next('f'); - next('a'); - next('l'); - next('s'); - next('e'); - return false; - case 'n': - next('n'); - next('u'); - next('l'); - next('l'); - return null; - } - error("Unexpected '" + ch + "'"); - }, - - value, // Place holder for the value function. - - array = function () { - -// Parse an array value. - - var array = []; - - if (ch === '[') { - next('['); - white(); - if (ch === ']') { - next(']'); - return array; // empty array - } - while (ch) { - array.push(value()); - white(); - if (ch === ']') { - next(']'); - return array; - } - next(','); - white(); - } - } - error("Bad array"); - }, - - object = function () { - -// Parse an object value. - - var key, - object = {}; - - if (ch === '{') { - next('{'); - white(); - if (ch === '}') { - next('}'); - return object; // empty object - } - while (ch) { - key = string(); - white(); - next(':'); - if (Object.hasOwnProperty.call(object, key)) { - error('Duplicate key "' + key + '"'); - } - object[key] = value(); - white(); - if (ch === '}') { - next('}'); - return object; - } - next(','); - white(); - } - } - error("Bad object"); - }; - - value = function () { - -// Parse a JSON value. It could be an object, an array, a string, a number, -// or a word. - + } else { + string += ch; + } + } + } + error("Bad string"); + }, + white = function () { + // Skip whitespace. + + while (ch && ch <= " ") { + next(); + } + }, + word = function () { + // true, false, or null. + + switch (ch) { + case "t": + next("t"); + next("r"); + next("u"); + next("e"); + return true; + case "f": + next("f"); + next("a"); + next("l"); + next("s"); + next("e"); + return false; + case "n": + next("n"); + next("u"); + next("l"); + next("l"); + return null; + } + error("Unexpected '" + ch + "'"); + }, + value, // Place holder for the value function. + array = function () { + // Parse an array value. + + var array = []; + + if (ch === "[") { + next("["); white(); - switch (ch) { - case '{': - return object(); - case '[': - return array(); - case '"': - return string(); - case '-': - return number(); - default: - return ch >= '0' && ch <= '9' - ? number() - : word(); + if (ch === "]") { + next("]"); + return array; // empty array } - }; - -// Return the json_parse function. It will have access to all of the above -// functions and variables. + while (ch) { + array.push(value()); + white(); + if (ch === "]") { + next("]"); + return array; + } + next(","); + white(); + } + } + error("Bad array"); + }, + object = function () { + // Parse an object value. - return function (source) { - var result; + var key, + object = {}; - text = source; - at = 0; - ch = ' '; - result = value(); + if (ch === "{") { + next("{"); white(); - if (ch) { - error("Syntax error"); + if (ch === "}") { + next("}"); + return object; // empty object } - - return result; + while (ch) { + key = string(); + white(); + next(":"); + if (Object.hasOwnProperty.call(object, key)) { + error('Duplicate key "' + key + '"'); + } + object[key] = value(); + white(); + if (ch === "}") { + next("}"); + return object; + } + next(","); + white(); + } + } + error("Bad object"); }; -}()); + + value = function () { + // Parse a JSON value. It could be an object, an array, a string, a number, + // or a word. + + white(); + switch (ch) { + case "{": + return object(); + case "[": + return array(); + case '"': + return string(); + case "-": + return number(); + default: + return ch >= "0" && ch <= "9" ? number() : word(); + } + }; + + // Return the json_parse function. It will have access to all of the above + // functions and variables. + + return function (source) { + var result; + + text = source; + at = 0; + ch = " "; + result = value(); + white(); + if (ch) { + error("Syntax error"); + } + + return result; + }; +})()); diff --git a/lib/nodejs/lib/thrift/json_protocol.js b/lib/nodejs/lib/thrift/json_protocol.js index 7e2b7c90891..31dcb8196a7 100644 --- a/lib/nodejs/lib/thrift/json_protocol.js +++ b/lib/nodejs/lib/thrift/json_protocol.js @@ -17,15 +17,15 @@ * under the License. */ -var Int64 = require('node-int64'); -var Thrift = require('./thrift'); +var Int64 = require("node-int64"); +var Thrift = require("./thrift"); var Type = Thrift.Type; var util = require("util"); -var Int64Util = require('./int64_util'); -var json_parse = require('./json_parse'); +var Int64Util = require("./int64_util"); +var json_parse = require("./json_parse"); -var InputBufferUnderrunError = require('./input_buffer_underrun_error'); +var InputBufferUnderrunError = require("./input_buffer_underrun_error"); module.exports = TJSONProtocol; @@ -43,7 +43,7 @@ function TJSONProtocol(trans) { this.tstack = []; this.tpos = []; this.trans = trans; -}; +} /** * Thrift IDL type Id to string mapping. @@ -89,12 +89,12 @@ TJSONProtocol.RType.set = Type.SET; */ TJSONProtocol.Version = 1; -TJSONProtocol.prototype.flush = function() { +TJSONProtocol.prototype.flush = function () { this.writeToTransportIfStackIsFlushable(); return this.trans.flush(); }; -TJSONProtocol.prototype.writeToTransportIfStackIsFlushable = function() { +TJSONProtocol.prototype.writeToTransportIfStackIsFlushable = function () { if (this.tstack.length === 1) { this.trans.write(this.tstack.pop()); } @@ -106,20 +106,29 @@ TJSONProtocol.prototype.writeToTransportIfStackIsFlushable = function() { * @param {Thrift.MessageType} messageType - The type of method call. * @param {number} seqid - The sequence number of this call (always 0 in Apache Thrift). */ -TJSONProtocol.prototype.writeMessageBegin = function(name, messageType, seqid) { - this.tstack.push([TJSONProtocol.Version, '"' + name + '"', messageType, seqid]); +TJSONProtocol.prototype.writeMessageBegin = function ( + name, + messageType, + seqid, +) { + this.tstack.push([ + TJSONProtocol.Version, + '"' + name + '"', + messageType, + seqid, + ]); }; /** * Serializes the end of a Thrift RPC message. */ -TJSONProtocol.prototype.writeMessageEnd = function() { +TJSONProtocol.prototype.writeMessageEnd = function () { var obj = this.tstack.pop(); this.wobj = this.tstack.pop(); this.wobj.push(obj); - this.wbuf = '[' + this.wobj.join(',') + ']'; + this.wbuf = "[" + this.wobj.join(",") + "]"; // we assume there is nothing more to come so we write this.trans.write(this.wbuf); @@ -129,7 +138,7 @@ TJSONProtocol.prototype.writeMessageEnd = function() { * Serializes the beginning of a struct. * @param {string} name - The name of the struct. */ -TJSONProtocol.prototype.writeStructBegin = function(name) { +TJSONProtocol.prototype.writeStructBegin = function (name) { this.tpos.push(this.tstack.length); this.tstack.push({}); }; @@ -137,22 +146,22 @@ TJSONProtocol.prototype.writeStructBegin = function(name) { /** * Serializes the end of a struct. */ -TJSONProtocol.prototype.writeStructEnd = function() { +TJSONProtocol.prototype.writeStructEnd = function () { var p = this.tpos.pop(); var struct = this.tstack[p]; - var str = '{'; + var str = "{"; var first = true; for (var key in struct) { if (first) { first = false; } else { - str += ','; + str += ","; } - str += key + ':' + struct[key]; + str += key + ":" + struct[key]; } - str += '}'; + str += "}"; this.tstack[p] = str; this.writeToTransportIfStackIsFlushable(); @@ -164,26 +173,27 @@ TJSONProtocol.prototype.writeStructEnd = function() { * @param {Thrift.Protocol.Type} fieldType - The data type of the field. * @param {number} fieldId - The field's unique identifier. */ -TJSONProtocol.prototype.writeFieldBegin = function(name, fieldType, fieldId) { +TJSONProtocol.prototype.writeFieldBegin = function (name, fieldType, fieldId) { this.tpos.push(this.tstack.length); - this.tstack.push({ 'fieldId': '"' + - fieldId + '"', 'fieldType': TJSONProtocol.Type[fieldType] + this.tstack.push({ + fieldId: '"' + fieldId + '"', + fieldType: TJSONProtocol.Type[fieldType], }); }; /** * Serializes the end of a field. */ -TJSONProtocol.prototype.writeFieldEnd = function() { +TJSONProtocol.prototype.writeFieldEnd = function () { var value = this.tstack.pop(); var fieldInfo = this.tstack.pop(); - if (':' + value === ":[object Object]") { - this.tstack[this.tstack.length - 1][fieldInfo.fieldId] = '{' + - fieldInfo.fieldType + ':' + JSON.stringify(value) + '}'; + if (":" + value === ":[object Object]") { + this.tstack[this.tstack.length - 1][fieldInfo.fieldId] = + "{" + fieldInfo.fieldType + ":" + JSON.stringify(value) + "}"; } else { - this.tstack[this.tstack.length - 1][fieldInfo.fieldId] = '{' + - fieldInfo.fieldType + ':' + value + '}'; + this.tstack[this.tstack.length - 1][fieldInfo.fieldId] = + "{" + fieldInfo.fieldType + ":" + value + "}"; } this.tpos.pop(); @@ -193,8 +203,7 @@ TJSONProtocol.prototype.writeFieldEnd = function() { /** * Serializes the end of the set of fields for a struct. */ -TJSONProtocol.prototype.writeFieldStop = function() { -}; +TJSONProtocol.prototype.writeFieldStop = function () {}; /** * Serializes the beginning of a map collection. @@ -202,16 +211,20 @@ TJSONProtocol.prototype.writeFieldStop = function() { * @param {Thrift.Type} valType - The data type of the value. * @param {number} [size] - The number of elements in the map (ignored). */ -TJSONProtocol.prototype.writeMapBegin = function(keyType, valType, size) { +TJSONProtocol.prototype.writeMapBegin = function (keyType, valType, size) { //size is invalid, we'll set it on end. this.tpos.push(this.tstack.length); - this.tstack.push([TJSONProtocol.Type[keyType], TJSONProtocol.Type[valType], 0]); + this.tstack.push([ + TJSONProtocol.Type[keyType], + TJSONProtocol.Type[valType], + 0, + ]); }; /** * Serializes the end of a map. */ -TJSONProtocol.prototype.writeMapEnd = function() { +TJSONProtocol.prototype.writeMapEnd = function () { var p = this.tpos.pop(); if (p == this.tstack.length) { @@ -219,14 +232,14 @@ TJSONProtocol.prototype.writeMapEnd = function() { } if ((this.tstack.length - p - 1) % 2 !== 0) { - this.tstack.push(''); + this.tstack.push(""); } var size = (this.tstack.length - p - 1) / 2; this.tstack[p][this.tstack[p].length - 1] = size; - var map = '}'; + var map = "}"; var first = true; while (this.tstack.length > p + 1) { var v = this.tstack.pop(); @@ -234,16 +247,18 @@ TJSONProtocol.prototype.writeMapEnd = function() { if (first) { first = false; } else { - map = ',' + map; + map = "," + map; } - if (! isNaN(k)) { k = '"' + k + '"'; } //json "keys" need to be strings - map = k + ':' + v + map; + if (!isNaN(k)) { + k = '"' + k + '"'; + } //json "keys" need to be strings + map = k + ":" + v + map; } - map = '{' + map; + map = "{" + map; this.tstack[p].push(map); - this.tstack[p] = '[' + this.tstack[p].join(',') + ']'; + this.tstack[p] = "[" + this.tstack[p].join(",") + "]"; this.writeToTransportIfStackIsFlushable(); }; @@ -253,7 +268,7 @@ TJSONProtocol.prototype.writeMapEnd = function() { * @param {Thrift.Type} elemType - The data type of the elements. * @param {number} size - The number of elements in the list. */ -TJSONProtocol.prototype.writeListBegin = function(elemType, size) { +TJSONProtocol.prototype.writeListBegin = function (elemType, size) { this.tpos.push(this.tstack.length); this.tstack.push([TJSONProtocol.Type[elemType], size]); }; @@ -261,7 +276,7 @@ TJSONProtocol.prototype.writeListBegin = function(elemType, size) { /** * Serializes the end of a list. */ -TJSONProtocol.prototype.writeListEnd = function() { +TJSONProtocol.prototype.writeListEnd = function () { var p = this.tpos.pop(); while (this.tstack.length > p + 1) { @@ -270,7 +285,7 @@ TJSONProtocol.prototype.writeListEnd = function() { this.tstack[p].push(tmpVal); } - this.tstack[p] = '[' + this.tstack[p].join(',') + ']'; + this.tstack[p] = "[" + this.tstack[p].join(",") + "]"; this.writeToTransportIfStackIsFlushable(); }; @@ -280,15 +295,15 @@ TJSONProtocol.prototype.writeListEnd = function() { * @param {Thrift.Type} elemType - The data type of the elements. * @param {number} size - The number of elements in the list. */ -TJSONProtocol.prototype.writeSetBegin = function(elemType, size) { - this.tpos.push(this.tstack.length); - this.tstack.push([TJSONProtocol.Type[elemType], size]); +TJSONProtocol.prototype.writeSetBegin = function (elemType, size) { + this.tpos.push(this.tstack.length); + this.tstack.push([TJSONProtocol.Type[elemType], size]); }; /** * Serializes the end of a set. */ -TJSONProtocol.prototype.writeSetEnd = function() { +TJSONProtocol.prototype.writeSetEnd = function () { var p = this.tpos.pop(); while (this.tstack.length > p + 1) { @@ -297,33 +312,33 @@ TJSONProtocol.prototype.writeSetEnd = function() { this.tstack[p].push(tmpVal); } - this.tstack[p] = '[' + this.tstack[p].join(',') + ']'; + this.tstack[p] = "[" + this.tstack[p].join(",") + "]"; this.writeToTransportIfStackIsFlushable(); }; /** Serializes a boolean */ -TJSONProtocol.prototype.writeBool = function(bool) { +TJSONProtocol.prototype.writeBool = function (bool) { this.tstack.push(bool ? 1 : 0); }; /** Serializes a number */ -TJSONProtocol.prototype.writeByte = function(byte) { +TJSONProtocol.prototype.writeByte = function (byte) { this.tstack.push(byte); }; /** Serializes a number */ -TJSONProtocol.prototype.writeI16 = function(i16) { +TJSONProtocol.prototype.writeI16 = function (i16) { this.tstack.push(i16); }; /** Serializes a number */ -TJSONProtocol.prototype.writeI32 = function(i32) { +TJSONProtocol.prototype.writeI32 = function (i32) { this.tstack.push(i32); }; /** Serializes a number */ -TJSONProtocol.prototype.writeI64 = function(i64) { +TJSONProtocol.prototype.writeI64 = function (i64) { if (i64 instanceof Int64) { this.tstack.push(Int64Util.toDecimalString(i64)); } else { @@ -332,69 +347,81 @@ TJSONProtocol.prototype.writeI64 = function(i64) { }; /** Serializes a number */ -TJSONProtocol.prototype.writeDouble = function(dub) { +TJSONProtocol.prototype.writeDouble = function (dub) { this.tstack.push(dub); }; /** Serializes a string */ -TJSONProtocol.prototype.writeString = function(arg) { +TJSONProtocol.prototype.writeString = function (arg) { // We do not encode uri components for wire transfer: if (arg === null) { - this.tstack.push(null); + this.tstack.push(null); } else { - if (typeof arg === 'string') { - var str = arg; - } else if (arg instanceof Buffer) { - var str = arg.toString('utf8'); - } else { - throw new Error('writeString called without a string/Buffer argument: ' + arg); - } + if (typeof arg === "string") { + var str = arg; + } else if (arg instanceof Buffer) { + var str = arg.toString("utf8"); + } else { + throw new Error( + "writeString called without a string/Buffer argument: " + arg, + ); + } - // concat may be slower than building a byte buffer - var escapedString = ''; - for (var i = 0; i < str.length; i++) { - var ch = str.charAt(i); // a single double quote: " - if (ch === '\"') { - escapedString += '\\\"'; // write out as: \" - } else if (ch === '\\') { // a single backslash: \ - escapedString += '\\\\'; // write out as: \\ - /* Currently escaped forward slashes break TJSONProtocol. - * As it stands, we can simply pass forward slashes into - * our strings across the wire without being escaped. - * I think this is the protocol's bug, not thrift.js - * } else if(ch === '/') { // a single forward slash: / - * escapedString += '\\/'; // write out as \/ - * } - */ - } else if (ch === '\b') { // a single backspace: invisible - escapedString += '\\b'; // write out as: \b" - } else if (ch === '\f') { // a single formfeed: invisible - escapedString += '\\f'; // write out as: \f" - } else if (ch === '\n') { // a single newline: invisible - escapedString += '\\n'; // write out as: \n" - } else if (ch === '\r') { // a single return: invisible - escapedString += '\\r'; // write out as: \r" - } else if (ch === '\t') { // a single tab: invisible - escapedString += '\\t'; // write out as: \t" - } else { - escapedString += ch; // Else it need not be escaped - } + // concat may be slower than building a byte buffer + var escapedString = ""; + for (var i = 0; i < str.length; i++) { + var ch = str.charAt(i); // a single double quote: " + if (ch === '\"') { + escapedString += '\\\"'; // write out as: \" + } else if (ch === "\\") { + // a single backslash: \ + escapedString += "\\\\"; // write out as: \\ + /* Currently escaped forward slashes break TJSONProtocol. + * As it stands, we can simply pass forward slashes into + * our strings across the wire without being escaped. + * I think this is the protocol's bug, not thrift.js + * } else if(ch === '/') { // a single forward slash: / + * escapedString += '\\/'; // write out as \/ + * } + */ + } else if (ch === "\b") { + // a single backspace: invisible + escapedString += "\\b"; // write out as: \b" + } else if (ch === "\f") { + // a single formfeed: invisible + escapedString += "\\f"; // write out as: \f" + } else if (ch === "\n") { + // a single newline: invisible + escapedString += "\\n"; // write out as: \n" + } else if (ch === "\r") { + // a single return: invisible + escapedString += "\\r"; // write out as: \r" + } else if (ch === "\t") { + // a single tab: invisible + escapedString += "\\t"; // write out as: \t" + } else { + escapedString += ch; // Else it need not be escaped } - this.tstack.push('"' + escapedString + '"'); + } + this.tstack.push('"' + escapedString + '"'); } }; /** Serializes a string */ -TJSONProtocol.prototype.writeBinary = function(arg) { - if (typeof arg === 'string') { - var buf = new Buffer(arg, 'binary'); - } else if (arg instanceof Buffer || - Object.prototype.toString.call(arg) == '[object Uint8Array]') { +TJSONProtocol.prototype.writeBinary = function (arg) { + if (typeof arg === "string") { + var buf = new Buffer(arg, "binary"); + } else if ( + arg instanceof Buffer || + Object.prototype.toString.call(arg) == "[object Uint8Array]" + ) { var buf = arg; } else { - throw new Error('writeBinary called without a string/Buffer argument: ' + arg); + throw new Error( + "writeBinary called without a string/Buffer argument: " + arg, + ); } - this.tstack.push('"' + buf.toString('base64') + '"'); + this.tstack.push('"' + buf.toString("base64") + '"'); }; /** @@ -408,7 +435,7 @@ TJSONProtocol.prototype.writeBinary = function(arg) { * Deserializes the beginning of a message. * @returns {AnonReadMessageBeginReturn} */ -TJSONProtocol.prototype.readMessageBegin = function() { +TJSONProtocol.prototype.readMessageBegin = function () { this.rstack = []; this.rpos = []; @@ -419,7 +446,8 @@ TJSONProtocol.prototype.readMessageBegin = function() { } var cursor = transBuf.readIndex; - if (transBuf.buf[cursor] !== 0x5B) { //[ + if (transBuf.buf[cursor] !== 0x5b) { + //[ throw new Error("Malformed JSON input, no opening bracket"); } @@ -432,22 +460,27 @@ TJSONProtocol.prototype.readMessageBegin = function() { var chr = transBuf.buf[cursor]; //we use hexa charcode here because data[i] returns an int and not a char if (inString) { - if (chr === 0x22) { //" + if (chr === 0x22) { + //" inString = false; - } else if (chr === 0x5C) { //\ + } else if (chr === 0x5c) { + //\ //escaped character, skip cursor += 1; } } else { - if (chr === 0x5B) { //[ + if (chr === 0x5b) { + //[ openBracketCount += 1; - } else if (chr === 0x5D) { //] + } else if (chr === 0x5d) { + //] openBracketCount -= 1; if (openBracketCount === 0) { //end of json message detected break; } - } else if (chr === 0x22) { //" + } else if (chr === 0x22) { + //" inString = true; } } @@ -459,13 +492,15 @@ TJSONProtocol.prototype.readMessageBegin = function() { } //Reconstitute the JSON object and conume the necessary bytes - this.robj = json_parse(transBuf.buf.slice(transBuf.readIndex, cursor+1).toString()); + this.robj = json_parse( + transBuf.buf.slice(transBuf.readIndex, cursor + 1).toString(), + ); this.trans.consume(cursor + 1 - transBuf.readIndex); //Verify the protocol version var version = this.robj.shift(); if (version != TJSONProtocol.Version) { - throw new Error('Wrong thrift protocol version: ' + version); + throw new Error("Wrong thrift protocol version: " + version); } //Objectify the thrift message {name/type/sequence-number} for return @@ -479,17 +514,16 @@ TJSONProtocol.prototype.readMessageBegin = function() { }; /** Deserializes the end of a message. */ -TJSONProtocol.prototype.readMessageEnd = function() { -}; +TJSONProtocol.prototype.readMessageEnd = function () {}; /** * Deserializes the beginning of a struct. * @param {string} [name] - The name of the struct (ignored) * @returns {object} - An object with an empty string fname property */ -TJSONProtocol.prototype.readStructBegin = function() { +TJSONProtocol.prototype.readStructBegin = function () { var r = {}; - r.fname = ''; + r.fname = ""; //incase this is an array of structs if (this.rstack[this.rstack.length - 1] instanceof Array) { @@ -500,7 +534,7 @@ TJSONProtocol.prototype.readStructBegin = function() { }; /** Deserializes the end of a struct. */ -TJSONProtocol.prototype.readStructEnd = function() { +TJSONProtocol.prototype.readStructEnd = function () { this.rstack.pop(); }; @@ -515,14 +549,14 @@ TJSONProtocol.prototype.readStructEnd = function() { * Deserializes the beginning of a field. * @returns {AnonReadFieldBeginReturn} */ -TJSONProtocol.prototype.readFieldBegin = function() { +TJSONProtocol.prototype.readFieldBegin = function () { var r = {}; var fid = -1; var ftype = Type.STOP; //get a fieldId - for (var f in (this.rstack[this.rstack.length - 1])) { + for (var f in this.rstack[this.rstack.length - 1]) { if (f === null) { continue; } @@ -543,17 +577,18 @@ TJSONProtocol.prototype.readFieldBegin = function() { if (fid != -1) { //should only be 1 of these but this is the only //way to match a key - for (var i in (this.rstack[this.rstack.length - 1])) { + for (var i in this.rstack[this.rstack.length - 1]) { if (TJSONProtocol.RType[i] === null) { continue; } ftype = TJSONProtocol.RType[i]; - this.rstack[this.rstack.length - 1] = this.rstack[this.rstack.length - 1][i]; + this.rstack[this.rstack.length - 1] = + this.rstack[this.rstack.length - 1][i]; } } - r.fname = ''; + r.fname = ""; r.ftype = ftype; r.fid = fid; @@ -561,7 +596,7 @@ TJSONProtocol.prototype.readFieldBegin = function() { }; /** Deserializes the end of a field. */ -TJSONProtocol.prototype.readFieldEnd = function() { +TJSONProtocol.prototype.readFieldEnd = function () { var pos = this.rpos.pop(); //get back to the right place in the stack @@ -581,7 +616,7 @@ TJSONProtocol.prototype.readFieldEnd = function() { * Deserializes the beginning of a map. * @returns {AnonReadMapBeginReturn} */ -TJSONProtocol.prototype.readMapBegin = function() { +TJSONProtocol.prototype.readMapBegin = function () { var map = this.rstack.pop(); var first = map.shift(); if (first instanceof Array) { @@ -595,7 +630,6 @@ TJSONProtocol.prototype.readMapBegin = function() { r.vtype = TJSONProtocol.RType[map.shift()]; r.size = map.shift(); - this.rpos.push(this.rstack.length); this.rstack.push(map.shift()); @@ -603,7 +637,7 @@ TJSONProtocol.prototype.readMapBegin = function() { }; /** Deserializes the end of a map. */ -TJSONProtocol.prototype.readMapEnd = function() { +TJSONProtocol.prototype.readMapEnd = function () { this.readFieldEnd(); }; @@ -617,7 +651,7 @@ TJSONProtocol.prototype.readMapEnd = function() { * Deserializes the beginning of a list. * @returns {AnonReadColBeginReturn} */ -TJSONProtocol.prototype.readListBegin = function() { +TJSONProtocol.prototype.readListBegin = function () { var list = this.rstack[this.rstack.length - 1]; var r = {}; @@ -631,7 +665,7 @@ TJSONProtocol.prototype.readListBegin = function() { }; /** Deserializes the end of a list. */ -TJSONProtocol.prototype.readListEnd = function() { +TJSONProtocol.prototype.readListEnd = function () { var pos = this.rpos.pop() - 2; var st = this.rstack; st.pop(); @@ -644,33 +678,33 @@ TJSONProtocol.prototype.readListEnd = function() { * Deserializes the beginning of a set. * @returns {AnonReadColBeginReturn} */ -TJSONProtocol.prototype.readSetBegin = function() { +TJSONProtocol.prototype.readSetBegin = function () { return this.readListBegin(); }; /** Deserializes the end of a set. */ -TJSONProtocol.prototype.readSetEnd = function() { +TJSONProtocol.prototype.readSetEnd = function () { return this.readListEnd(); }; -TJSONProtocol.prototype.readBool = function() { - return this.readValue() == '1'; +TJSONProtocol.prototype.readBool = function () { + return this.readValue() == "1"; }; -TJSONProtocol.prototype.readByte = function() { +TJSONProtocol.prototype.readByte = function () { return this.readI32(); }; -TJSONProtocol.prototype.readI16 = function() { +TJSONProtocol.prototype.readI16 = function () { return this.readI32(); }; -TJSONProtocol.prototype.readI32 = function(f) { +TJSONProtocol.prototype.readI32 = function (f) { return +this.readValue(); -} +}; /** Returns the next value found in the protocol buffer */ -TJSONProtocol.prototype.readValue = function(f) { +TJSONProtocol.prototype.readValue = function (f) { if (f === undefined) { f = this.rstack[this.rstack.length - 1]; } @@ -702,9 +736,9 @@ TJSONProtocol.prototype.readValue = function(f) { return r.value; }; -TJSONProtocol.prototype.readI64 = function() { - var n = this.readValue() - if (typeof n === 'string') { +TJSONProtocol.prototype.readI64 = function () { + var n = this.readValue(); + if (typeof n === "string") { // Assuming no one is sending in 1.11111e+33 format return Int64Util.fromDecimalString(n); } else { @@ -712,15 +746,15 @@ TJSONProtocol.prototype.readI64 = function() { } }; -TJSONProtocol.prototype.readDouble = function() { +TJSONProtocol.prototype.readDouble = function () { return this.readI32(); }; -TJSONProtocol.prototype.readBinary = function() { - return new Buffer(this.readValue(), 'base64'); +TJSONProtocol.prototype.readBinary = function () { + return new Buffer(this.readValue(), "base64"); }; -TJSONProtocol.prototype.readString = function() { +TJSONProtocol.prototype.readString = function () { return this.readValue(); }; @@ -729,15 +763,15 @@ TJSONProtocol.prototype.readString = function() { * @readonly * @returns {Thrift.Transport} The underlying transport. */ -TJSONProtocol.prototype.getTransport = function() { +TJSONProtocol.prototype.getTransport = function () { return this.trans; }; /** * Method to arbitrarily skip over data */ -TJSONProtocol.prototype.skip = function(type) { - switch (type) { +TJSONProtocol.prototype.skip = function (type) { + switch (type) { case Type.BOOL: this.readBool(); break; @@ -794,6 +828,6 @@ TJSONProtocol.prototype.skip = function(type) { this.readListEnd(); break; default: - throw new Error("Invalid type: " + type); + throw new Error("Invalid type: " + type); } }; diff --git a/lib/nodejs/lib/thrift/log.js b/lib/nodejs/lib/thrift/log.js index 053e813618e..82d8a222cd7 100644 --- a/lib/nodejs/lib/thrift/log.js +++ b/lib/nodejs/lib/thrift/log.js @@ -17,17 +17,17 @@ * under the License. */ -var util = require('util'); +var util = require("util"); var disabled = function () {}; var logFunc = console.log; -var logLevel = 'error'; // default level +var logLevel = "error"; // default level function factory(level) { return function () { // better use spread syntax, but due to compatibility, // use legacy method here. - var args = ['thrift: [' + level + '] '].concat(Array.from(arguments)); + var args = ["thrift: [" + level + "] "].concat(Array.from(arguments)); return logFunc(util.format.apply(null, args)); }; } @@ -42,22 +42,22 @@ exports.setLogFunc = function (func) { logFunc = func; }; -var setLogLevel = exports.setLogLevel = function (level) { +var setLogLevel = (exports.setLogLevel = function (level) { trace = debug = error = warning = info = disabled; logLevel = level; switch (logLevel) { - case 'trace': - trace = factory('TRACE'); - case 'debug': - debug = factory('DEBUG'); - case 'error': - error = factory('ERROR'); - case 'warning': - warning = factory('WARN'); - case 'info': - info = factory('INFO'); + case "trace": + trace = factory("TRACE"); + case "debug": + debug = factory("DEBUG"); + case "error": + error = factory("ERROR"); + case "warning": + warning = factory("WARN"); + case "info": + info = factory("INFO"); } -}; +}); // set default setLogLevel(logLevel); diff --git a/lib/nodejs/lib/thrift/multiplexed_processor.js b/lib/nodejs/lib/thrift/multiplexed_processor.js index 67b62f7a29d..864d66d3257 100644 --- a/lib/nodejs/lib/thrift/multiplexed_processor.js +++ b/lib/nodejs/lib/thrift/multiplexed_processor.js @@ -16,31 +16,38 @@ * specific language governing permissions and limitations * under the License. */ -var Thrift = require('./thrift'); +var Thrift = require("./thrift"); exports.MultiplexedProcessor = MultiplexedProcessor; function MultiplexedProcessor(stream, options) { this.services = {}; -}; +} -MultiplexedProcessor.prototype.registerProcessor = function(name, handler) { +MultiplexedProcessor.prototype.registerProcessor = function (name, handler) { this.services[name] = handler; }; -MultiplexedProcessor.prototype.process = function(inp, out) { +MultiplexedProcessor.prototype.process = function (inp, out) { var begin = inp.readMessageBegin(); - if (begin.mtype != Thrift.MessageType.CALL && begin.mtype != Thrift.MessageType.ONEWAY) { - throw new Thrift.TException('TMultiplexedProcessor: Unexpected message type'); + if ( + begin.mtype != Thrift.MessageType.CALL && + begin.mtype != Thrift.MessageType.ONEWAY + ) { + throw new Thrift.TException( + "TMultiplexedProcessor: Unexpected message type", + ); } - var p = begin.fname.split(':'); + var p = begin.fname.split(":"); var sname = p[0]; var fname = p[1]; - if (! (sname in this.services)) { - throw new Thrift.TException('TMultiplexedProcessor: Unknown service: ' + sname); + if (!(sname in this.services)) { + throw new Thrift.TException( + "TMultiplexedProcessor: Unknown service: " + sname, + ); } //construct a proxy object which stubs the readMessageBegin @@ -51,11 +58,11 @@ MultiplexedProcessor.prototype.process = function(inp, out) { inpProxy[attr] = inp[attr]; } - inpProxy.readMessageBegin = function() { + inpProxy.readMessageBegin = function () { return { fname: fname, mtype: begin.mtype, - rseqid: begin.rseqid + rseqid: begin.rseqid, }; }; diff --git a/lib/nodejs/lib/thrift/multiplexed_protocol.js b/lib/nodejs/lib/thrift/multiplexed_protocol.js index d078aa2266f..1d2df96341b 100644 --- a/lib/nodejs/lib/thrift/multiplexed_protocol.js +++ b/lib/nodejs/lib/thrift/multiplexed_protocol.js @@ -16,55 +16,69 @@ * specific language governing permissions and limitations * under the License. */ -var util = require('util'); -var Thrift = require('./thrift'); +var util = require("util"); +var Thrift = require("./thrift"); exports.Multiplexer = Multiplexer; function Wrapper(serviceName, protocol, connection) { - function MultiplexProtocol(trans, strictRead, strictWrite) { protocol.call(this, trans, strictRead, strictWrite); - }; + } util.inherits(MultiplexProtocol, protocol); - MultiplexProtocol.prototype.writeMessageBegin = function(name, type, seqid) { + MultiplexProtocol.prototype.writeMessageBegin = function (name, type, seqid) { if (type == Thrift.MessageType.CALL || type == Thrift.MessageType.ONEWAY) { connection.seqId2Service[seqid] = serviceName; - MultiplexProtocol.super_.prototype.writeMessageBegin.call(this, - serviceName + ":" + name, - type, - seqid); + MultiplexProtocol.super_.prototype.writeMessageBegin.call( + this, + serviceName + ":" + name, + type, + seqid, + ); } else { - MultiplexProtocol.super_.prototype.writeMessageBegin.call(this, name, type, seqid); + MultiplexProtocol.super_.prototype.writeMessageBegin.call( + this, + name, + type, + seqid, + ); } }; return MultiplexProtocol; -}; +} function Multiplexer() { this.seqid = 0; -}; +} -Multiplexer.prototype.createClient = function(serviceName, ServiceClient, connection) { +Multiplexer.prototype.createClient = function ( + serviceName, + ServiceClient, + connection, +) { if (ServiceClient.Client) { ServiceClient = ServiceClient.Client; } - var writeCb = function(buf, seqid) { - connection.write(buf,seqid); + var writeCb = function (buf, seqid) { + connection.write(buf, seqid); }; var transport = new connection.transport(undefined, writeCb); - var protocolWrapper = new Wrapper(serviceName, connection.protocol, connection); + var protocolWrapper = new Wrapper( + serviceName, + connection.protocol, + connection, + ); var client = new ServiceClient(transport, protocolWrapper); var self = this; - client.new_seqid = function() { + client.new_seqid = function () { self.seqid += 1; return self.seqid; }; - if (typeof connection.client !== 'object') { + if (typeof connection.client !== "object") { connection.client = {}; } connection.client[serviceName] = client; diff --git a/lib/nodejs/lib/thrift/ohos_connection.js b/lib/nodejs/lib/thrift/ohos_connection.js index 95bf122790a..34afaae1858 100644 --- a/lib/nodejs/lib/thrift/ohos_connection.js +++ b/lib/nodejs/lib/thrift/ohos_connection.js @@ -16,15 +16,15 @@ * specific language governing permissions and limitations * under the License. */ -var util = require('util'); -var EventEmitter = require('events').EventEmitter; -var thrift = require('./thrift'); +var util = require("util"); +var EventEmitter = require("events").EventEmitter; +var thrift = require("./thrift"); -var TBufferedTransport = require('./buffered_transport'); -var TBinaryProtocol = require('./binary_protocol'); -var InputBufferUnderrunError = require('./input_buffer_underrun_error'); +var TBufferedTransport = require("./buffered_transport"); +var TBinaryProtocol = require("./binary_protocol"); +var InputBufferUnderrunError = require("./input_buffer_underrun_error"); -var createClient = require('./create_client'); +var createClient = require("./create_client"); /** * @class @@ -69,7 +69,7 @@ var createClient = require('./create_client'); * semantics implemented over the OpenHarmonyOS http.request() method. * @see {@link createOhosConnection} */ -var OhosConnection = exports.OhosConnection = function(options) { +var OhosConnection = (exports.OhosConnection = function (options) { //Initialize the emitter base object EventEmitter.call(this); @@ -78,12 +78,12 @@ var OhosConnection = exports.OhosConnection = function(options) { this.options = options || {}; this.host = this.options.host; this.port = this.options.port; - this.path = this.options.path || '/'; + this.path = this.options.path || "/"; //OpenHarmonyOS needs URL for initiating an HTTP request. this.url = this.port === 80 - ? this.host.replace(/\/$/, '') + this.path - : this.host.replace(/\/$/, '') + ':' + this.port + this.path; + ? this.host.replace(/\/$/, "") + this.path + : this.host.replace(/\/$/, "") + ":" + this.port + this.path; this.transport = this.options.transport || TBufferedTransport; this.protocol = this.options.protocol || TBinaryProtocol; //Inherit method from OpenHarmonyOS HTTP module @@ -91,17 +91,17 @@ var OhosConnection = exports.OhosConnection = function(options) { //Prepare HTTP request options this.requestOptions = { - method: 'POST', + method: "POST", header: this.options.header || {}, readTimeout: this.options.readTimeout || 60000, - connectTimeout: this.options.connectTimeout || 60000 + connectTimeout: this.options.connectTimeout || 60000, }; for (var attrname in this.options.requestOptions) { this.requestOptions[attrname] = this.options.requestOptions[attrname]; } /*jshint -W069 */ - if (!this.requestOptions.header['Connection']) { - this.requestOptions.header['Connection'] = 'keep-alive'; + if (!this.requestOptions.header["Connection"]) { + this.requestOptions.header["Connection"] = "keep-alive"; } /*jshint +W069 */ @@ -134,60 +134,61 @@ var OhosConnection = exports.OhosConnection = function(options) { delete self.seqId2Service[header.rseqid]; } /*jshint -W083 */ - client._reqs[dummy_seqid] = function(err, success){ + client._reqs[dummy_seqid] = function (err, success) { transport_with_data.commitPosition(); var clientCallback = client._reqs[header.rseqid]; delete client._reqs[header.rseqid]; if (clientCallback) { - process.nextTick(function() { + process.nextTick(function () { clientCallback(err, success); }); } }; /*jshint +W083 */ - if(client['recv_' + header.fname]) { - client['recv_' + header.fname](proto, header.mtype, dummy_seqid); + if (client["recv_" + header.fname]) { + client["recv_" + header.fname](proto, header.mtype, dummy_seqid); } else { delete client._reqs[dummy_seqid]; - self.emit("error", - new thrift.TApplicationException( - thrift.TApplicationExceptionType.WRONG_METHOD_NAME, - "Received a response to an unknown RPC function")); + self.emit( + "error", + new thrift.TApplicationException( + thrift.TApplicationExceptionType.WRONG_METHOD_NAME, + "Received a response to an unknown RPC function", + ), + ); } } - } - catch (e) { + } catch (e) { if (e instanceof InputBufferUnderrunError) { transport_with_data.rollbackPosition(); } else { - self.emit('error', e); + self.emit("error", e); } } } - //Response handler ////////////////////////////////////////////////// - this.responseCallback = function(error, response) { + this.responseCallback = function (error, response) { //Response will be a struct like: // https://developer.harmonyos.com/en/docs/documentation/doc-references/js-apis-net-http-0000001168304341#section15920192914312 var data = []; var dataLen = 0; if (error) { - self.emit('error', error); + self.emit("error", error); return; } if (!response || response.responseCode !== 200) { - self.emit('error', new THTTPException(response)); + self.emit("error", new THTTPException(response)); } // With OpenHarmonyOS running in a Browser (e.g. Browserify), chunk // will be a string or an ArrayBuffer. if ( - typeof response.result == 'string' || - Object.prototype.toString.call(response.result) == '[object Uint8Array]' + typeof response.result == "string" || + Object.prototype.toString.call(response.result) == "[object Uint8Array]" ) { // Wrap ArrayBuffer/string in a Buffer so data[i].copy will work data.push(Buffer.from(response.result)); @@ -211,7 +212,7 @@ var OhosConnection = exports.OhosConnection = function(options) { * @event {error} the "error" event is raised upon request failure passing the * Node.js error object to the listener. */ - this.write = function(data) { + this.write = function (data) { //To initiate multiple HTTP requests, we must create an HttpRequest object // for each HTTP request var http = self.createHttp(); @@ -223,7 +224,7 @@ var OhosConnection = exports.OhosConnection = function(options) { opts.extraData = data.toString(); http.request(self.url, opts, self.responseCallback); }; -}; +}); util.inherits(OhosConnection, EventEmitter); /** @@ -236,7 +237,7 @@ util.inherits(OhosConnection, EventEmitter); * @returns {OhosConnection} The connection object. * @see {@link ConnectOptions} */ -exports.createOhosConnection = function(createHttp, host, port, options) { +exports.createOhosConnection = function (createHttp, host, port, options) { options.createHttp = createHttp; options.host = host; options.port = port || 80; @@ -256,6 +257,6 @@ function THTTPException(response) { this.response = response; this.type = thrift.TApplicationExceptionType.PROTOCOL_ERROR; this.message = - 'Received a response with a bad HTTP status code: ' + response.responseCode; + "Received a response with a bad HTTP status code: " + response.responseCode; } util.inherits(THTTPException, thrift.TApplicationException); diff --git a/lib/nodejs/lib/thrift/protocol.js b/lib/nodejs/lib/thrift/protocol.js index a70ebe2872d..6eb88da061b 100644 --- a/lib/nodejs/lib/thrift/protocol.js +++ b/lib/nodejs/lib/thrift/protocol.js @@ -17,6 +17,6 @@ * under the License. */ -module.exports.TBinaryProtocol = require('./binary_protocol'); -module.exports.TCompactProtocol = require('./compact_protocol'); -module.exports.TJSONProtocol = require('./json_protocol'); +module.exports.TBinaryProtocol = require("./binary_protocol"); +module.exports.TCompactProtocol = require("./compact_protocol"); +module.exports.TJSONProtocol = require("./json_protocol"); diff --git a/lib/nodejs/lib/thrift/server.js b/lib/nodejs/lib/thrift/server.js index 16b74eaafc4..80a369fd194 100644 --- a/lib/nodejs/lib/thrift/server.js +++ b/lib/nodejs/lib/thrift/server.js @@ -17,14 +17,14 @@ * under the License. */ -var constants = require('constants'); -var net = require('net'); -var tls = require('tls'); +var constants = require("constants"); +var net = require("net"); +var tls = require("tls"); -var TBufferedTransport = require('./buffered_transport'); -var TBinaryProtocol = require('./binary_protocol'); -var THeaderProtocol = require('./header_protocol'); -var InputBufferUnderrunError = require('./input_buffer_underrun_error'); +var TBufferedTransport = require("./buffered_transport"); +var TBinaryProtocol = require("./binary_protocol"); +var THeaderProtocol = require("./header_protocol"); +var InputBufferUnderrunError = require("./input_buffer_underrun_error"); /** * Create a Thrift server which can serve one or multiple services. @@ -33,75 +33,82 @@ var InputBufferUnderrunError = require('./input_buffer_underrun_error'); * @param {ServerOptions} options - Optional additional server configuration. * @returns {object} - The Apache Thrift Multiplex Server. */ -exports.createMultiplexServer = function(processor, options) { - var transport = (options && options.transport) ? options.transport : TBufferedTransport; - var protocol = (options && options.protocol) ? options.protocol : TBinaryProtocol; +exports.createMultiplexServer = function (processor, options) { + var transport = + options && options.transport ? options.transport : TBufferedTransport; + var protocol = + options && options.protocol ? options.protocol : TBinaryProtocol; function serverImpl(stream) { var self = this; - stream.on('error', function(err) { - self.emit('error', err); + stream.on("error", function (err) { + self.emit("error", err); }); - stream.on('data', transport.receiver(function(transportWithData) { - var input = new protocol(transportWithData); - var outputCb = function(buf) { - try { + stream.on( + "data", + transport.receiver(function (transportWithData) { + var input = new protocol(transportWithData); + var outputCb = function (buf) { + try { stream.write(buf); - } catch (err) { - self.emit('error', err); + } catch (err) { + self.emit("error", err); stream.end(); - } - }; + } + }; - var output = new protocol(new transport(undefined, outputCb)); - // Read and write need to be performed on the same transport - // for THeaderProtocol because we should only respond with - // headers if the request contains headers - if (protocol === THeaderProtocol) { - output = input; - output.trans.onFlush = outputCb; - } - - try { - do { - processor.process(input, output); - transportWithData.commitPosition(); - } while (true); - } catch (err) { - if (err instanceof InputBufferUnderrunError) { - //The last data in the buffer was not a complete message, wait for the rest - transportWithData.rollbackPosition(); - } - else if (err.message === "Invalid type: undefined") { - //No more data in the buffer - //This trap is a bit hackish - //The next step to improve the node behavior here is to have - // the compiler generated process method throw a more explicit - // error when the network buffer is empty (regardles of the - // protocol/transport stack in use) and replace this heuristic. - // Also transports should probably not force upper layers to - // manage their buffer positions (i.e. rollbackPosition() and - // commitPosition() should be eliminated in lieu of a transport - // encapsulated buffer management strategy.) - transportWithData.rollbackPosition(); + var output = new protocol(new transport(undefined, outputCb)); + // Read and write need to be performed on the same transport + // for THeaderProtocol because we should only respond with + // headers if the request contains headers + if (protocol === THeaderProtocol) { + output = input; + output.trans.onFlush = outputCb; } - else { - //Unexpected error - self.emit('error', err); - stream.end(); + + try { + do { + processor.process(input, output); + transportWithData.commitPosition(); + } while (true); + } catch (err) { + if (err instanceof InputBufferUnderrunError) { + //The last data in the buffer was not a complete message, wait for the rest + transportWithData.rollbackPosition(); + } else if (err.message === "Invalid type: undefined") { + //No more data in the buffer + //This trap is a bit hackish + //The next step to improve the node behavior here is to have + // the compiler generated process method throw a more explicit + // error when the network buffer is empty (regardles of the + // protocol/transport stack in use) and replace this heuristic. + // Also transports should probably not force upper layers to + // manage their buffer positions (i.e. rollbackPosition() and + // commitPosition() should be eliminated in lieu of a transport + // encapsulated buffer management strategy.) + transportWithData.rollbackPosition(); + } else { + //Unexpected error + self.emit("error", err); + stream.end(); + } } - } - })); + }), + ); - stream.on('end', function() { + stream.on("end", function () { stream.end(); }); } if (options && options.tls) { - if (!('secureProtocol' in options.tls) && !('secureOptions' in options.tls)) { + if ( + !("secureProtocol" in options.tls) && + !("secureOptions" in options.tls) + ) { options.tls.secureProtocol = "SSLv23_method"; - options.tls.secureOptions = constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3; + options.tls.secureOptions = + constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3; } return tls.createServer(options.tls, serverImpl); } else { @@ -115,7 +122,7 @@ exports.createMultiplexServer = function(processor, options) { * @param {ServerOptions} options - Optional additional server configuration. * @returns {object} - The Apache Thrift Multiplex Server. */ -exports.createServer = function(processor, handler, options) { +exports.createServer = function (processor, handler, options) { if (processor.Processor) { processor = processor.Processor; } diff --git a/lib/nodejs/lib/thrift/thrift.js b/lib/nodejs/lib/thrift/thrift.js index 3a693f6da58..741a493835d 100644 --- a/lib/nodejs/lib/thrift/thrift.js +++ b/lib/nodejs/lib/thrift/thrift.js @@ -16,9 +16,9 @@ * specific language governing permissions and limitations * under the License. */ -var util = require('util'); +var util = require("util"); -var Type = exports.Type = { +var Type = (exports.Type = { STOP: 0, VOID: 1, BOOL: 2, @@ -35,14 +35,14 @@ var Type = exports.Type = { SET: 14, LIST: 15, UTF8: 16, - UTF16: 17 -}; + UTF16: 17, +}); exports.MessageType = { CALL: 1, REPLY: 2, EXCEPTION: 3, - ONEWAY: 4 + ONEWAY: 4, }; exports.TException = TException; @@ -55,10 +55,10 @@ function TException(message) { this.name = this.constructor.name; this.message = message; -}; +} util.inherits(TException, Error); -var TApplicationExceptionType = exports.TApplicationExceptionType = { +var TApplicationExceptionType = (exports.TApplicationExceptionType = { UNKNOWN: 0, UNKNOWN_METHOD: 1, INVALID_MESSAGE_TYPE: 2, @@ -69,8 +69,8 @@ var TApplicationExceptionType = exports.TApplicationExceptionType = { PROTOCOL_ERROR: 7, INVALID_TRANSFORM: 8, INVALID_PROTOCOL: 9, - UNSUPPORTED_CLIENT_TYPE: 10 -}; + UNSUPPORTED_CLIENT_TYPE: 10, +}); exports.TApplicationException = TApplicationException; @@ -83,73 +83,73 @@ function TApplicationException(type, message) { this.type = type || TApplicationExceptionType.UNKNOWN; this.name = this.constructor.name; this.message = message; -}; +} util.inherits(TApplicationException, TException); -TApplicationException.prototype[Symbol.for("read")] = TApplicationException.prototype.read = function(input) { - var ftype; - var ret = input.readStructBegin('TApplicationException'); +TApplicationException.prototype[Symbol.for("read")] = + TApplicationException.prototype.read = function (input) { + var ftype; + var ret = input.readStructBegin("TApplicationException"); - while(1){ + while (1) { ret = input.readFieldBegin(); - if(ret.ftype == Type.STOP) + if (ret.ftype == Type.STOP) break; + + switch (ret.fid) { + case 1: + if (ret.ftype == Type.STRING) { + ret = input.readString(); + this.message = ret; + } else { + ret = input.skip(ret.ftype); + } + break; + case 2: + if (ret.ftype == Type.I32) { + ret = input.readI32(); + this.type = ret; + } else { + ret = input.skip(ret.ftype); + } + break; + default: + ret = input.skip(ret.ftype); break; - - switch(ret.fid){ - case 1: - if( ret.ftype == Type.STRING ){ - ret = input.readString(); - this.message = ret; - } else { - ret = input.skip(ret.ftype); - } - break; - case 2: - if( ret.ftype == Type.I32 ){ - ret = input.readI32(); - this.type = ret; - } else { - ret = input.skip(ret.ftype); - } - break; - default: - ret = input.skip(ret.ftype); - break; } input.readFieldEnd(); - } - input.readStructEnd(); -}; + } + input.readStructEnd(); + }; -TApplicationException.prototype[Symbol.for("write")] = TApplicationException.prototype.write = function(output){ - output.writeStructBegin('TApplicationException'); +TApplicationException.prototype[Symbol.for("write")] = + TApplicationException.prototype.write = function (output) { + output.writeStructBegin("TApplicationException"); - if (this.message) { - output.writeFieldBegin('message', Type.STRING, 1); + if (this.message) { + output.writeFieldBegin("message", Type.STRING, 1); output.writeString(this.message); output.writeFieldEnd(); - } + } - if (this.code) { - output.writeFieldBegin('type', Type.I32, 2); + if (this.code) { + output.writeFieldBegin("type", Type.I32, 2); output.writeI32(this.code); output.writeFieldEnd(); - } + } - output.writeFieldStop(); - output.writeStructEnd(); -}; + output.writeFieldStop(); + output.writeStructEnd(); + }; -var TProtocolExceptionType = exports.TProtocolExceptionType = { +var TProtocolExceptionType = (exports.TProtocolExceptionType = { UNKNOWN: 0, INVALID_DATA: 1, NEGATIVE_SIZE: 2, SIZE_LIMIT: 3, BAD_VERSION: 4, NOT_IMPLEMENTED: 5, - DEPTH_LIMIT: 6 -}; - + DEPTH_LIMIT: 6, +}); exports.TProtocolException = TProtocolException; @@ -162,74 +162,74 @@ function TProtocolException(type, message) { this.name = this.constructor.name; this.type = type; this.message = message; -}; +} util.inherits(TProtocolException, Error); -exports.objectLength = function(obj) { +exports.objectLength = function (obj) { return Object.keys(obj).length; }; -exports.inherits = function(constructor, superConstructor) { +exports.inherits = function (constructor, superConstructor) { util.inherits(constructor, superConstructor); }; var copyList, copyMap; -copyList = function(lst, types) { - - if (!lst) {return lst; } +copyList = function (lst, types) { + if (!lst) { + return lst; + } var type; if (types.shift === undefined) { type = types; - } - else { + } else { type = types[0]; } var Type = type; - var len = lst.length, result = [], i, val; + var len = lst.length, + result = [], + i, + val; for (i = 0; i < len; i++) { val = lst[i]; if (type === null) { result.push(val); - } - else if (type === copyMap || type === copyList) { + } else if (type === copyMap || type === copyList) { result.push(type(val, types.slice(1))); - } - else { + } else { result.push(new Type(val)); } } return result; }; -copyMap = function(obj, types){ - - if (!obj) {return obj; } +copyMap = function (obj, types) { + if (!obj) { + return obj; + } var type; if (types.shift === undefined) { type = types; - } - else { + } else { type = types[0]; } var Type = type; - var result = {}, val; - for(var prop in obj) { - if(obj.hasOwnProperty(prop)) { + var result = {}, + val; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { val = obj[prop]; if (type === null) { result[prop] = val; - } - else if (type === copyMap || type === copyList) { + } else if (type === copyMap || type === copyList) { result[prop] = type(val, types.slice(1)); - } - else { + } else { result[prop] = new Type(val); } } diff --git a/lib/nodejs/lib/thrift/transport.js b/lib/nodejs/lib/thrift/transport.js index 59daa987d54..b3ba39495b7 100644 --- a/lib/nodejs/lib/thrift/transport.js +++ b/lib/nodejs/lib/thrift/transport.js @@ -17,6 +17,6 @@ * under the License. */ -module.exports.TBufferedTransport = require('./buffered_transport'); -module.exports.TFramedTransport = require('./framed_transport'); -module.exports.InputBufferUnderrunError = require('./input_buffer_underrun_error'); +module.exports.TBufferedTransport = require("./buffered_transport"); +module.exports.TFramedTransport = require("./framed_transport"); +module.exports.InputBufferUnderrunError = require("./input_buffer_underrun_error"); diff --git a/lib/nodejs/lib/thrift/web_server.js b/lib/nodejs/lib/thrift/web_server.js index a33f47aedb7..f49f654b116 100644 --- a/lib/nodejs/lib/thrift/web_server.js +++ b/lib/nodejs/lib/thrift/web_server.js @@ -16,19 +16,20 @@ * specific language governing permissions and limitations * under the License. */ -var http = require('http'); -var https = require('https'); +var http = require("http"); +var https = require("https"); var url = require("url"); var path = require("path"); var fs = require("fs"); var crypto = require("crypto"); -var log = require('./log'); +var log = require("./log"); -var MultiplexedProcessor = require('./multiplexed_processor').MultiplexedProcessor; +var MultiplexedProcessor = + require("./multiplexed_processor").MultiplexedProcessor; -var TBufferedTransport = require('./buffered_transport'); -var TBinaryProtocol = require('./binary_protocol'); -var InputBufferUnderrunError = require('./input_buffer_underrun_error'); +var TBufferedTransport = require("./buffered_transport"); +var TBinaryProtocol = require("./binary_protocol"); +var InputBufferUnderrunError = require("./input_buffer_underrun_error"); // WSFrame constructor and prototype ///////////////////////////////////////////////////////////////////// @@ -82,36 +83,43 @@ var wsFrame = { * @param {Boolean} binEncoding - True for binary encoding, false for text encoding * @returns {Buffer} - The WebSocket frame, ready to send */ - encode: function(data, mask, binEncoding) { - var frame = new Buffer(wsFrame.frameSizeFromData(data, mask)); - //Byte 0 - FIN & OPCODE - frame[0] = wsFrame.fin.FIN + - (binEncoding ? wsFrame.frameOpCodes.BIN : wsFrame.frameOpCodes.TEXT); - //Byte 1 or 1-3 or 1-9 - MASK FLAG & SIZE - var payloadOffset = 2; - if (data.length < 0x7E) { - frame[1] = data.length + (mask ? wsFrame.mask.TO_SERVER : wsFrame.mask.TO_CLIENT); - } else if (data.length < 0xFFFF) { - frame[1] = 0x7E + (mask ? wsFrame.mask.TO_SERVER : wsFrame.mask.TO_CLIENT); - frame.writeUInt16BE(data.length, 2, true); - payloadOffset = 4; - } else { - frame[1] = 0x7F + (mask ? wsFrame.mask.TO_SERVER : wsFrame.mask.TO_CLIENT); - frame.writeUInt32BE(0, 2, true); - frame.writeUInt32BE(data.length, 6, true); - payloadOffset = 10; - } - //MASK - if (mask) { - mask.copy(frame, payloadOffset, 0, 4); - payloadOffset += 4; - } - //Payload - data.copy(frame, payloadOffset); - if (mask) { - wsFrame.applyMask(frame.slice(payloadOffset), frame.slice(payloadOffset-4,payloadOffset)); - } - return frame; + encode: function (data, mask, binEncoding) { + var frame = new Buffer(wsFrame.frameSizeFromData(data, mask)); + //Byte 0 - FIN & OPCODE + frame[0] = + wsFrame.fin.FIN + + (binEncoding ? wsFrame.frameOpCodes.BIN : wsFrame.frameOpCodes.TEXT); + //Byte 1 or 1-3 or 1-9 - MASK FLAG & SIZE + var payloadOffset = 2; + if (data.length < 0x7e) { + frame[1] = + data.length + (mask ? wsFrame.mask.TO_SERVER : wsFrame.mask.TO_CLIENT); + } else if (data.length < 0xffff) { + frame[1] = + 0x7e + (mask ? wsFrame.mask.TO_SERVER : wsFrame.mask.TO_CLIENT); + frame.writeUInt16BE(data.length, 2, true); + payloadOffset = 4; + } else { + frame[1] = + 0x7f + (mask ? wsFrame.mask.TO_SERVER : wsFrame.mask.TO_CLIENT); + frame.writeUInt32BE(0, 2, true); + frame.writeUInt32BE(data.length, 6, true); + payloadOffset = 10; + } + //MASK + if (mask) { + mask.copy(frame, payloadOffset, 0, 4); + payloadOffset += 4; + } + //Payload + data.copy(frame, payloadOffset); + if (mask) { + wsFrame.applyMask( + frame.slice(payloadOffset), + frame.slice(payloadOffset - 4, payloadOffset), + ); + } + return frame; }, /** @@ -127,7 +135,7 @@ var wsFrame = { * @property {Boolean} FIN - True is the message is complete */ - /** Decodes a WebSocket frame + /** Decodes a WebSocket frame * * @param {Buffer} frame - The raw inbound frame, if this is a continuation * frame it must have a mask property with the mask. @@ -135,54 +143,55 @@ var wsFrame = { * * @see {@link WSDecodeResult} */ - decode: function(frame) { - var result = { - data: null, - mask: null, - binEncoding: false, - nextFrame: null, - FIN: true - }; - - //Byte 0 - FIN & OPCODE - if (wsFrame.fin.FIN != (frame[0] & wsFrame.fin.FIN)) { - result.FIN = false; - } - result.binEncoding = (wsFrame.frameOpCodes.BIN == (frame[0] & wsFrame.frameOpCodes.BIN)); - //Byte 1 or 1-3 or 1-9 - SIZE - var lenByte = (frame[1] & 0x0000007F); - var len = lenByte; - var dataOffset = 2; - if (lenByte == 0x7E) { - len = frame.readUInt16BE(2); - dataOffset = 4; - } else if (lenByte == 0x7F) { - len = frame.readUInt32BE(6); - dataOffset = 10; - } - //MASK - if (wsFrame.mask.TO_SERVER == (frame[1] & wsFrame.mask.TO_SERVER)) { - result.mask = new Buffer(4); - frame.copy(result.mask, 0, dataOffset, dataOffset + 4); - dataOffset += 4; - } - //Payload - result.data = new Buffer(len); - frame.copy(result.data, 0, dataOffset, dataOffset+len); - if (result.mask) { - wsFrame.applyMask(result.data, result.mask); - } - //Next Frame - if (frame.length > dataOffset+len) { - result.nextFrame = new Buffer(frame.length - (dataOffset+len)); - frame.copy(result.nextFrame, 0, dataOffset+len, frame.length); - } - //Don't forward control frames - if (frame[0] & wsFrame.frameOpCodes.FINCTRL) { - result.data = null; - } + decode: function (frame) { + var result = { + data: null, + mask: null, + binEncoding: false, + nextFrame: null, + FIN: true, + }; + + //Byte 0 - FIN & OPCODE + if (wsFrame.fin.FIN != (frame[0] & wsFrame.fin.FIN)) { + result.FIN = false; + } + result.binEncoding = + wsFrame.frameOpCodes.BIN == (frame[0] & wsFrame.frameOpCodes.BIN); + //Byte 1 or 1-3 or 1-9 - SIZE + var lenByte = frame[1] & 0x0000007f; + var len = lenByte; + var dataOffset = 2; + if (lenByte == 0x7e) { + len = frame.readUInt16BE(2); + dataOffset = 4; + } else if (lenByte == 0x7f) { + len = frame.readUInt32BE(6); + dataOffset = 10; + } + //MASK + if (wsFrame.mask.TO_SERVER == (frame[1] & wsFrame.mask.TO_SERVER)) { + result.mask = new Buffer(4); + frame.copy(result.mask, 0, dataOffset, dataOffset + 4); + dataOffset += 4; + } + //Payload + result.data = new Buffer(len); + frame.copy(result.data, 0, dataOffset, dataOffset + len); + if (result.mask) { + wsFrame.applyMask(result.data, result.mask); + } + //Next Frame + if (frame.length > dataOffset + len) { + result.nextFrame = new Buffer(frame.length - (dataOffset + len)); + frame.copy(result.nextFrame, 0, dataOffset + len, frame.length); + } + //Don't forward control frames + if (frame[0] & wsFrame.frameOpCodes.FINCTRL) { + result.data = null; + } - return result; + return result; }, /** Masks/Unmasks data @@ -190,12 +199,12 @@ var wsFrame = { * @param {Buffer} data - data to mask/unmask in place * @param {Buffer} mask - the mask */ - applyMask: function(data, mask){ + applyMask: function (data, mask) { //TODO: look into xoring words at a time var dataLen = data.length; var maskLen = mask.length; for (var i = 0; i < dataLen; i++) { - data[i] = data[i] ^ mask[i%maskLen]; + data[i] = data[i] ^ mask[i % maskLen]; } }, @@ -204,35 +213,34 @@ var wsFrame = { * @param {Buffer} data - data.length is the assumed payload size * @param {Boolean} mask - true if a mask will be sent (TO_SERVER) */ - frameSizeFromData: function(data, mask) { + frameSizeFromData: function (data, mask) { var headerSize = 10; - if (data.length < 0x7E) { + if (data.length < 0x7e) { headerSize = 2; - } else if (data.length < 0xFFFF) { + } else if (data.length < 0xffff) { headerSize = 4; } return headerSize + data.length + (mask ? 4 : 0); }, frameOpCodes: { - CONT: 0x00, - TEXT: 0x01, - BIN: 0x02, - CTRL: 0x80 + CONT: 0x00, + TEXT: 0x01, + BIN: 0x02, + CTRL: 0x80, }, mask: { TO_SERVER: 0x80, - TO_CLIENT: 0x00 + TO_CLIENT: 0x00, }, fin: { CONT: 0x00, - FIN: 0x80 - } + FIN: 0x80, + }, }; - // createWebServer constructor and options ///////////////////////////////////////////////////////////////////// @@ -272,20 +280,20 @@ var wsFrame = { * @param {ServerOptions} options - The server configuration. * @returns {object} - The Apache Thrift Web Server. */ -exports.createWebServer = function(options) { +exports.createWebServer = function (options) { var baseDir = options.files; var contentTypesByExtension = { - '.txt': 'text/plain', - '.html': 'text/html', - '.css': 'text/css', - '.xml': 'application/xml', - '.json': 'application/json', - '.js': 'application/javascript', - '.jpg': 'image/jpeg', - '.jpeg': 'image/jpeg', - '.gif': 'image/gif', - '.png': 'image/png', - '.svg': 'image/svg+xml' + ".txt": "text/plain", + ".html": "text/html", + ".css": "text/css", + ".xml": "application/xml", + ".json": "application/json", + ".js": "application/javascript", + ".jpg": "image/jpeg", + ".jpeg": "image/jpeg", + ".gif": "image/gif", + ".png": "image/png", + ".svg": "image/svg+xml", }; //Setup all of the services @@ -302,8 +310,9 @@ exports.createWebServer = function(options) { // IDL Compiler generated class housing the processor. Also, the options property // for a Processor has been called both cls and processor at different times. We // support any of the four possibilities here. - var processor = (svcObj.processor) ? (svcObj.processor.Processor || svcObj.processor) : - (svcObj.cls.Processor || svcObj.cls); + var processor = svcObj.processor + ? svcObj.processor.Processor || svcObj.processor + : svcObj.cls.Processor || svcObj.cls; //Processors can be supplied as constructed objects with handlers already embedded, // if a handler is provided we construct a new processor, if not we use the processor // object directly @@ -322,9 +331,18 @@ exports.createWebServer = function(options) { if (request.headers.origin && options.cors) { if (options.cors["*"] || options.cors[request.headers.origin]) { //Allow, origin allowed - response.setHeader("access-control-allow-origin", request.headers.origin); - response.setHeader("access-control-allow-methods", "GET, POST, OPTIONS"); - response.setHeader("access-control-allow-headers", "content-type, accept"); + response.setHeader( + "access-control-allow-origin", + request.headers.origin, + ); + response.setHeader( + "access-control-allow-methods", + "GET, POST, OPTIONS", + ); + response.setHeader( + "access-control-allow-headers", + "content-type, accept", + ); response.setHeader("access-control-max-age", "60"); return true; } else { @@ -336,19 +354,21 @@ exports.createWebServer = function(options) { return true; } - //Handle OPTIONS method (CORS) /////////////////////////////////////////////////// function processOptions(request, response) { if (VerifyCORSAndSetHeaders(request, response)) { - response.writeHead("204", "No Content", {"content-length": 0}); + response.writeHead("204", "No Content", { "content-length": 0 }); } else { - response.writeHead("403", "Origin " + request.headers.origin + " not allowed", {}); + response.writeHead( + "403", + "Origin " + request.headers.origin + " not allowed", + {}, + ); } response.end(); } - //Handle POST methods (TXHRTransport) /////////////////////////////////////////////////// function processPost(request, response) { @@ -363,39 +383,47 @@ exports.createWebServer = function(options) { //Verify CORS requirements if (!VerifyCORSAndSetHeaders(request, response)) { - response.writeHead("403", "Origin " + request.headers.origin + " not allowed", {}); + response.writeHead( + "403", + "Origin " + request.headers.origin + " not allowed", + {}, + ); response.end(); return; } //Process XHR payload - request.on('data', svc.transport.receiver(function(transportWithData) { - var input = new svc.protocol(transportWithData); - var output = new svc.protocol(new svc.transport(undefined, function(buf) { + request.on( + "data", + svc.transport.receiver(function (transportWithData) { + var input = new svc.protocol(transportWithData); + var output = new svc.protocol( + new svc.transport(undefined, function (buf) { + try { + response.writeHead(200); + response.end(buf); + } catch (err) { + response.writeHead(500); + response.end(); + } + }), + ); + try { - response.writeHead(200); - response.end(buf); + svc.processor.process(input, output); + transportWithData.commitPosition(); } catch (err) { - response.writeHead(500); - response.end(); - } - })); - - try { - svc.processor.process(input, output); - transportWithData.commitPosition(); - } catch (err) { - if (err instanceof InputBufferUnderrunError) { - transportWithData.rollbackPosition(); - } else { - response.writeHead(500); - response.end(); + if (err instanceof InputBufferUnderrunError) { + transportWithData.rollbackPosition(); + } else { + response.writeHead(500); + response.end(); + } } - } - })); + }), + ); } - //Handle GET methods (Static Page Server) /////////////////////////////////////////////////// function processGet(request, response) { @@ -408,7 +436,11 @@ exports.createWebServer = function(options) { //Verify CORS requirements if (!VerifyCORSAndSetHeaders(request, response)) { - response.writeHead("403", "Origin " + request.headers.origin + " not allowed", {}); + response.writeHead( + "403", + "Origin " + request.headers.origin + " not allowed", + {}, + ); response.end(); return; } @@ -424,18 +456,18 @@ exports.createWebServer = function(options) { return; } - fs.exists(filename, function(exists) { - if(!exists) { + fs.exists(filename, function (exists) { + if (!exists) { response.writeHead(404); response.end(); return; } if (fs.statSync(filename).isDirectory()) { - filename += '/index.html'; + filename += "/index.html"; } - fs.readFile(filename, "binary", function(err, file) { + fs.readFile(filename, "binary", function (err, file) { if (err) { response.writeHead(500); response.end(err + "\n"); @@ -456,30 +488,29 @@ exports.createWebServer = function(options) { }); } - //Handle WebSocket calls (TWebSocketTransport) /////////////////////////////////////////////////// function processWS(data, socket, svc, binEncoding) { - svc.transport.receiver(function(transportWithData) { + svc.transport.receiver(function (transportWithData) { var input = new svc.protocol(transportWithData); - var output = new svc.protocol(new svc.transport(undefined, function(buf) { - try { - var frame = wsFrame.encode(buf, null, binEncoding); - socket.write(frame); - } catch (err) { - //TODO: Add better error processing - } - })); + var output = new svc.protocol( + new svc.transport(undefined, function (buf) { + try { + var frame = wsFrame.encode(buf, null, binEncoding); + socket.write(frame); + } catch (err) { + //TODO: Add better error processing + } + }), + ); try { svc.processor.process(input, output); transportWithData.commitPosition(); - } - catch (err) { + } catch (err) { if (err instanceof InputBufferUnderrunError) { transportWithData.rollbackPosition(); - } - else { + } else { //TODO: Add better error processing } } @@ -498,69 +529,83 @@ exports.createWebServer = function(options) { // - GET static files, // - POST XHR Thrift services // - OPTIONS CORS requests - server.on('request', function(request, response) { - if (request.method === 'POST') { - processPost(request, response); - } else if (request.method === 'GET') { - processGet(request, response); - } else if (request.method === 'OPTIONS') { - processOptions(request, response); - } else { - response.writeHead(500); - response.end(); - } - }).on('upgrade', function(request, socket, head) { - //Lookup service - var svc; - try { - svc = services[Object.keys(services)[0]]; - } catch(e) { - socket.write("HTTP/1.1 403 No Apache Thrift Service available\r\n\r\n"); - return; - } - //Perform upgrade - var hash = crypto.createHash("sha1"); - hash.update(request.headers['sec-websocket-key'] + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"); - socket.write("HTTP/1.1 101 Switching Protocols\r\n" + - "Upgrade: websocket\r\n" + - "Connection: Upgrade\r\n" + - "Sec-WebSocket-Accept: " + hash.digest("base64") + "\r\n" + - "Sec-WebSocket-Origin: " + request.headers.origin + "\r\n" + - "Sec-WebSocket-Location: ws://" + request.headers.host + request.url + "\r\n" + - "\r\n"); - //Handle WebSocket traffic - var data = null; - socket.on('data', function(frame) { + server + .on("request", function (request, response) { + if (request.method === "POST") { + processPost(request, response); + } else if (request.method === "GET") { + processGet(request, response); + } else if (request.method === "OPTIONS") { + processOptions(request, response); + } else { + response.writeHead(500); + response.end(); + } + }) + .on("upgrade", function (request, socket, head) { + //Lookup service + var svc; try { - while (frame) { - var result = wsFrame.decode(frame); - //Prepend any existing decoded data - if (data) { - if (result.data) { - var newData = new Buffer(data.length + result.data.length); - data.copy(newData); - result.data.copy(newData, data.length); - result.data = newData; + svc = services[Object.keys(services)[0]]; + } catch (e) { + socket.write("HTTP/1.1 403 No Apache Thrift Service available\r\n\r\n"); + return; + } + //Perform upgrade + var hash = crypto.createHash("sha1"); + hash.update( + request.headers["sec-websocket-key"] + + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", + ); + socket.write( + "HTTP/1.1 101 Switching Protocols\r\n" + + "Upgrade: websocket\r\n" + + "Connection: Upgrade\r\n" + + "Sec-WebSocket-Accept: " + + hash.digest("base64") + + "\r\n" + + "Sec-WebSocket-Origin: " + + request.headers.origin + + "\r\n" + + "Sec-WebSocket-Location: ws://" + + request.headers.host + + request.url + + "\r\n" + + "\r\n", + ); + //Handle WebSocket traffic + var data = null; + socket.on("data", function (frame) { + try { + while (frame) { + var result = wsFrame.decode(frame); + //Prepend any existing decoded data + if (data) { + if (result.data) { + var newData = new Buffer(data.length + result.data.length); + data.copy(newData); + result.data.copy(newData, data.length); + result.data = newData; + } else { + result.data = data; + } + data = null; + } + //If this completes a message process it + if (result.FIN) { + processWS(result.data, socket, svc, result.binEncoding); } else { - result.data = data; + data = result.data; } - data = null; + //Prepare next frame for decoding (if any) + frame = result.nextFrame; } - //If this completes a message process it - if (result.FIN) { - processWS(result.data, socket, svc, result.binEncoding); - } else { - data = result.data; - } - //Prepare next frame for decoding (if any) - frame = result.nextFrame; + } catch (e) { + log.error("TWebSocketTransport Exception: " + e); + socket.destroy(); } - } catch(e) { - log.error('TWebSocketTransport Exception: ' + e); - socket.destroy(); - } + }); }); - }); //Return the server return server; diff --git a/lib/nodejs/lib/thrift/ws_connection.js b/lib/nodejs/lib/thrift/ws_connection.js index 8ee8f6eca18..878a5724ff3 100644 --- a/lib/nodejs/lib/thrift/ws_connection.js +++ b/lib/nodejs/lib/thrift/ws_connection.js @@ -16,17 +16,17 @@ * specific language governing permissions and limitations * under the License. */ -var util = require('util'); -var WebSocket = require('isomorphic-ws'); +var util = require("util"); +var WebSocket = require("isomorphic-ws"); var EventEmitter = require("events").EventEmitter; -var thrift = require('./thrift'); +var thrift = require("./thrift"); -var TBufferedTransport = require('./buffered_transport'); -var TJSONProtocol = require('./json_protocol'); -var InputBufferUnderrunError = require('./input_buffer_underrun_error'); +var TBufferedTransport = require("./buffered_transport"); +var TJSONProtocol = require("./json_protocol"); +var InputBufferUnderrunError = require("./input_buffer_underrun_error"); -var createClient = require('./create_client'); -var jsEnv = require('browser-or-node'); +var createClient = require("./create_client"); +var jsEnv = require("browser-or-node"); exports.WSConnection = WSConnection; /** @@ -95,38 +95,38 @@ function WSConnection(host, port, options) { this.wsOptions = { host: this.host, port: this.port || 80, - path: this.options.path || '/', - headers: this.options.headers || {} + path: this.options.path || "/", + headers: this.options.headers || {}, }; for (var attrname in this.options.wsOptions) { this.wsOptions[attrname] = this.options.wsOptions[attrname]; } -}; +} util.inherits(WSConnection, EventEmitter); -WSConnection.prototype.__reset = function() { +WSConnection.prototype.__reset = function () { this.socket = null; //The web socket this.send_pending = []; //Buffers/Callback pairs waiting to be sent }; -WSConnection.prototype.__onOpen = function() { +WSConnection.prototype.__onOpen = function () { this.emit("open"); if (this.send_pending.length > 0) { //If the user made calls before the connection was fully //open, send them now - this.send_pending.forEach(function(data) { + this.send_pending.forEach(function (data) { this.socket.send(data); }, this); this.send_pending = []; } }; -WSConnection.prototype.__onClose = function(evt) { +WSConnection.prototype.__onClose = function (evt) { this.emit("close"); this.__reset(); }; -WSConnection.prototype.__decodeCallback = function(transport_with_data) { +WSConnection.prototype.__decodeCallback = function (transport_with_data) { var proto = new this.protocol(transport_with_data); try { while (true) { @@ -151,7 +151,7 @@ WSConnection.prototype.__decodeCallback = function(transport_with_data) { delete this.seqId2Service[header.rseqid]; } /*jshint -W083 */ - client._reqs[dummy_seqid] = function(err, success) { + client._reqs[dummy_seqid] = function (err, success) { transport_with_data.commitPosition(); var clientCallback = client._reqs[header.rseqid]; delete client._reqs[header.rseqid]; @@ -160,14 +160,17 @@ WSConnection.prototype.__decodeCallback = function(transport_with_data) { } }; /*jshint +W083 */ - if (client['recv_' + header.fname]) { - client['recv_' + header.fname](proto, header.mtype, dummy_seqid); + if (client["recv_" + header.fname]) { + client["recv_" + header.fname](proto, header.mtype, dummy_seqid); } else { delete client._reqs[dummy_seqid]; - this.emit("error", + this.emit( + "error", new thrift.TApplicationException( thrift.TApplicationExceptionType.WRONG_METHOD_NAME, - "Received a response to an unknown RPC function")); + "Received a response to an unknown RPC function", + ), + ); } } } catch (e) { @@ -179,20 +182,19 @@ WSConnection.prototype.__decodeCallback = function(transport_with_data) { } }; -WSConnection.prototype.__onData = function(data) { +WSConnection.prototype.__onData = function (data) { if (Object.prototype.toString.call(data) === "[object ArrayBuffer]") { data = new Uint8Array(data); } var buf = new Buffer(data); this.transport.receiver(this.__decodeCallback.bind(this))(buf); - }; -WSConnection.prototype.__onMessage = function(evt) { +WSConnection.prototype.__onMessage = function (evt) { this.__onData(evt.data); }; -WSConnection.prototype.__onError = function(evt) { +WSConnection.prototype.__onError = function (evt) { this.emit("error", evt); this.socket.close(); }; @@ -202,14 +204,14 @@ WSConnection.prototype.__onError = function(evt) { * @readonly * @returns {boolean} */ -WSConnection.prototype.isOpen = function() { +WSConnection.prototype.isOpen = function () { return this.socket && this.socket.readyState === this.socket.OPEN; }; /** * Opens the transport connection */ -WSConnection.prototype.open = function() { +WSConnection.prototype.open = function () { //If OPEN/CONNECTING/CLOSING ignore additional opens if (this.socket && this.socket.readyState !== this.socket.CLOSED) { return; @@ -220,7 +222,7 @@ WSConnection.prototype.open = function() { } else { this.socket = new WebSocket(this.uri(), "", this.wsOptions); } - this.socket.binaryType = 'arraybuffer'; + this.socket.binaryType = "arraybuffer"; this.socket.onopen = this.__onOpen.bind(this); this.socket.onmessage = this.__onMessage.bind(this); this.socket.onerror = this.__onError.bind(this); @@ -230,7 +232,7 @@ WSConnection.prototype.open = function() { /** * Closes the transport connection */ -WSConnection.prototype.close = function() { +WSConnection.prototype.close = function () { this.socket.close(); }; @@ -238,19 +240,22 @@ WSConnection.prototype.close = function() { * Return URI for the connection * @returns {string} URI */ -WSConnection.prototype.uri = function() { - var schema = this.secure ? 'wss' : 'ws'; - var port = ''; - var path = this.path || '/'; +WSConnection.prototype.uri = function () { + var schema = this.secure ? "wss" : "ws"; + var port = ""; + var path = this.path || "/"; var host = this.host; // avoid port if default for schema - if (this.port && (('wss' === schema && this.port !== 443) || - ('ws' === schema && this.port !== 80))) { - port = ':' + this.port; + if ( + this.port && + (("wss" === schema && this.port !== 443) || + ("ws" === schema && this.port !== 80)) + ) { + port = ":" + this.port; } - return schema + '://' + host + port + path; + return schema + "://" + host + port + path; }; /** @@ -260,7 +265,7 @@ WSConnection.prototype.uri = function() { * @event {error} the "error" event is raised upon request failure passing the * Node.js error object to the listener. */ -WSConnection.prototype.write = function(data) { +WSConnection.prototype.write = function (data) { if (this.isOpen()) { //Send data and register a callback to invoke the client callback this.socket.send(data); @@ -279,7 +284,7 @@ WSConnection.prototype.write = function(data) { * @returns {WSConnection} The connection object. * @see {@link WSConnectOptions} */ -exports.createWSConnection = function(host, port, options) { +exports.createWSConnection = function (host, port, options) { return new WSConnection(host, port, options); }; diff --git a/lib/nodejs/lib/thrift/ws_transport.js b/lib/nodejs/lib/thrift/ws_transport.js index 4cf62b9f9bf..94b6d90221b 100644 --- a/lib/nodejs/lib/thrift/ws_transport.js +++ b/lib/nodejs/lib/thrift/ws_transport.js @@ -17,7 +17,7 @@ * under the License. */ -var log = require('./log'); +var log = require("./log"); module.exports = TWebSocketTransport; @@ -33,19 +33,18 @@ module.exports = TWebSocketTransport; * var transport = new Thrift.TWebSocketTransport("http://localhost:8585"); */ function TWebSocketTransport(url) { - this.__reset(url); -}; - - -TWebSocketTransport.prototype.__reset = function(url) { - this.url = url; //Where to connect - this.socket = null; //The web socket - this.callbacks = []; //Pending callbacks - this.send_pending = []; //Buffers/Callback pairs waiting to be sent - this.send_buf = ''; //Outbound data, immutable until sent - this.recv_buf = ''; //Inbound data - this.rb_wpos = 0; //Network write position in receive buffer - this.rb_rpos = 0; //Client read position in receive buffer + this.__reset(url); +} + +TWebSocketTransport.prototype.__reset = function (url) { + this.url = url; //Where to connect + this.socket = null; //The web socket + this.callbacks = []; //Pending callbacks + this.send_pending = []; //Buffers/Callback pairs waiting to be sent + this.send_buf = ""; //Outbound data, immutable until sent + this.recv_buf = ""; //Inbound data + this.rb_wpos = 0; //Network write position in receive buffer + this.rb_rpos = 0; //Client read position in receive buffer }; /** @@ -56,58 +55,62 @@ TWebSocketTransport.prototype.__reset = function(url) { * @param {object} callback - The client completion callback. * @returns {undefined|string} Nothing (undefined) */ -TWebSocketTransport.prototype.flush = function(async, callback) { +TWebSocketTransport.prototype.flush = function (async, callback) { var self = this; if (this.isOpen()) { //Send data and register a callback to invoke the client callback this.socket.send(this.send_buf); - this.callbacks.push((function() { - var clientCallback = callback; - return function(msg) { - self.setRecvBuffer(msg); - clientCallback(); - }; - }())); + this.callbacks.push( + (function () { + var clientCallback = callback; + return function (msg) { + self.setRecvBuffer(msg); + clientCallback(); + }; + })(), + ); } else { //Queue the send to go out __onOpen this.send_pending.push({ buf: this.send_buf, - cb: callback + cb: callback, }); } }; -TWebSocketTransport.prototype.__onOpen = function() { - var self = this; - if (this.send_pending.length > 0) { - //If the user made calls before the connection was fully - //open, send them now - this.send_pending.forEach(function(elem) { - self.socket.send(elem.buf); - self.callbacks.push((function() { - var clientCallback = elem.cb; - return function(msg) { - self.setRecvBuffer(msg); - clientCallback(); - }; - }())); - }); - this.send_pending = []; - } +TWebSocketTransport.prototype.__onOpen = function () { + var self = this; + if (this.send_pending.length > 0) { + //If the user made calls before the connection was fully + //open, send them now + this.send_pending.forEach(function (elem) { + self.socket.send(elem.buf); + self.callbacks.push( + (function () { + var clientCallback = elem.cb; + return function (msg) { + self.setRecvBuffer(msg); + clientCallback(); + }; + })(), + ); + }); + this.send_pending = []; + } }; -TWebSocketTransport.prototype.__onClose = function(evt) { +TWebSocketTransport.prototype.__onClose = function (evt) { this.__reset(this.url); }; -TWebSocketTransport.prototype.__onMessage = function(evt) { +TWebSocketTransport.prototype.__onMessage = function (evt) { if (this.callbacks.length) { this.callbacks.shift()(evt.data); } }; -TWebSocketTransport.prototype.__onError = function(evt) { - log.error('websocket: ' + evt.toString()); +TWebSocketTransport.prototype.__onError = function (evt) { + log.error("websocket: " + evt.toString()); this.socket.close(); }; @@ -115,7 +118,7 @@ TWebSocketTransport.prototype.__onError = function(evt) { * Sets the buffer to use when receiving server responses. * @param {string} buf - The buffer to receive server responses. */ -TWebSocketTransport.prototype.setRecvBuffer = function(buf) { +TWebSocketTransport.prototype.setRecvBuffer = function (buf) { this.recv_buf = buf; this.recv_buf_sz = this.recv_buf.length; this.wpos = this.recv_buf.length; @@ -127,14 +130,14 @@ TWebSocketTransport.prototype.setRecvBuffer = function(buf) { * @readonly * @returns {boolean} */ -TWebSocketTransport.prototype.isOpen = function() { +TWebSocketTransport.prototype.isOpen = function () { return this.socket && this.socket.readyState == this.socket.OPEN; }; /** * Opens the transport connection */ -TWebSocketTransport.prototype.open = function() { +TWebSocketTransport.prototype.open = function () { //If OPEN/CONNECTING/CLOSING ignore additional opens if (this.socket && this.socket.readyState != this.socket.CLOSED) { return; @@ -150,7 +153,7 @@ TWebSocketTransport.prototype.open = function() { /** * Closes the transport connection */ -TWebSocketTransport.prototype.close = function() { +TWebSocketTransport.prototype.close = function () { this.socket.close(); }; @@ -160,11 +163,11 @@ TWebSocketTransport.prototype.close = function() { * @param {number} len - The number of characters to return. * @returns {string} Characters sent by the server. */ -TWebSocketTransport.prototype.read = function(len) { +TWebSocketTransport.prototype.read = function (len) { var avail = this.wpos - this.rpos; if (avail === 0) { - return ''; + return ""; } var give = len; @@ -184,7 +187,7 @@ TWebSocketTransport.prototype.read = function(len) { * Returns the entire response buffer. * @returns {string} Characters sent by the server. */ -TWebSocketTransport.prototype.readAll = function() { +TWebSocketTransport.prototype.readAll = function () { return this.recv_buf; }; @@ -192,7 +195,7 @@ TWebSocketTransport.prototype.readAll = function() { * Sets the send buffer to buf. * @param {string} buf - The buffer to send. */ -TWebSocketTransport.prototype.write = function(buf) { +TWebSocketTransport.prototype.write = function (buf) { this.send_buf = buf; }; @@ -201,6 +204,6 @@ TWebSocketTransport.prototype.write = function(buf) { * @readonly * @returns {string} The send buffer. */ -TWebSocketTransport.prototype.getSendBuffer = function() { +TWebSocketTransport.prototype.getSendBuffer = function () { return this.send_buf; }; diff --git a/lib/nodejs/lib/thrift/xhr_connection.js b/lib/nodejs/lib/thrift/xhr_connection.js index 6459c900c2a..ea542d1fe58 100644 --- a/lib/nodejs/lib/thrift/xhr_connection.js +++ b/lib/nodejs/lib/thrift/xhr_connection.js @@ -16,15 +16,15 @@ * specific language governing permissions and limitations * under the License. */ -var util = require('util'); +var util = require("util"); var EventEmitter = require("events").EventEmitter; -var thrift = require('./thrift'); +var thrift = require("./thrift"); -var TBufferedTransport = require('./buffered_transport'); -var TJSONProtocol = require('./json_protocol'); -var InputBufferUnderrunError = require('./input_buffer_underrun_error'); +var TBufferedTransport = require("./buffered_transport"); +var TJSONProtocol = require("./json_protocol"); +var InputBufferUnderrunError = require("./input_buffer_underrun_error"); -var createClient = require('./create_client'); +var createClient = require("./create_client"); exports.XHRConnection = XHRConnection; @@ -43,43 +43,49 @@ function XHRConnection(host, port, options) { this.options = options || {}; this.wpos = 0; this.rpos = 0; - this.useCORS = (options && options.useCORS); - this.send_buf = ''; - this.recv_buf = ''; + this.useCORS = options && options.useCORS; + this.send_buf = ""; + this.recv_buf = ""; this.transport = options.transport || TBufferedTransport; this.protocol = options.protocol || TJSONProtocol; this.headers = options.headers || {}; host = host || window.location.host; port = port || window.location.port; - var prefix = options.https ? 'https://' : 'http://'; - var path = options.path || '/'; + var prefix = options.https ? "https://" : "http://"; + var path = options.path || "/"; - if (port === '') { + if (port === "") { port = undefined; } - if (!port || port === 80 || port === '80') { + if (!port || port === 80 || port === "80") { this.url = prefix + host + path; } else { - this.url = prefix + host + ':' + port + path; + this.url = prefix + host + ":" + port + path; } //The sequence map is used to map seqIDs back to the // calling client in multiplexed scenarios this.seqId2Service = {}; -}; +} util.inherits(XHRConnection, EventEmitter); /** -* Gets the browser specific XmlHttpRequest Object. -* @returns {object} the browser XHR interface object -*/ -XHRConnection.prototype.getXmlHttpRequestObject = function() { - try { return new XMLHttpRequest(); } catch (e1) { } - try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch (e2) { } - try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch (e3) { } + * Gets the browser specific XmlHttpRequest Object. + * @returns {object} the browser XHR interface object + */ +XHRConnection.prototype.getXmlHttpRequestObject = function () { + try { + return new XMLHttpRequest(); + } catch (e1) {} + try { + return new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e2) {} + try { + return new ActiveXObject("Microsoft.XMLHTTP"); + } catch (e3) {} throw "Your browser doesn't support XHR."; }; @@ -94,27 +100,27 @@ XHRConnection.prototype.getXmlHttpRequestObject = function() { * @returns {undefined|string} Nothing or the current send buffer. * @throws {string} If XHR fails. */ -XHRConnection.prototype.flush = function() { +XHRConnection.prototype.flush = function () { var self = this; - if (this.url === undefined || this.url === '') { + if (this.url === undefined || this.url === "") { return this.send_buf; } var xreq = this.getXmlHttpRequestObject(); if (xreq.overrideMimeType) { - xreq.overrideMimeType('application/json'); + xreq.overrideMimeType("application/json"); } - xreq.onreadystatechange = function() { + xreq.onreadystatechange = function () { if (this.readyState == 4 && this.status == 200) { self.setRecvBuffer(this.responseText); } }; - xreq.open('POST', this.url, true); + xreq.open("POST", this.url, true); - Object.keys(this.headers).forEach(function(headerKey) { + Object.keys(this.headers).forEach(function (headerKey) { xreq.setRequestHeader(headerKey, self.headers[headerKey]); }); @@ -125,7 +131,7 @@ XHRConnection.prototype.flush = function() { * Sets the buffer to provide the protocol when deserializing. * @param {string} buf - The buffer to supply the protocol. */ -XHRConnection.prototype.setRecvBuffer = function(buf) { +XHRConnection.prototype.setRecvBuffer = function (buf) { this.recv_buf = buf; this.recv_buf_sz = this.recv_buf.length; this.wpos = this.recv_buf.length; @@ -137,10 +143,9 @@ XHRConnection.prototype.setRecvBuffer = function(buf) { var thing = new Buffer(data || buf); this.transport.receiver(this.__decodeCallback.bind(this))(thing); - }; -XHRConnection.prototype.__decodeCallback = function(transport_with_data) { +XHRConnection.prototype.__decodeCallback = function (transport_with_data) { var proto = new this.protocol(transport_with_data); try { while (true) { @@ -165,7 +170,7 @@ XHRConnection.prototype.__decodeCallback = function(transport_with_data) { delete this.seqId2Service[header.rseqid]; } /*jshint -W083 */ - client._reqs[dummy_seqid] = function(err, success) { + client._reqs[dummy_seqid] = function (err, success) { transport_with_data.commitPosition(); var clientCallback = client._reqs[header.rseqid]; delete client._reqs[header.rseqid]; @@ -174,14 +179,17 @@ XHRConnection.prototype.__decodeCallback = function(transport_with_data) { } }; /*jshint +W083 */ - if (client['recv_' + header.fname]) { - client['recv_' + header.fname](proto, header.mtype, dummy_seqid); + if (client["recv_" + header.fname]) { + client["recv_" + header.fname](proto, header.mtype, dummy_seqid); } else { delete client._reqs[dummy_seqid]; - this.emit("error", + this.emit( + "error", new thrift.TApplicationException( thrift.TApplicationExceptionType.WRONG_METHOD_NAME, - "Received a response to an unknown RPC function")); + "Received a response to an unknown RPC function", + ), + ); } } } catch (e) { @@ -198,19 +206,19 @@ XHRConnection.prototype.__decodeCallback = function(transport_with_data) { * @readonly * @returns {boolean} Always True. */ -XHRConnection.prototype.isOpen = function() { +XHRConnection.prototype.isOpen = function () { return true; }; /** * Opens the transport connection, with XHR this is a nop. */ -XHRConnection.prototype.open = function() {}; +XHRConnection.prototype.open = function () {}; /** * Closes the transport connection, with XHR this is a nop. */ -XHRConnection.prototype.close = function() {}; +XHRConnection.prototype.close = function () {}; /** * Returns the specified number of characters from the response @@ -218,11 +226,11 @@ XHRConnection.prototype.close = function() {}; * @param {number} len - The number of characters to return. * @returns {string} Characters sent by the server. */ -XHRConnection.prototype.read = function(len) { +XHRConnection.prototype.read = function (len) { var avail = this.wpos - this.rpos; if (avail === 0) { - return ''; + return ""; } var give = len; @@ -242,7 +250,7 @@ XHRConnection.prototype.read = function(len) { * Returns the entire response buffer. * @returns {string} Characters sent by the server. */ -XHRConnection.prototype.readAll = function() { +XHRConnection.prototype.readAll = function () { return this.recv_buf; }; @@ -250,7 +258,7 @@ XHRConnection.prototype.readAll = function() { * Sets the send buffer to buf. * @param {string} buf - The buffer to send. */ -XHRConnection.prototype.write = function(buf) { +XHRConnection.prototype.write = function (buf) { this.send_buf = buf; this.flush(); }; @@ -260,7 +268,7 @@ XHRConnection.prototype.write = function(buf) { * @readonly * @returns {string} The send buffer. */ -XHRConnection.prototype.getSendBuffer = function() { +XHRConnection.prototype.getSendBuffer = function () { return this.send_buf; }; @@ -273,7 +281,7 @@ XHRConnection.prototype.getSendBuffer = function() { * @returns {XHRConnection} The connection object. * @see {@link XHRConnectOptions} */ -exports.createXHRConnection = function(host, port, options) { +exports.createXHRConnection = function (host, port, options) { return new XHRConnection(host, port, options); }; diff --git a/lib/nodejs/test/binary.test.js b/lib/nodejs/test/binary.test.js index 187cd187434..343d39a9923 100644 --- a/lib/nodejs/test/binary.test.js +++ b/lib/nodejs/test/binary.test.js @@ -21,7 +21,7 @@ const test = require("tape"); const binary = require("thrift/binary"); const cases = { - "Should read signed byte": function(assert) { + "Should read signed byte": function (assert) { assert.equal(1, binary.readByte(0x01)); assert.equal(-1, binary.readByte(0xff)); @@ -29,12 +29,12 @@ const cases = { assert.equal(-128, binary.readByte(0x80)); assert.end(); }, - "Should write byte": function(assert) { + "Should write byte": function (assert) { //Protocol simply writes to the buffer. Nothing to test.. yet. assert.ok(true); assert.end(); }, - "Should read I16": function(assert) { + "Should read I16": function (assert) { assert.equal(0, binary.readI16([0x00, 0x00])); assert.equal(1, binary.readI16([0x00, 0x01])); assert.equal(-1, binary.readI16([0xff, 0xff])); @@ -46,7 +46,7 @@ const cases = { assert.end(); }, - "Should write I16": function(assert) { + "Should write I16": function (assert) { assert.deepEqual([0x00, 0x00], binary.writeI16([], 0)); assert.deepEqual([0x00, 0x01], binary.writeI16([], 1)); assert.deepEqual([0xff, 0xff], binary.writeI16([], -1)); @@ -58,7 +58,7 @@ const cases = { assert.end(); }, - "Should read I32": function(assert) { + "Should read I32": function (assert) { assert.equal(0, binary.readI32([0x00, 0x00, 0x00, 0x00])); assert.equal(1, binary.readI32([0x00, 0x00, 0x00, 0x01])); assert.equal(-1, binary.readI32([0xff, 0xff, 0xff, 0xff])); @@ -70,7 +70,7 @@ const cases = { assert.end(); }, - "Should write I32": function(assert) { + "Should write I32": function (assert) { assert.deepEqual([0x00, 0x00, 0x00, 0x00], binary.writeI32([], 0)); assert.deepEqual([0x00, 0x00, 0x00, 0x01], binary.writeI32([], 1)); assert.deepEqual([0xff, 0xff, 0xff, 0xff], binary.writeI32([], -1)); @@ -78,137 +78,139 @@ const cases = { // Min I32 assert.deepEqual( [0x80, 0x00, 0x00, 0x00], - binary.writeI32([], -2147483648) + binary.writeI32([], -2147483648), ); // Max I32 assert.deepEqual([0x7f, 0xff, 0xff, 0xff], binary.writeI32([], 2147483647)); assert.end(); }, - "Should read doubles": function(assert) { + "Should read doubles": function (assert) { assert.equal( 0, - binary.readDouble([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + binary.readDouble([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), ); assert.equal( 0, - binary.readDouble([0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + binary.readDouble([0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), ); assert.equal( 1, - binary.readDouble([0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + binary.readDouble([0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), ); assert.equal( 2, - binary.readDouble([0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + binary.readDouble([0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), ); assert.equal( -2, - binary.readDouble([0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + binary.readDouble([0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), ); assert.equal( Math.PI, - binary.readDouble([0x40, 0x9, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18]) + binary.readDouble([0x40, 0x9, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18]), ); assert.equal( Infinity, - binary.readDouble([0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + binary.readDouble([0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), ); assert.equal( -Infinity, - binary.readDouble([0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + binary.readDouble([0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), ); assert.ok( - isNaN(binary.readDouble([0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])) + isNaN( + binary.readDouble([0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), + ), ); assert.equal( 1 / 3, - binary.readDouble([0x3f, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55]) + binary.readDouble([0x3f, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55]), ); // Min subnormal positive double assert.equal( 4.9406564584124654e-324, - binary.readDouble([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]) + binary.readDouble([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]), ); // Min normal positive double assert.equal( 2.2250738585072014e-308, - binary.readDouble([0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + binary.readDouble([0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), ); // Max positive double assert.equal( 1.7976931348623157e308, - binary.readDouble([0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]) + binary.readDouble([0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]), ); assert.end(); }, - "Should write doubles": function(assert) { + "Should write doubles": function (assert) { assert.deepEqual( [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], - binary.writeDouble([], 0) + binary.writeDouble([], 0), ); assert.deepEqual( [0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], - binary.writeDouble([], 1) + binary.writeDouble([], 1), ); assert.deepEqual( [0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], - binary.writeDouble([], 2) + binary.writeDouble([], 2), ); assert.deepEqual( [0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], - binary.writeDouble([], -2) + binary.writeDouble([], -2), ); assert.deepEqual( [0x40, 0x9, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18], - binary.writeDouble([], Math.PI) + binary.writeDouble([], Math.PI), ); assert.deepEqual( [0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], - binary.writeDouble([], Infinity) + binary.writeDouble([], Infinity), ); assert.deepEqual( [0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], - binary.writeDouble([], -Infinity) + binary.writeDouble([], -Infinity), ); assert.deepEqual( [0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], - binary.writeDouble([], NaN) + binary.writeDouble([], NaN), ); assert.deepEqual( [0x3f, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55], - binary.writeDouble([], 1 / 3) + binary.writeDouble([], 1 / 3), ); // Min subnormal positive double assert.deepEqual( [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01], - binary.writeDouble([], 4.9406564584124654e-324) + binary.writeDouble([], 4.9406564584124654e-324), ); // Min normal positive double assert.deepEqual( [0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], - binary.writeDouble([], 2.2250738585072014e-308) + binary.writeDouble([], 2.2250738585072014e-308), ); // Max positive double assert.deepEqual( [0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], - binary.writeDouble([], 1.7976931348623157e308) + binary.writeDouble([], 1.7976931348623157e308), ); assert.end(); - } + }, }; -Object.keys(cases).forEach(function(caseName) { +Object.keys(cases).forEach(function (caseName) { test(caseName, cases[caseName]); }); diff --git a/lib/nodejs/test/client.js b/lib/nodejs/test/client.js index 31ea06e2f0d..1d137fff51a 100644 --- a/lib/nodejs/test/client.js +++ b/lib/nodejs/test/client.js @@ -25,8 +25,8 @@ const helpers = require("./helpers"); const ThriftTest = require(`./${helpers.genPath}/ThriftTest`); const ThriftTestDriver = require("./test_driver").ThriftTestDriver; -const ThriftTestDriverPromise = require("./test_driver") - .ThriftTestDriverPromise; +const ThriftTestDriverPromise = + require("./test_driver").ThriftTestDriverPromise; const SecondService = require(`./${helpers.genPath}/SecondService`); const program = require("commander"); @@ -34,24 +34,24 @@ const program = require("commander"); program .option( "-p, --protocol ", - "Set thrift protocol (binary|compact|json) [protocol]" + "Set thrift protocol (binary|compact|json) [protocol]", ) .option( "-t, --transport ", - "Set thrift transport (buffered|framed|http) [transport]" + "Set thrift transport (buffered|framed|http) [transport]", ) .option("--port ", "Set thrift server port number to connect", 9090) .option("--host ", "Set thrift server host to connect", "localhost") .option( "--domain-socket ", - "Set thrift server unix domain socket to connect" + "Set thrift server unix domain socket to connect", ) .option("--ssl", "use SSL transport") .option("--callback", "test with callback style functions") .option( "-t, --type ", "Select server type (http|multiplex|tcp|websocket)", - "tcp" + "tcp", ) .option("--es6", "Use es6 code") .option("--es5", "Use es5 code") @@ -76,7 +76,7 @@ if (program.transport === "websocket") { const options = { transport: helpers.transports[program.transport], - protocol: helpers.protocols[program.protocol] + protocol: helpers.protocols[program.protocol], }; if (type === "http" || type === "websocket") { @@ -128,7 +128,7 @@ if (type === "tcp" || type === "multiplex") { connection.open(); } -connection.on("error", function(err) { +connection.on("error", function (err) { assert(false, err); }); @@ -141,11 +141,11 @@ if (type === "tcp") { const secondclient = mp.createClient( "SecondService", SecondService, - connection + connection, ); - connection.on("connect", function() { - secondclient.secondtestString("Test", function(err, response) { + connection.on("connect", function () { + secondclient.secondtestString("Test", function (err, response) { assert(!err); assert.equal('testString("Test")', response); }); @@ -161,7 +161,7 @@ if (type === "tcp") { } function runTests() { - testDriver(client, function(status) { + testDriver(client, function (status) { console.log(status); if (type !== "http" && type !== "websocket") { connection.end(); @@ -172,4 +172,4 @@ function runTests() { }); } -exports.expressoTest = function() {}; +exports.expressoTest = function () {}; diff --git a/lib/nodejs/test/deep-constructor.test.js b/lib/nodejs/test/deep-constructor.test.js index a91ddb1784c..e5ac3f888e2 100644 --- a/lib/nodejs/test/deep-constructor.test.js +++ b/lib/nodejs/test/deep-constructor.test.js @@ -24,7 +24,7 @@ const bufferEquals = require("buffer-equals"); function serializeBinary(data) { let buff; - const transport = new thrift.TBufferedTransport(null, function(msg) { + const transport = new thrift.TBufferedTransport(null, function (msg) { buff = msg; }); const prot = new thrift.TBinaryProtocol(transport); @@ -43,7 +43,7 @@ function deserializeBinary(serialized, type) { function serializeJSON(data) { let buff; - const transport = new thrift.TBufferedTransport(null, function(msg) { + const transport = new thrift.TBufferedTransport(null, function (msg) { buff = msg; }); const protocol = new thrift.TJSONProtocol(transport); @@ -70,17 +70,17 @@ function createThriftObj() { struct_list_field: [ new ttypes.Simple({ value: "b" }), - new ttypes.Simple({ value: "c" }) + new ttypes.Simple({ value: "c" }), ], struct_set_field: [ new ttypes.Simple({ value: "d" }), - new ttypes.Simple({ value: "e" }) + new ttypes.Simple({ value: "e" }), ], struct_map_field: { A: new ttypes.Simple({ value: "f" }), - B: new ttypes.Simple({ value: "g" }) + B: new ttypes.Simple({ value: "g" }), }, struct_nested_containers_field: [ @@ -88,46 +88,46 @@ function createThriftObj() { { C: [ new ttypes.Simple({ value: "h" }), - new ttypes.Simple({ value: "i" }) - ] - } - ] + new ttypes.Simple({ value: "i" }), + ], + }, + ], ], struct_nested_containers_field2: { D: [ { - DA: new ttypes.Simple({ value: "j" }) + DA: new ttypes.Simple({ value: "j" }), }, { - DB: new ttypes.Simple({ value: "k" }) - } - ] + DB: new ttypes.Simple({ value: "k" }), + }, + ], }, list_of_list_field: [ ["l00", "l01", "l02"], ["l10", "l11", "l12"], - ["l20", "l21", "l22"] + ["l20", "l21", "l22"], ], list_of_list_of_list_field: [ [ ["m000", "m001", "m002"], ["m010", "m011", "m012"], - ["m020", "m021", "m022"] + ["m020", "m021", "m022"], ], [ ["m100", "m101", "m102"], ["m110", "m111", "m112"], - ["m120", "m121", "m122"] + ["m120", "m121", "m122"], ], [ ["m200", "m201", "m202"], ["m210", "m211", "m212"], - ["m220", "m221", "m222"] - ] - ] + ["m220", "m221", "m222"], + ], + ], }); } @@ -141,51 +141,51 @@ function createJsObj() { struct_map_field: { A: { value: "f" }, - B: { value: "g" } + B: { value: "g" }, }, struct_nested_containers_field: [ [ { - C: [{ value: "h" }, { value: "i" }] - } - ] + C: [{ value: "h" }, { value: "i" }], + }, + ], ], struct_nested_containers_field2: { D: [ { - DA: { value: "j" } + DA: { value: "j" }, }, { - DB: { value: "k" } - } - ] + DB: { value: "k" }, + }, + ], }, list_of_list_field: [ ["l00", "l01", "l02"], ["l10", "l11", "l12"], - ["l20", "l21", "l22"] + ["l20", "l21", "l22"], ], list_of_list_of_list_field: [ [ ["m000", "m001", "m002"], ["m010", "m011", "m012"], - ["m020", "m021", "m022"] + ["m020", "m021", "m022"], ], [ ["m100", "m101", "m102"], ["m110", "m111", "m112"], - ["m120", "m121", "m122"] + ["m120", "m121", "m122"], ], [ ["m200", "m201", "m202"], ["m210", "m211", "m212"], - ["m220", "m221", "m222"] - ] - ] + ["m220", "m221", "m222"], + ], + ], }; } @@ -244,7 +244,7 @@ function assertValues(obj, assert) { function createTestCases(serialize, deserialize) { const cases = { - "Serialize/deserialize should return equal object": function(assert) { + "Serialize/deserialize should return equal object": function (assert) { const tObj = createThriftObj(); const received = deserialize(serialize(tObj), ttypes.Complex); assert.ok(tObj !== received, "not the same object"); @@ -252,51 +252,49 @@ function createTestCases(serialize, deserialize) { assert.end(); }, - "Nested structs and containers initialized from plain js objects should serialize same as if initialized from thrift objects": function( - assert - ) { - const tObj1 = createThriftObj(); - const tObj2 = new ttypes.Complex(createJsObj()); - assertValues(tObj2, assert); - const s1 = serialize(tObj1); - const s2 = serialize(tObj2); - assert.ok(bufferEquals(s1, s2)); - assert.end(); - }, - - "Modifications to args object should not affect constructed Thrift object": function( - assert - ) { - const args = createJsObj(); - assertValues(args, assert); - - const tObj = new ttypes.Complex(args); - assertValues(tObj, assert); - - args.struct_field.value = "ZZZ"; - args.struct_list_field[0].value = "ZZZ"; - args.struct_list_field[1].value = "ZZZ"; - args.struct_set_field[0].value = "ZZZ"; - args.struct_set_field[1].value = "ZZZ"; - args.struct_map_field.A.value = "ZZZ"; - args.struct_map_field.B.value = "ZZZ"; - args.struct_nested_containers_field[0][0].C[0] = "ZZZ"; - args.struct_nested_containers_field[0][0].C[1] = "ZZZ"; - args.struct_nested_containers_field2.D[0].DA = "ZZZ"; - args.struct_nested_containers_field2.D[0].DB = "ZZZ"; - - assertValues(tObj, assert); - assert.end(); - }, - - "nulls are ok": function(assert) { + "Nested structs and containers initialized from plain js objects should serialize same as if initialized from thrift objects": + function (assert) { + const tObj1 = createThriftObj(); + const tObj2 = new ttypes.Complex(createJsObj()); + assertValues(tObj2, assert); + const s1 = serialize(tObj1); + const s2 = serialize(tObj2); + assert.ok(bufferEquals(s1, s2)); + assert.end(); + }, + + "Modifications to args object should not affect constructed Thrift object": + function (assert) { + const args = createJsObj(); + assertValues(args, assert); + + const tObj = new ttypes.Complex(args); + assertValues(tObj, assert); + + args.struct_field.value = "ZZZ"; + args.struct_list_field[0].value = "ZZZ"; + args.struct_list_field[1].value = "ZZZ"; + args.struct_set_field[0].value = "ZZZ"; + args.struct_set_field[1].value = "ZZZ"; + args.struct_map_field.A.value = "ZZZ"; + args.struct_map_field.B.value = "ZZZ"; + args.struct_nested_containers_field[0][0].C[0] = "ZZZ"; + args.struct_nested_containers_field[0][0].C[1] = "ZZZ"; + args.struct_nested_containers_field2.D[0].DA = "ZZZ"; + args.struct_nested_containers_field2.D[0].DB = "ZZZ"; + + assertValues(tObj, assert); + assert.end(); + }, + + "nulls are ok": function (assert) { const tObj = new ttypes.Complex({ struct_field: null, struct_list_field: null, struct_set_field: null, struct_map_field: null, struct_nested_containers_field: null, - struct_nested_containers_field2: null + struct_nested_containers_field2: null, }); const received = deserialize(serialize(tObj), ttypes.Complex); assert.strictEqual(tObj.struct_field, null); @@ -305,9 +303,9 @@ function createTestCases(serialize, deserialize) { assert.end(); }, - "Can make list with objects": function(assert) { + "Can make list with objects": function (assert) { const tObj = new ttypes.ComplexList({ - struct_list_field: [new ttypes.Complex({})] + struct_list_field: [new ttypes.Complex({})], }); const innerObj = tObj.struct_list_field[0]; assert.ok(innerObj instanceof ttypes.Complex); @@ -318,13 +316,13 @@ function createTestCases(serialize, deserialize) { assert.strictEqual(innerObj.struct_nested_containers_field, null); assert.strictEqual(innerObj.struct_nested_containers_field2, null); assert.end(); - } + }, }; return cases; } function run(name, cases) { - Object.keys(cases).forEach(function(caseName) { + Object.keys(cases).forEach(function (caseName) { test(name + ": " + caseName, cases[caseName]); }); } diff --git a/lib/nodejs/test/episodic-code-generation-test/client.js b/lib/nodejs/test/episodic-code-generation-test/client.js index 55dc70269ca..631bfe73a7e 100644 --- a/lib/nodejs/test/episodic-code-generation-test/client.js +++ b/lib/nodejs/test/episodic-code-generation-test/client.js @@ -37,21 +37,21 @@ const port = program.port; const options = { transport: thrift.TBufferedTransport, - protocol: thrift.TJSONProtocol + protocol: thrift.TJSONProtocol, }; const connection = thrift.createConnection(host, port, options); -const testDriver = function(client, callback) { - test("NodeJS episodic compilation client-server test", function(assert) { +const testDriver = function (client, callback) { + test("NodeJS episodic compilation client-server test", function (assert) { const type1Object = new Types.Type1(); type1Object.number = 42; type1Object.message = "The answer"; - client.testEpisode(type1Object, function(err, response) { + client.testEpisode(type1Object, function (err, response) { assert.error(err, "no callback error"); assert.equal(response.number, type1Object.number + 1); assert.equal( response.message, - type1Object.message + " [Hello from the server]" + type1Object.message + " [Hello from the server]", ); assert.end(); callback("Server successfully tested"); @@ -59,7 +59,7 @@ const testDriver = function(client, callback) { }); }; -connection.on("error", function(err) { +connection.on("error", function (err) { assert(false, err); }); @@ -68,10 +68,10 @@ const client = thrift.createClient(Service, connection); runTests(); function runTests() { - testDriver(client, function(status) { + testDriver(client, function (status) { console.log(status); connection.destroy(); }); } -exports.expressoTest = function() {}; +exports.expressoTest = function () {}; diff --git a/lib/nodejs/test/episodic-code-generation-test/server.js b/lib/nodejs/test/episodic-code-generation-test/server.js index 2917b681c84..feca38045d9 100644 --- a/lib/nodejs/test/episodic-code-generation-test/server.js +++ b/lib/nodejs/test/episodic-code-generation-test/server.js @@ -33,17 +33,17 @@ const port = program.port; const options = { transport: thrift.TBufferedTransport, - protocol: thrift.TJSONProtocol + protocol: thrift.TJSONProtocol, }; const ServiceHandler = { - testEpisode: function(receivedType1Object) { + testEpisode: function (receivedType1Object) { const type1Object = new Types.Type1(); type1Object.number = receivedType1Object.number + 1; type1Object.message = receivedType1Object.message + " [Hello from the server]"; return type1Object; - } + }, }; const server = thrift.createServer(Service, ServiceHandler, options); diff --git a/lib/nodejs/test/exceptions.js b/lib/nodejs/test/exceptions.js index f30f987963a..4119e76b052 100644 --- a/lib/nodejs/test/exceptions.js +++ b/lib/nodejs/test/exceptions.js @@ -26,23 +26,23 @@ test("TApplicationException", function t(assert) { const e = new thrift.TApplicationException(1, "foo"); assert.ok( e instanceof thrift.TApplicationException, - "is instanceof TApplicationException" + "is instanceof TApplicationException", ); assert.ok(e instanceof thrift.TException, "is instanceof TException"); assert.ok(e instanceof Error, "is instanceof Error"); assert.equal(typeof e.stack, "string", "has stack trace"); assert.ok( /^TApplicationException: foo/.test(e.stack), - "Stack trace has correct error name and message" + "Stack trace has correct error name and message", ); assert.ok( e.stack.indexOf("test/exceptions.js:7:11") !== -1, - "stack trace starts on correct line and column" + "stack trace starts on correct line and column", ); assert.equal( e.name, "TApplicationException", - "has function name TApplicationException" + "has function name TApplicationException", ); assert.equal(e.message, "foo", 'has error message "foo"'); assert.equal(e.type, 1, "has type 1"); @@ -53,23 +53,23 @@ test("unexpected TApplicationException ", function t(assert) { const e = new thrift.TApplicationException(1, 100); assert.ok( e instanceof thrift.TApplicationException, - "is instanceof TApplicationException" + "is instanceof TApplicationException", ); assert.ok(e instanceof thrift.TException, "is instanceof TException"); assert.ok(e instanceof Error, "is instanceof Error"); assert.equal(typeof e.stack, "string", "has stack trace"); assert.ok( /^TApplicationException: 100/.test(e.stack), - "Stack trace has correct error name and message" + "Stack trace has correct error name and message", ); assert.ok( e.stack.indexOf("test/exceptions.js:7:11") !== -1, - "stack trace starts on correct line and column" + "stack trace starts on correct line and column", ); assert.equal( e.name, "TApplicationException", - "has function name TApplicationException" + "has function name TApplicationException", ); assert.equal(e.message, 100, "has error message 100"); assert.equal(e.type, 1, "has type 1"); @@ -83,11 +83,11 @@ test("TException", function t(assert) { assert.equal(typeof e.stack, "string", "has stack trace"); assert.ok( /^TException: foo/.test(e.stack), - "Stack trace has correct error name and message" + "Stack trace has correct error name and message", ); assert.ok( e.stack.indexOf("test/exceptions.js:21:11") !== -1, - "stack trace starts on correct line and column" + "stack trace starts on correct line and column", ); assert.equal(e.name, "TException", "has function name TException"); assert.equal(e.message, "foo", 'has error message "foo"'); @@ -98,22 +98,22 @@ test("TProtocolException", function t(assert) { const e = new thrift.TProtocolException(1, "foo"); assert.ok( e instanceof thrift.TProtocolException, - "is instanceof TProtocolException" + "is instanceof TProtocolException", ); assert.ok(e instanceof Error, "is instanceof Error"); assert.equal(typeof e.stack, "string", "has stack trace"); assert.ok( /^TProtocolException: foo/.test(e.stack), - "Stack trace has correct error name and message" + "Stack trace has correct error name and message", ); assert.ok( e.stack.indexOf("test/exceptions.js:33:11") !== -1, - "stack trace starts on correct line and column" + "stack trace starts on correct line and column", ); assert.equal( e.name, "TProtocolException", - "has function name TProtocolException" + "has function name TProtocolException", ); assert.equal(e.message, "foo", 'has error message "foo"'); assert.equal(e.type, 1, "has type 1"); @@ -124,22 +124,22 @@ test("InputBufferUnderrunError", function t(assert) { const e = new InputBufferUnderrunError("foo"); assert.ok( e instanceof InputBufferUnderrunError, - "is instanceof InputBufferUnderrunError" + "is instanceof InputBufferUnderrunError", ); assert.ok(e instanceof Error, "is instanceof Error"); assert.equal(typeof e.stack, "string", "has stack trace"); assert.ok( /^InputBufferUnderrunError: foo/.test(e.stack), - "Stack trace has correct error name and message" + "Stack trace has correct error name and message", ); assert.ok( e.stack.indexOf("test/exceptions.js:46:11") !== -1, - "stack trace starts on correct line and column" + "stack trace starts on correct line and column", ); assert.equal( e.name, "InputBufferUnderrunError", - "has function name InputBufferUnderrunError" + "has function name InputBufferUnderrunError", ); assert.equal(e.message, "foo", 'has error message "foo"'); assert.end(); diff --git a/lib/nodejs/test/header.test.js b/lib/nodejs/test/header.test.js index 12f1557a477..24f49beff27 100644 --- a/lib/nodejs/test/header.test.js +++ b/lib/nodejs/test/header.test.js @@ -26,11 +26,11 @@ const test = require("tape"); const path = require("path"); const headerPayload = fs.readFileSync( - path.join(__dirname, "test_header_payload") + path.join(__dirname, "test_header_payload"), ); const cases = { - "Should read headers from payload": function(assert) { + "Should read headers from payload": function (assert) { const transport = new TFramedTransport(); transport.inBuf = Buffer.from(headerPayload); @@ -39,7 +39,7 @@ const cases = { assert.equals(headers.Trace, "abcde"); assert.end(); }, - "Should read different headers from different payload": function(assert) { + "Should read different headers from different payload": function (assert) { const transport = new TFramedTransport(); const buf = Buffer.from(headerPayload); buf[24] = 115; // Change Parent to Parens @@ -52,7 +52,7 @@ const cases = { assert.equals(headers.Trace, "abcde"); assert.end(); }, - "Should read headers when reading message begin": function(assert) { + "Should read headers when reading message begin": function (assert) { const transport = new TFramedTransport(); transport.inBuf = Buffer.from(headerPayload); const protocol = new THeaderProtocol(transport); @@ -65,7 +65,7 @@ const cases = { assert.equals(result.mtype, thrift.Thrift.MessageType.CALL); assert.end(); }, - "Should be able to write headers": function(assert) { + "Should be able to write headers": function (assert) { const writeTransport = new TFramedTransport(); writeTransport.setProtocolId(THeaderTransport.SubprotocolId.BINARY); writeTransport.setWriteHeader("Hihihihi", "hohohoho"); @@ -84,7 +84,7 @@ const cases = { assert.equals(headers.a, "z"); assert.end(); }, - "Separate transports should have separate headers": function(assert) { + "Separate transports should have separate headers": function (assert) { const writeTransport = new TFramedTransport(); writeTransport.setProtocolId(THeaderTransport.SubprotocolId.BINARY); writeTransport.setWriteHeader("foo", "bar"); @@ -101,8 +101,8 @@ const cases = { assert.equals(otherHeaders.otherfoo, "baz"); assert.end(); }, - "Should handle large messages without crashing": function(assert) { - const callback = function() {}; + "Should handle large messages without crashing": function (assert) { + const callback = function () {}; const onData = TFramedTransport.receiver(callback); const largeChunkSize = 2 * 100 * 1024 * 1024; @@ -112,9 +112,9 @@ const cases = { onData(Buffer.concat([sizeBuffer, largeChunk])); assert.end(); - } + }, }; -Object.keys(cases).forEach(function(caseName) { +Object.keys(cases).forEach(function (caseName) { test(caseName, cases[caseName]); }); diff --git a/lib/nodejs/test/helpers.js b/lib/nodejs/test/helpers.js index f3c27b3d1f1..51a0523139e 100644 --- a/lib/nodejs/test/helpers.js +++ b/lib/nodejs/test/helpers.js @@ -22,14 +22,14 @@ const thrift = require("../lib/thrift"); module.exports.transports = { buffered: thrift.TBufferedTransport, - framed: thrift.TFramedTransport + framed: thrift.TFramedTransport, }; module.exports.protocols = { json: thrift.TJSONProtocol, binary: thrift.TBinaryProtocol, compact: thrift.TCompactProtocol, - header: thrift.THeaderProtocol + header: thrift.THeaderProtocol, }; module.exports.ecmaMode = process.argv.includes("--es6") ? "es6" : "es5"; diff --git a/lib/nodejs/test/int64.test.js b/lib/nodejs/test/int64.test.js index 27ad28c003f..21d4d58a6a8 100644 --- a/lib/nodejs/test/int64.test.js +++ b/lib/nodejs/test/int64.test.js @@ -23,7 +23,7 @@ const i64types = require("./gen-nodejs-es6/Int64Test_types.js"); const test = require("tape"); const cases = { - "should correctly generate Int64 constants": function(assert) { + "should correctly generate Int64 constants": function (assert) { const EXPECTED_SMALL_INT64_AS_NUMBER = 42; const EXPECTED_SMALL_INT64 = new Int64(42); const EXPECTED_MAX_JS_SAFE_INT64 = new Int64(Number.MAX_SAFE_INTEGER); @@ -39,7 +39,7 @@ const cases = { EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64, EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64, EXPECTED_MAX_SIGNED_INT64, - EXPECTED_MIN_SIGNED_INT64 + EXPECTED_MIN_SIGNED_INT64, ]; assert.ok(EXPECTED_SMALL_INT64.equals(i64types.SMALL_INT64)); @@ -47,27 +47,27 @@ const cases = { assert.ok(EXPECTED_MIN_JS_SAFE_INT64.equals(i64types.MIN_JS_SAFE_INT64)); assert.ok( EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64.equals( - i64types.MAX_JS_SAFE_PLUS_ONE_INT64 - ) + i64types.MAX_JS_SAFE_PLUS_ONE_INT64, + ), ); assert.ok( EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64.equals( - i64types.MIN_JS_SAFE_MINUS_ONE_INT64 - ) + i64types.MIN_JS_SAFE_MINUS_ONE_INT64, + ), ); assert.ok(EXPECTED_MAX_SIGNED_INT64.equals(i64types.MAX_SIGNED_INT64)); assert.ok(EXPECTED_MIN_SIGNED_INT64.equals(i64types.MIN_SIGNED_INT64)); assert.equal( EXPECTED_SMALL_INT64_AS_NUMBER, - i64types.SMALL_INT64.toNumber() + i64types.SMALL_INT64.toNumber(), ); assert.equal( Number.MAX_SAFE_INTEGER, - i64types.MAX_JS_SAFE_INT64.toNumber() + i64types.MAX_JS_SAFE_INT64.toNumber(), ); assert.equal( Number.MIN_SAFE_INTEGER, - i64types.MIN_JS_SAFE_INT64.toNumber() + i64types.MIN_JS_SAFE_INT64.toNumber(), ); for (let i = 0; i < EXPECTED_INT64_LIST.length; ++i) { @@ -79,14 +79,14 @@ const cases = { assert.ok( i64types.INT64_2_INT64_MAP[ JSONInt64.toDecimalString(int64Object) - ].equals(int64Object) + ].equals(int64Object), ); } assert.end(); - } + }, }; -Object.keys(cases).forEach(function(caseName) { +Object.keys(cases).forEach(function (caseName) { test(caseName, cases[caseName]); }); diff --git a/lib/nodejs/test/server.js b/lib/nodejs/test/server.js index 677839aea2b..c8e7808202a 100644 --- a/lib/nodejs/test/server.js +++ b/lib/nodejs/test/server.js @@ -29,12 +29,12 @@ program .option( "-p, --protocol ", "Set thrift protocol (binary|compact|json)", - "binary" + "binary", ) .option( "-t, --transport ", "Set thrift transport (buffered|framed|http)", - "buffered" + "buffered", ) .option("--ssl", "use ssl transport") .option("--port ", "Set thrift server port", 9090) @@ -42,7 +42,7 @@ program .option( "-t, --type ", "Select server type (http|multiplex|tcp|websocket)", - "tcp" + "tcp", ) .option("--callback", "test with callback style functions") .option("--es6", "Use es6 code") @@ -68,7 +68,7 @@ if (program.transport === "http") { let options = { transport: helpers.transports[program.transport], - protocol: helpers.protocols[program.protocol] + protocol: helpers.protocols[program.protocol], }; if (type === "http" || type === "websocket") { @@ -78,30 +78,30 @@ if (type === "http" || type === "websocket") { options = { services: { "/test": options }, cors: { - "*": true - } + "*": true, + }, }; } let processor; if (type === "multiplex") { const SecondServiceHandler = { - secondtestString: function(thing, result) { + secondtestString: function (thing, result) { console.log('testString("' + thing + '")'); result(null, 'testString("' + thing + '")'); - } + }, }; processor = new thrift.MultiplexedProcessor(); processor.registerProcessor( "ThriftTest", - new ThriftTest.Processor(ThriftTestHandler) + new ThriftTest.Processor(ThriftTestHandler), ); processor.registerProcessor( "SecondService", - new SecondService.Processor(SecondServiceHandler) + new SecondService.Processor(SecondServiceHandler), ); } @@ -114,7 +114,7 @@ if (ssl) { ) { options.tls = { key: fs.readFileSync(path.resolve(__dirname, "server.key")), - cert: fs.readFileSync(path.resolve(__dirname, "server.crt")) + cert: fs.readFileSync(path.resolve(__dirname, "server.crt")), }; } } diff --git a/lib/nodejs/test/test-cases.js b/lib/nodejs/test/test-cases.js index 02c566fbf53..98077f70321 100644 --- a/lib/nodejs/test/test-cases.js +++ b/lib/nodejs/test/test-cases.js @@ -65,9 +65,9 @@ const mapTestInput = (module.exports.mapTestInput = { a: "123", "a b": "with spaces ", same: "same", - "0": "numeric key", + 0: "numeric key", longValue: stringTest, - stringTest: "long key" + stringTest: "long key", }); const simple = [ @@ -93,9 +93,9 @@ const simple = [ ["testI64", new Int64(new Buffer([0, 0x20, 0, 0, 0, 0, 0, 1]))], // 2^53+1 [ "testI64", - new Int64(new Buffer([0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])) + new Int64(new Buffer([0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])), ], // -2^53-1 - ["testTypedef", 69] + ["testTypedef", 69], ]; const mapout = {}; @@ -106,21 +106,21 @@ for (let i = 0; i < 5; ++i) { const deep = [ [ "testList", - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] - ] + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], + ], ]; const deepUnordered = [ ["testMap", mapout], ["testSet", [1, 2, 3]], - ["testStringMap", mapTestInput] + ["testStringMap", mapTestInput], ]; const out = new ttypes.Xtruct({ string_thing: "Zero", byte_thing: 1, i32_thing: -3, - i64_thing: 1000000 + i64_thing: 1000000, }); const out2 = new ttypes.Xtruct2(); @@ -129,44 +129,44 @@ out2.struct_thing = out; out2.i32_thing = 5; const crazy = new ttypes.Insanity({ - userMap: { "5": 5, "8": 8 }, + userMap: { 5: 5, 8: 8 }, xtructs: [ new ttypes.Xtruct({ string_thing: "Goodbye4", byte_thing: 4, i32_thing: 4, - i64_thing: 4 + i64_thing: 4, }), new ttypes.Xtruct({ string_thing: "Hello2", byte_thing: 2, i32_thing: 2, - i64_thing: 2 - }) - ] + i64_thing: 2, + }), + ], }); const crazy2 = new ttypes.Insanity({ - userMap: { "5": 5, "8": 8 }, + userMap: { 5: 5, 8: 8 }, xtructs: [ { string_thing: "Goodbye4", byte_thing: 4, i32_thing: 4, - i64_thing: 4 + i64_thing: 4, }, { string_thing: "Hello2", byte_thing: 2, i32_thing: 2, - i64_thing: 2 - } - ] + i64_thing: 2, + }, + ], }); const insanity = { - "1": { "2": crazy, "3": crazy }, - "2": { "6": { userMap: {}, xtructs: [] } } + 1: { 2: crazy, 3: crazy }, + 2: { 6: { userMap: {}, xtructs: [] } }, }; module.exports.simple = simple; diff --git a/lib/nodejs/test/test_driver.js b/lib/nodejs/test/test_driver.js index 7c9a91914bf..0593aeab671 100644 --- a/lib/nodejs/test/test_driver.js +++ b/lib/nodejs/test/test_driver.js @@ -34,18 +34,18 @@ const TException = require("thrift").Thrift.TException; const Int64 = require("node-int64"); const testCases = require("./test-cases"); -exports.ThriftTestDriver = function(client, callback) { +exports.ThriftTestDriver = function (client, callback) { test( "NodeJS Style Callback Client Tests", { skip: helpers.ecmaMode === "es6" }, - function(assert) { + function (assert) { const checkRecursively = makeRecursiveCheck(assert); function makeAsserter(assertionFn) { - return function(c) { + return function (c) { const fnName = c[0]; const expected = c[1]; - client[fnName](expected, function(err, actual) { + client[fnName](expected, function (err, actual) { assert.error(err, fnName + ": no callback error"); assertionFn(actual, expected, fnName); }); @@ -53,18 +53,18 @@ exports.ThriftTestDriver = function(client, callback) { } testCases.simple.forEach( - makeAsserter(function(a, e, m) { + makeAsserter(function (a, e, m) { if (a instanceof Int64) { const e64 = e instanceof Int64 ? e : new Int64(e); assert.deepEqual(a.buffer, e64.buffer, m); } else { assert.equal(a, e, m); } - }) + }), ); testCases.deep.forEach(makeAsserter(assert.deepEqual)); testCases.deepUnordered.forEach( - makeAsserter(makeUnorderedDeepEqual(assert)) + makeAsserter(makeUnorderedDeepEqual(assert)), ); const arr = []; @@ -72,106 +72,106 @@ exports.ThriftTestDriver = function(client, callback) { arr[i] = 255 - i; } let buf = new Buffer(arr); - client.testBinary(buf, function(err, response) { + client.testBinary(buf, function (err, response) { assert.error(err, "testBinary: no callback error"); assert.equal(response.length, 256, "testBinary"); assert.deepEqual(response, buf, "testBinary(Buffer)"); }); buf = new Buffer(arr); - client.testBinary(buf.toString("binary"), function(err, response) { + client.testBinary(buf.toString("binary"), function (err, response) { assert.error(err, "testBinary: no callback error"); assert.equal(response.length, 256, "testBinary"); assert.deepEqual(response, buf, "testBinary(string)"); }); - client.testMapMap(42, function(err, response) { + client.testMapMap(42, function (err, response) { const expected = { - "4": { "1": 1, "2": 2, "3": 3, "4": 4 }, - "-4": { "-4": -4, "-3": -3, "-2": -2, "-1": -1 } + 4: { 1: 1, 2: 2, 3: 3, 4: 4 }, + "-4": { "-4": -4, "-3": -3, "-2": -2, "-1": -1 }, }; assert.error(err, "testMapMap: no callback error"); assert.deepEqual(expected, response, "testMapMap"); }); - client.testStruct(testCases.out, function(err, response) { + client.testStruct(testCases.out, function (err, response) { assert.error(err, "testStruct: no callback error"); checkRecursively(testCases.out, response, "testStruct"); }); - client.testNest(testCases.out2, function(err, response) { + client.testNest(testCases.out2, function (err, response) { assert.error(err, "testNest: no callback error"); checkRecursively(testCases.out2, response, "testNest"); }); - client.testInsanity(testCases.crazy, function(err, response) { + client.testInsanity(testCases.crazy, function (err, response) { assert.error(err, "testInsanity: no callback error"); checkRecursively(testCases.insanity, response, "testInsanity"); }); - client.testInsanity(testCases.crazy2, function(err, response) { + client.testInsanity(testCases.crazy2, function (err, response) { assert.error(err, "testInsanity2: no callback error"); checkRecursively(testCases.insanity, response, "testInsanity2"); }); - client.testException("TException", function(err, response) { + client.testException("TException", function (err, response) { assert.ok( err instanceof TException, - "testException: correct error type" + "testException: correct error type", ); assert.ok(!response, "testException: no response"); }); - client.testException("Xception", function(err, response) { + client.testException("Xception", function (err, response) { assert.ok( err instanceof ttypes.Xception, - "testException: correct error type" + "testException: correct error type", ); assert.ok(!response, "testException: no response"); assert.equal(err.errorCode, 1001, "testException: correct error code"); assert.equal( "Xception", err.message, - "testException: correct error message" + "testException: correct error message", ); }); - client.testException("no Exception", function(err, response) { + client.testException("no Exception", function (err, response) { assert.error(err, "testException: no callback error"); assert.ok(!response, "testException: no response"); }); - client.testOneway(0, function(err, response) { + client.testOneway(0, function (err, response) { assert.error(err, "testOneway: no callback error"); assert.strictEqual(response, undefined, "testOneway: void response"); }); - checkOffByOne(function(done) { - client.testI32(-1, function(err, response) { + checkOffByOne(function (done) { + client.testI32(-1, function (err, response) { assert.error(err, "checkOffByOne: no callback error"); assert.equal(-1, response); assert.end(); done(); }); }, callback); - } + }, ); // ES6 does not support callback style if (helpers.ecmaMode === "es6") { - checkOffByOne(done => done(), callback); + checkOffByOne((done) => done(), callback); } }; -exports.ThriftTestDriverPromise = function(client, callback) { - test("Promise Client Tests", function(assert) { +exports.ThriftTestDriverPromise = function (client, callback) { + test("Promise Client Tests", function (assert) { const checkRecursively = makeRecursiveCheck(assert); function makeAsserter(assertionFn) { - return function(c) { + return function (c) { const fnName = c[0]; const expected = c[1]; client[fnName](expected) - .then(function(actual) { + .then(function (actual) { assertionFn(actual, expected, fnName); }) .catch(() => assert.fail("fnName")); @@ -179,63 +179,63 @@ exports.ThriftTestDriverPromise = function(client, callback) { } testCases.simple.forEach( - makeAsserter(function(a, e, m) { + makeAsserter(function (a, e, m) { if (a instanceof Int64) { const e64 = e instanceof Int64 ? e : new Int64(e); assert.deepEqual(a.buffer, e64.buffer, m); } else { assert.equal(a, e, m); } - }) + }), ); testCases.deep.forEach(makeAsserter(assert.deepEqual)); testCases.deepUnordered.forEach( - makeAsserter(makeUnorderedDeepEqual(assert)) + makeAsserter(makeUnorderedDeepEqual(assert)), ); client .testStruct(testCases.out) - .then(function(response) { + .then(function (response) { checkRecursively(testCases.out, response, "testStruct"); }) .catch(() => assert.fail("testStruct")); client .testNest(testCases.out2) - .then(function(response) { + .then(function (response) { checkRecursively(testCases.out2, response, "testNest"); }) .catch(() => assert.fail("testNest")); client .testInsanity(testCases.crazy) - .then(function(response) { + .then(function (response) { checkRecursively(testCases.insanity, response, "testInsanity"); }) .catch(() => assert.fail("testInsanity")); client .testInsanity(testCases.crazy2) - .then(function(response) { + .then(function (response) { checkRecursively(testCases.insanity, response, "testInsanity2"); }) .catch(() => assert.fail("testInsanity2")); client .testException("TException") - .then(function() { + .then(function () { assert.fail("testException: TException"); }) - .catch(function(err) { + .catch(function (err) { assert.ok(err instanceof TException); }); client .testException("Xception") - .then(function() { + .then(function () { assert.fail("testException: Xception"); }) - .catch(function(err) { + .catch(function (err) { assert.ok(err instanceof ttypes.Xception); assert.equal(err.errorCode, 1001); assert.equal("Xception", err.message); @@ -243,22 +243,22 @@ exports.ThriftTestDriverPromise = function(client, callback) { client .testException("no Exception") - .then(function(response) { + .then(function (response) { assert.equal(undefined, response); //void }) .catch(() => assert.fail("testException")); client .testOneway(0) - .then(function(response) { + .then(function (response) { assert.strictEqual(response, undefined, "testOneway: void response"); }) .catch(() => assert.fail("testOneway: should not reject")); - checkOffByOne(function(done) { + checkOffByOne(function (done) { client .testI32(-1) - .then(function(response) { + .then(function (response) { assert.equal(-1, response); assert.end(); done(); @@ -272,7 +272,7 @@ exports.ThriftTestDriverPromise = function(client, callback) { // ========================================================= function makeRecursiveCheck(assert) { - return function(map1, map2, msg) { + return function (map1, map2, msg) { const equal = checkRecursively(map1, map2); assert.ok(equal, msg); @@ -295,7 +295,7 @@ function makeRecursiveCheck(assert) { return map1 == map2; } } else { - return Object.keys(map1).every(function(key) { + return Object.keys(map1).every(function (key) { return checkRecursively(map1[key], map2[key]); }); } @@ -319,7 +319,7 @@ function checkOffByOne(done, callback) { * Because this is the last test against the server, when it completes * the entire suite is complete by definition (the tests run serially). */ - done(function() { + done(function () { test_complete = true; }); @@ -334,7 +334,7 @@ function checkOffByOne(done, callback) { callback( "Server test failed to complete after " + (retry_limit * retry_interval) / 1000 + - " seconds" + " seconds", ); } } @@ -344,7 +344,7 @@ function checkOffByOne(done, callback) { } function makeUnorderedDeepEqual(assert) { - return function(actual, expected, name) { + return function (actual, expected, name) { assert.equal(actual.length, expected.length, name); for (const k in actual) { let found = false; diff --git a/lib/nodejs/test/test_handler.js b/lib/nodejs/test/test_handler.js index 317a7c81016..a6a6fc2e327 100644 --- a/lib/nodejs/test/test_handler.js +++ b/lib/nodejs/test/test_handler.js @@ -24,7 +24,7 @@ const ttypes = require(`./${helpers.genPath}/ThriftTest_types`); const TException = require("thrift").Thrift.TException; function makeSyncHandler() { - return function(thing) { + return function (thing) { return thing; }; } @@ -36,11 +36,11 @@ const syncHandlers = { testMulti: testMulti, testException: testException, testMultiException: testMultiException, - testOneway: testOneway + testOneway: testOneway, }; function makeAsyncHandler(label) { - return function(thing, result) { + return function (thing, result) { thing = syncHandlers[label](thing); result(null, thing); }; @@ -51,7 +51,7 @@ const asyncHandlers = { testMulti: testMultiAsync, testException: testExceptionAsync, testMultiException: testMultiExceptionAsync, - testOneway: testOnewayAsync + testOneway: testOnewayAsync, }; const identityHandlers = [ @@ -69,7 +69,7 @@ const identityHandlers = [ "testSet", "testList", "testEnum", - "testTypedef" + "testTypedef", ]; function testVoid() { @@ -208,12 +208,12 @@ function testOnewayAsync(sleepFor) { testOneway(sleepFor); } -identityHandlers.forEach(function(label) { +identityHandlers.forEach(function (label) { syncHandlers[label] = makeSyncHandler(label); asyncHandlers[label] = makeAsyncHandler(label); }); -["testMapMap", "testInsanity"].forEach(function(label) { +["testMapMap", "testInsanity"].forEach(function (label) { asyncHandlers[label] = makeAsyncHandler(label); }); diff --git a/lib/nodets/test/client.ts b/lib/nodets/test/client.ts index 4fa3c2868dd..a95567f8dc3 100644 --- a/lib/nodets/test/client.ts +++ b/lib/nodets/test/client.ts @@ -39,15 +39,15 @@ var promise = program.promise; var options = { transport: Thrift.TBufferedTransport, - protocol: Thrift.TBinaryProtocol + protocol: Thrift.TBinaryProtocol, }; var testDriver = promise ? ThriftTestDriverPromise : ThriftTestDriver; var connection = thrift.createConnection("localhost", port, options); -connection.on("error", function(err: string) { - assert(false, err); +connection.on("error", function (err: string) { + assert(false, err); }); var client = thrift.createClient(ThriftTest.Client, connection); @@ -60,4 +60,4 @@ function runTests() { }); } -exports.expressoTest = function() {}; +exports.expressoTest = function () {}; diff --git a/lib/nodets/test/int64.test.ts b/lib/nodets/test/int64.test.ts index d209234b50c..bb0345851e1 100644 --- a/lib/nodets/test/int64.test.ts +++ b/lib/nodets/test/int64.test.ts @@ -18,18 +18,26 @@ */ import Int64 = require("node-int64"); -import JSONInt64 = require('json-int64'); +import JSONInt64 = require("json-int64"); import i64types = require("./gen-nodejs/Int64Test_types"); import test = require("tape"); const cases = { - "should correctly generate Int64 constants": function(assert) { + "should correctly generate Int64 constants": function (assert) { const EXPECTED_SMALL_INT64_AS_NUMBER: number = 42; const EXPECTED_SMALL_INT64: Int64 = new Int64(42); - const EXPECTED_MAX_JS_SAFE_INT64: Int64 = new Int64(Number.MAX_SAFE_INTEGER); - const EXPECTED_MIN_JS_SAFE_INT64: Int64 = new Int64(Number.MIN_SAFE_INTEGER); - const EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64: Int64 = new Int64("0020000000000000"); // hex-encoded - const EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64: Int64 = new Int64("ffe0000000000000"); // hex-encoded 2's complement + const EXPECTED_MAX_JS_SAFE_INT64: Int64 = new Int64( + Number.MAX_SAFE_INTEGER, + ); + const EXPECTED_MIN_JS_SAFE_INT64: Int64 = new Int64( + Number.MIN_SAFE_INTEGER, + ); + const EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64: Int64 = new Int64( + "0020000000000000", + ); // hex-encoded + const EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64: Int64 = new Int64( + "ffe0000000000000", + ); // hex-encoded 2's complement const EXPECTED_MAX_SIGNED_INT64: Int64 = new Int64("7fffffffffffffff"); // hex-encoded const EXPECTED_MIN_SIGNED_INT64: Int64 = new Int64("8000000000000000"); // hex-encoded 2's complement const EXPECTED_INT64_LIST: Int64[] = [ @@ -39,7 +47,7 @@ const cases = { EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64, EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64, EXPECTED_MAX_SIGNED_INT64, - EXPECTED_MIN_SIGNED_INT64 + EXPECTED_MIN_SIGNED_INT64, ]; assert.ok(EXPECTED_SMALL_INT64.equals(i64types.SMALL_INT64)); @@ -47,42 +55,46 @@ const cases = { assert.ok(EXPECTED_MIN_JS_SAFE_INT64.equals(i64types.MIN_JS_SAFE_INT64)); assert.ok( EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64.equals( - i64types.MAX_JS_SAFE_PLUS_ONE_INT64 - ) + i64types.MAX_JS_SAFE_PLUS_ONE_INT64, + ), ); assert.ok( EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64.equals( - i64types.MIN_JS_SAFE_MINUS_ONE_INT64 - ) + i64types.MIN_JS_SAFE_MINUS_ONE_INT64, + ), ); assert.ok(EXPECTED_MAX_SIGNED_INT64.equals(i64types.MAX_SIGNED_INT64)); assert.ok(EXPECTED_MIN_SIGNED_INT64.equals(i64types.MIN_SIGNED_INT64)); assert.equal( EXPECTED_SMALL_INT64_AS_NUMBER, - i64types.SMALL_INT64.toNumber() + i64types.SMALL_INT64.toNumber(), ); assert.equal( Number.MAX_SAFE_INTEGER, - i64types.MAX_JS_SAFE_INT64.toNumber() + i64types.MAX_JS_SAFE_INT64.toNumber(), ); assert.equal( Number.MIN_SAFE_INTEGER, - i64types.MIN_JS_SAFE_INT64.toNumber() + i64types.MIN_JS_SAFE_INT64.toNumber(), ); for (let i = 0; i < EXPECTED_INT64_LIST.length; ++i) { assert.ok(EXPECTED_INT64_LIST[i].equals(i64types.INT64_LIST[i])); } - for (let i = 0; i < EXPECTED_INT64_LIST.length; ++i){ + for (let i = 0; i < EXPECTED_INT64_LIST.length; ++i) { let int64Object = EXPECTED_INT64_LIST[i]; - assert.ok(i64types.INT64_2_INT64_MAP[JSONInt64.toDecimalString(int64Object)].equals(int64Object)); + assert.ok( + i64types.INT64_2_INT64_MAP[ + JSONInt64.toDecimalString(int64Object) + ].equals(int64Object), + ); } assert.end(); - } + }, }; -Object.keys(cases).forEach(function(caseName) { +Object.keys(cases).forEach(function (caseName) { test(caseName, cases[caseName]); }); diff --git a/lib/nodets/test/server.ts b/lib/nodets/test/server.ts index 2da53aee29b..79457ce99aa 100644 --- a/lib/nodets/test/server.ts +++ b/lib/nodets/test/server.ts @@ -1,26 +1,33 @@ import thrift = require("thrift"); -var program = require('commander'); -import ThriftTest = require('./gen-nodejs/ThriftTest'); -import test_handler = require('./test_handler'); - +var program = require("commander"); +import ThriftTest = require("./gen-nodejs/ThriftTest"); +import test_handler = require("./test_handler"); program - .option('--port ', 'Set thrift server port', 9090) - .option('--promise', 'test with promise style functions') - .option('--protocol', '"Set thrift protocol (binary) [protocol]"') + .option("--port ", "Set thrift server port", 9090) + .option("--promise", "test with promise style functions") + .option("--protocol", '"Set thrift protocol (binary) [protocol]"') .parse(process.argv); var port: number = program.port; var options: thrift.ServerOptions = { transport: thrift.TBufferedTransport, - protocol: thrift.TBinaryProtocol + protocol: thrift.TBinaryProtocol, }; var server: thrift.Server; if (program.promise) { - server = thrift.createServer(ThriftTest.Processor, new test_handler.AsyncThriftTestHandler(), options); + server = thrift.createServer( + ThriftTest.Processor, + new test_handler.AsyncThriftTestHandler(), + options, + ); } else { - server = thrift.createServer(ThriftTest.Processor, new test_handler.SyncThriftTestHandler(), options); + server = thrift.createServer( + ThriftTest.Processor, + new test_handler.SyncThriftTestHandler(), + options, + ); } server.listen(port); diff --git a/lib/nodets/test/test-cases.ts b/lib/nodets/test/test-cases.ts index 44f254e9200..98f54af5ca5 100644 --- a/lib/nodets/test/test-cases.ts +++ b/lib/nodets/test/test-cases.ts @@ -1,91 +1,100 @@ -'use strict'; +"use strict"; -import ttypes = require('./gen-nodejs/ThriftTest_types'); -import Int64 = require('node-int64'); +import ttypes = require("./gen-nodejs/ThriftTest_types"); +import Int64 = require("node-int64"); //all Languages in UTF-8 /*jshint -W100 */ -export var stringTest = "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, " + - "Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, " + - "Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, " + - "বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, " + - "Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, " + - "Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, " + - "Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, " + - "Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, " + - "Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, " + - "Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, " + - "Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, " + - "ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, " + - "Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, " + - "Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa " + - "Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, مازِرونی, Bahasa " + - "Melayu, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪" + - "Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, " + - "Occitan, Иронау, Papiamentu, Deitsch, Polski, پنجابی, پښتو, " + - "Norfuk / Pitkern, Português, Runa Simi, Rumantsch, Romani, Română, " + - "Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple " + - "English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, " + - "Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, " + - "Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, " + - "Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, " + - "Bân-lâm-gú, 粵語"; +export var stringTest = + "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, " + + "Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, " + + "Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, " + + "বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, " + + "Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, " + + "Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, " + + "Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, " + + "Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, " + + "Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, " + + "Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, " + + "Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, " + + "ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, " + + "Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, " + + "Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa " + + "Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, مازِرونی, Bahasa " + + "Melayu, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪" + + "Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, " + + "Occitan, Иронау, Papiamentu, Deitsch, Polski, پنجابی, پښتو, " + + "Norfuk / Pitkern, Português, Runa Simi, Rumantsch, Romani, Română, " + + "Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple " + + "English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, " + + "Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, " + + "Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, " + + "Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, " + + "Bân-lâm-gú, 粵語"; /*jshint +W100 */ -export var specialCharacters = 'quote: \" backslash:' + - ' forwardslash-escaped: \/ ' + - ' backspace: \b formfeed: \f newline: \n return: \r tab: ' + - ' now-all-of-them-together: "\\\/\b\n\r\t' + - ' now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><' + - ' char-to-test-json-parsing: ]] \"]] \\" }}}{ [[[ '; +export var specialCharacters = + 'quote: \" backslash:' + + " forwardslash-escaped: \/ " + + " backspace: \b formfeed: \f newline: \n return: \r tab: " + + ' now-all-of-them-together: "\\\/\b\n\r\t' + + " now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><" + + ' char-to-test-json-parsing: ]] \"]] \\" }}}{ [[[ '; export var mapTestInput = { - "a":"123", "a b":"with spaces ", "same":"same", "0":"numeric key", - "longValue":stringTest, stringTest:"long key" + a: "123", + "a b": "with spaces ", + same: "same", + "0": "numeric key", + longValue: stringTest, + stringTest: "long key", }; export var simple = [ - ['testVoid', undefined], - ['testString', 'Test'], - ['testString', ''], - ['testString', stringTest], - ['testString', specialCharacters], - ['testByte', 1], - ['testByte', 0], - ['testByte', -1], - ['testByte', -127], - ['testI32', -1], - ['testDouble', -5.2098523], - ['testDouble', 7.012052175215044], - ['testEnum', ttypes.Numberz.ONE] + ["testVoid", undefined], + ["testString", "Test"], + ["testString", ""], + ["testString", stringTest], + ["testString", specialCharacters], + ["testByte", 1], + ["testByte", 0], + ["testByte", -1], + ["testByte", -127], + ["testI32", -1], + ["testDouble", -5.2098523], + ["testDouble", 7.012052175215044], + ["testEnum", ttypes.Numberz.ONE], ]; export var simpleLoose = [ - ['testI64', 5], - ['testI64', -5], - ['testI64', 734359738368], - ['testI64', -34359738368], - ['testI64', -734359738368], - ['testTypedef', 69] -] + ["testI64", 5], + ["testI64", -5], + ["testI64", 734359738368], + ["testI64", -34359738368], + ["testI64", -734359738368], + ["testTypedef", 69], +]; -var mapout: {[key: number]: number; } = {}; +var mapout: { [key: number]: number } = {}; for (var i = 0; i < 5; ++i) { - mapout[i] = i-10; + mapout[i] = i - 10; } export var deep = [ - ['testMap', mapout], - ['testSet', [1,2,3]], - ['testList', [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]], - ['testStringMap', mapTestInput] + ["testMap", mapout], + ["testSet", [1, 2, 3]], + [ + "testList", + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], + ], + ["testStringMap", mapTestInput], ]; export var out = new ttypes.Xtruct({ - string_thing: 'Zero', + string_thing: "Zero", byte_thing: 1, i32_thing: -3, - i64_thing: new Int64(1000000) + i64_thing: new Int64(1000000), }); export var out2 = new ttypes.Xtruct2(); @@ -94,21 +103,24 @@ out2.struct_thing = out; out2.i32_thing = 5; export var crazy = new ttypes.Insanity({ - "userMap":{ "5":new Int64(5), "8":new Int64(8) }, - "xtructs":[new ttypes.Xtruct({ - "string_thing":"Goodbye4", - "byte_thing":4, - "i32_thing":4, - "i64_thing":new Int64(4) - }), new ttypes.Xtruct({ - "string_thing":"Hello2", - "byte_thing":2, - "i32_thing":2, - "i64_thing":new Int64(2) - })] + userMap: { "5": new Int64(5), "8": new Int64(8) }, + xtructs: [ + new ttypes.Xtruct({ + string_thing: "Goodbye4", + byte_thing: 4, + i32_thing: 4, + i64_thing: new Int64(4), + }), + new ttypes.Xtruct({ + string_thing: "Hello2", + byte_thing: 2, + i32_thing: 2, + i64_thing: new Int64(2), + }), + ], }); export var insanity: any = { - "1":{ "2": crazy, "3": crazy }, - "2":{ "6":{ "userMap":{}, "xtructs":[] } } + "1": { "2": crazy, "3": crazy }, + "2": { "6": { userMap: {}, xtructs: [] } }, }; diff --git a/lib/nodets/test/test_driver.ts b/lib/nodets/test/test_driver.ts index 2c4152616ee..604d5e5836d 100644 --- a/lib/nodets/test/test_driver.ts +++ b/lib/nodets/test/test_driver.ts @@ -17,14 +17,14 @@ * under the License. */ - // This is the Node.js test driver for the standard Apache Thrift - // test service. The driver invokes every function defined in the - // Thrift Test service with a representative range of parameters. - // - // The ThriftTestDriver function requires a client object - // connected to a server hosting the Thrift Test service and - // supports an optional callback function which is called with - // a status message when the test is complete. +// This is the Node.js test driver for the standard Apache Thrift +// test service. The driver invokes every function defined in the +// Thrift Test service with a representative range of parameters. +// +// The ThriftTestDriver function requires a client object +// connected to a server hosting the Thrift Test service and +// supports an optional callback function which is called with +// a status message when the test is complete. import test = require("tape"); import ttypes = require("./gen-nodejs/ThriftTest_types"); @@ -35,107 +35,118 @@ import TException = thrift.Thrift.TException; var Int64 = require("node-int64"); import testCases = require("./test-cases"); -export function ThriftTestDriver(client: ThriftTest.Client, callback: (status: string) => void) { - - test("NodeJS Style Callback Client Tests", function(assert) { - +export function ThriftTestDriver( + client: ThriftTest.Client, + callback: (status: string) => void, +) { + test("NodeJS Style Callback Client Tests", function (assert) { var checkRecursively = makeRecursiveCheck(assert); function makeAsserter(assertionFn: (a: any, b: any, msg?: string) => void) { - return function(c: (string | any)[]) { + return function (c: (string | any)[]) { var fnName = c[0]; var expected = c[1]; - (client)[fnName](expected, function(err: any, actual: any) { + (client)[fnName](expected, function (err: any, actual: any) { assert.error(err, fnName + ": no callback error"); assertionFn(actual, expected, fnName); - }) + }); }; } testCases.simple.forEach(makeAsserter(assert.equal)); - testCases.simpleLoose.forEach(makeAsserter(function(a, e, m){ - assert.ok(a == e, m); - })); + testCases.simpleLoose.forEach( + makeAsserter(function (a, e, m) { + assert.ok(a == e, m); + }), + ); testCases.deep.forEach(makeAsserter(assert.deepEqual)); - client.testMapMap(42, function(err, response) { + client.testMapMap(42, function (err, response) { var expected: typeof response = { - "4": {"1":1, "2":2, "3":3, "4":4}, - "-4": {"-4":-4, "-3":-3, "-2":-2, "-1":-1} + "4": { "1": 1, "2": 2, "3": 3, "4": 4 }, + "-4": { "-4": -4, "-3": -3, "-2": -2, "-1": -1 }, }; - assert.error(err, 'testMapMap: no callback error'); + assert.error(err, "testMapMap: no callback error"); assert.deepEqual(expected, response, "testMapMap"); }); - client.testStruct(testCases.out, function(err, response) { + client.testStruct(testCases.out, function (err, response) { assert.error(err, "testStruct: no callback error"); checkRecursively(testCases.out, response, "testStruct"); }); - client.testNest(testCases.out2, function(err, response) { + client.testNest(testCases.out2, function (err, response) { assert.error(err, "testNest: no callback error"); checkRecursively(testCases.out2, response, "testNest"); }); - client.testInsanity(testCases.crazy, function(err, response) { + client.testInsanity(testCases.crazy, function (err, response) { assert.error(err, "testInsanity: no callback error"); checkRecursively(testCases.insanity, response, "testInsanity"); }); - client.testException("TException", function(err, response) { - assert.ok(err instanceof TException, 'testException: correct error type'); - assert.ok(!Boolean(response), 'testException: no response'); + client.testException("TException", function (err, response) { + assert.ok(err instanceof TException, "testException: correct error type"); + assert.ok(!Boolean(response), "testException: no response"); }); - client.testException("Xception", function(err, response) { - assert.ok(err instanceof ttypes.Xception, 'testException: correct error type'); - assert.ok(!Boolean(response), 'testException: no response'); - assert.equal(err.errorCode, 1001, 'testException: correct error code'); - assert.equal('Xception', err.message, 'testException: correct error message'); + client.testException("Xception", function (err, response) { + assert.ok( + err instanceof ttypes.Xception, + "testException: correct error type", + ); + assert.ok(!Boolean(response), "testException: no response"); + assert.equal(err.errorCode, 1001, "testException: correct error code"); + assert.equal( + "Xception", + err.message, + "testException: correct error message", + ); }); - client.testException("no Exception", function(err, response) { - assert.error(err, 'testException: no callback error'); - assert.ok(!Boolean(response), 'testException: no response'); + client.testException("no Exception", function (err, response) { + assert.error(err, "testException: no callback error"); + assert.ok(!Boolean(response), "testException: no response"); }); - client.testOneway(0, function(err, response) { - assert.error(err, 'testOneway: no callback error'); - assert.strictEqual(response, undefined, 'testOneway: void response'); + client.testOneway(0, function (err, response) { + assert.error(err, "testOneway: no callback error"); + assert.strictEqual(response, undefined, "testOneway: void response"); }); - checkOffByOne(function(done) { - client.testI32(-1, function(err, response) { + checkOffByOne(function (done) { + client.testI32(-1, function (err, response) { assert.error(err, "checkOffByOne: no callback error"); assert.equal(-1, response); assert.end(); done(); }); }, callback); - }); -}; - -export function ThriftTestDriverPromise(client: ThriftTest.Client, callback: (status: string) => void) { - - test("Q Promise Client Tests", function(assert) { +} +export function ThriftTestDriverPromise( + client: ThriftTest.Client, + callback: (status: string) => void, +) { + test("Q Promise Client Tests", function (assert) { var checkRecursively = makeRecursiveCheck(assert); function fail(msg: string) { - return function(error, response) { + return function (error, response) { if (error !== null) { assert.fail(msg); } - } + }; } function makeAsserter(assertionFn: (a: any, b: any, msg?: string) => void) { - return function(c: (string | any)[]) { + return function (c: (string | any)[]) { var fnName = c[0]; var expected = c[1]; - (client)[fnName](expected) - .then(function(actual: any) { + (client) + [fnName](expected) + .then(function (actual: any) { assertionFn(actual, expected, fnName); }) .fail(fail("fnName")); @@ -143,73 +154,73 @@ export function ThriftTestDriverPromise(client: ThriftTest.Client, callback: (st } testCases.simple.forEach(makeAsserter(assert.equal)); - testCases.simpleLoose.forEach(makeAsserter(function(a, e, m){ - assert.ok(a == e, m); - })); + testCases.simpleLoose.forEach( + makeAsserter(function (a, e, m) { + assert.ok(a == e, m); + }), + ); testCases.deep.forEach(makeAsserter(assert.deepEqual)); Q.resolve(client.testStruct(testCases.out)) - .then(function(response) { + .then(function (response) { checkRecursively(testCases.out, response, "testStruct"); }) .fail(fail("testStruct")); Q.resolve(client.testNest(testCases.out2)) - .then(function(response) { + .then(function (response) { checkRecursively(testCases.out2, response, "testNest"); }) .fail(fail("testNest")); Q.resolve(client.testInsanity(testCases.crazy)) - .then(function(response) { + .then(function (response) { checkRecursively(testCases.insanity, response, "testInsanity"); }) .fail(fail("testInsanity")); Q.resolve(client.testException("TException")) - .then(function(response) { + .then(function (response) { fail("testException: TException"); }) - .fail(function(err) { + .fail(function (err) { assert.ok(err instanceof TException); }); Q.resolve(client.testException("Xception")) - .then(function(response) { + .then(function (response) { fail("testException: Xception"); }) - .fail(function(err) { + .fail(function (err) { assert.ok(err instanceof ttypes.Xception); assert.equal(err.errorCode, 1001); assert.equal("Xception", err.message); }); Q.resolve(client.testException("no Exception")) - .then(function(response) { + .then(function (response) { assert.equal(undefined, response); //void }) .fail(fail("testException")); client.testOneway(0, fail("testOneway: should not answer")); - checkOffByOne(function(done) { + checkOffByOne(function (done) { Q.resolve(client.testI32(-1)) - .then(function(response) { - assert.equal(-1, response); - assert.end(); - done(); + .then(function (response) { + assert.equal(-1, response); + assert.end(); + done(); }) .fail(fail("checkOffByOne")); }, callback); }); -}; - +} // Helper Functions // ========================================================= function makeRecursiveCheck(assert: test.Test) { - return function (map1: any, map2: any, msg: string) { var equal = true; @@ -218,30 +229,37 @@ function makeRecursiveCheck(assert: test.Test) { assert.ok(equal, msg); // deepEqual doesn't work with fields using node-int64 - function checkRecursively(map1: any, map2: any) : boolean { + function checkRecursively(map1: any, map2: any): boolean { if (!(typeof map1 !== "function" && typeof map2 !== "function")) { return false; } if (!map1 || typeof map1 !== "object") { //Handle int64 types (which use node-int64 in Node.js JavaScript) - if ((typeof map1 === "number") && (typeof map2 === "object") && - (map2.buffer) && (map2.buffer instanceof Buffer) && (map2.buffer.length === 8)) { + if ( + typeof map1 === "number" && + typeof map2 === "object" && + map2.buffer && + map2.buffer instanceof Buffer && + map2.buffer.length === 8 + ) { var n = new Int64(map2.buffer); return map1 === n.toNumber(); } else { return map1 == map2; } } else { - return Object.keys(map1).every(function(key) { + return Object.keys(map1).every(function (key) { return checkRecursively(map1[key], map2[key]); }); } } - } + }; } -function checkOffByOne(done: (callback: () => void) => void, callback: (message: string) => void) { - +function checkOffByOne( + done: (callback: () => void) => void, + callback: (message: string) => void, +) { var retry_limit = 30; var retry_interval = 100; var test_complete = false; @@ -256,20 +274,23 @@ function checkOffByOne(done: (callback: () => void) => void, callback: (message: * Because this is the last test against the server, when it completes * the entire suite is complete by definition (the tests run serially). */ - done(function() { + done(function () { test_complete = true; }); //We wait up to retry_limit * retry_interval for the test suite to complete function TestForCompletion() { - if(test_complete && callback) { + if (test_complete && callback) { callback("Server successfully tested!"); } else { if (++retrys < retry_limit) { setTimeout(TestForCompletion, retry_interval); } else if (callback) { - callback("Server test failed to complete after " + - (retry_limit * retry_interval / 1000) + " seconds"); + callback( + "Server test failed to complete after " + + (retry_limit * retry_interval) / 1000 + + " seconds", + ); } } } diff --git a/lib/nodets/test/test_handler.ts b/lib/nodets/test/test_handler.ts index 996c32a5a32..823b4e7ee03 100644 --- a/lib/nodets/test/test_handler.ts +++ b/lib/nodets/test/test_handler.ts @@ -26,7 +26,6 @@ import Thrift = thrift.Thrift; import Q = require("q"); import Int64 = require("node-int64"); - export class SyncThriftTestHandler { testVoid(): Q.IPromise { //console.log('testVoid()'); @@ -35,9 +34,9 @@ export class SyncThriftTestHandler { testMapMap(hello: number) { //console.log('testMapMap(' + hello + ')'); - var mapmap: {[key: number]: {[key: number]: number; }} = []; - var pos: {[key: number]: number; } = []; - var neg: {[key: number]: number; } = []; + var mapmap: { [key: number]: { [key: number]: number } } = []; + var pos: { [key: number]: number } = []; + var neg: { [key: number]: number } = []; for (var i = 1; i < 5; i++) { pos[i] = i; neg[-i] = -i; @@ -47,53 +46,60 @@ export class SyncThriftTestHandler { return Q.resolve(mapmap); } - testInsanity(argument: ttypes.Insanity): Q.IPromise<{ [k: number]: any; }> { - const first_map: { [k: number]: any; } = []; - const second_map: { [k: number]: any; } = []; - + testInsanity(argument: ttypes.Insanity): Q.IPromise<{ [k: number]: any }> { + const first_map: { [k: number]: any } = []; + const second_map: { [k: number]: any } = []; + first_map[ttypes.Numberz.TWO] = argument; first_map[ttypes.Numberz.THREE] = argument; - + const looney = new ttypes.Insanity(); second_map[ttypes.Numberz.SIX] = looney; - - const insane: { [k: number]: any; } = []; + + const insane: { [k: number]: any } = []; insane[1] = first_map; insane[2] = second_map; return Q.resolve(insane); } - testMulti(arg0: any, arg1: number, arg2: Int64, arg3: { [k: number]: string; }, arg4: ttypes.Numberz, arg5: number) { + testMulti( + arg0: any, + arg1: number, + arg2: Int64, + arg3: { [k: number]: string }, + arg4: ttypes.Numberz, + arg5: number, + ) { var hello = new ttypes.Xtruct(); - hello.string_thing = 'Hello2'; + hello.string_thing = "Hello2"; hello.byte_thing = arg0; hello.i32_thing = arg1; hello.i64_thing = arg2; return Q.resolve(hello); } testException(arg: string): Q.IPromise { - if (arg === 'Xception') { + if (arg === "Xception") { var x = new ttypes.Xception(); x.errorCode = 1001; x.message = arg; throw x; - } else if (arg === 'TException') { + } else if (arg === "TException") { throw new Thrift.TException(arg); } else { return Q.resolve(); } } testMultiException(arg0: string, arg1: string) { - if (arg0 === ('Xception')) { + if (arg0 === "Xception") { var x = new ttypes.Xception(); x.errorCode = 1001; - x.message = 'This is an Xception'; + x.message = "This is an Xception"; throw x; - } else if (arg0 === ('Xception2')) { + } else if (arg0 === "Xception2") { var x2 = new ttypes.Xception2(); x2.errorCode = 2002; x2.struct_thing = new ttypes.Xtruct(); - x2.struct_thing.string_thing = 'This is an Xception2'; + x2.struct_thing.string_thing = "This is an Xception2"; throw x2; } @@ -101,8 +107,7 @@ export class SyncThriftTestHandler { res.string_thing = arg1; return Q.resolve(res); } - testOneway(sleepFor: number) { - } + testOneway(sleepFor: number) {} testString(thing: string) { return Q.resolve(thing); @@ -131,10 +136,10 @@ export class SyncThriftTestHandler { testNest(thing: ttypes.Xtruct2) { return Q.resolve(thing); } - testMap(thing: { [k: number]: number; }) { + testMap(thing: { [k: number]: number }) { return Q.resolve(thing); } - testStringMap(thing: { [k: string]: string; }) { + testStringMap(thing: { [k: string]: string }) { return Q.resolve(thing); } testSet(thing: number[]) { @@ -161,13 +166,16 @@ export class AsyncThriftTestHandler { callback(undefined); return Q.resolve(); } - testMapMap(hello: number, - callback: (err: any, result: { [k: number]: { [k: number]: number; }; }) => void): - Q.IPromise<{ [k: number]: { [k: number]: number; }; }> { - - var mapmap: {[key: number]: {[key: number]: number; }} = []; - var pos: {[key: number]: number; } = []; - var neg: {[key: number]: number; } = []; + testMapMap( + hello: number, + callback: ( + err: any, + result: { [k: number]: { [k: number]: number } }, + ) => void, + ): Q.IPromise<{ [k: number]: { [k: number]: number } }> { + var mapmap: { [key: number]: { [key: number]: number } } = []; + var pos: { [key: number]: number } = []; + var neg: { [key: number]: number } = []; for (var i = 1; i < 5; i++) { pos[i] = i; neg[-i] = -i; @@ -178,54 +186,69 @@ export class AsyncThriftTestHandler { callback(null, mapmap); return Q.resolve(); } - testInsanity(argument: ttypes.Insanity, callback?: (err: any, result: { [k: number]: any; }) => void): Q.IPromise<{ [k: number]: any; }> { - const first_map: { [k: number]: any; } = []; - const second_map: { [k: number]: any; } = []; - + testInsanity( + argument: ttypes.Insanity, + callback?: (err: any, result: { [k: number]: any }) => void, + ): Q.IPromise<{ [k: number]: any }> { + const first_map: { [k: number]: any } = []; + const second_map: { [k: number]: any } = []; + first_map[ttypes.Numberz.TWO] = argument; first_map[ttypes.Numberz.THREE] = argument; - + const looney = new ttypes.Insanity(); second_map[ttypes.Numberz.SIX] = looney; - - const insane: { [k: number]: any; } = []; + + const insane: { [k: number]: any } = []; insane[1] = first_map; insane[2] = second_map; - if (callback !== undefined){ + if (callback !== undefined) { callback(null, insane); } return Q.resolve(); } - testMulti(arg0: any, arg1: number, arg2: Int64, arg3: { [k: number]: string; }, arg4: ttypes.Numberz, arg5: number, result: Function): Q.IPromise { + testMulti( + arg0: any, + arg1: number, + arg2: Int64, + arg3: { [k: number]: string }, + arg4: ttypes.Numberz, + arg5: number, + result: Function, + ): Q.IPromise { var hello = this.syncHandler.testMulti(arg0, arg1, arg2, arg3, arg4, arg5); - hello.then(hello => result(null, hello)); + hello.then((hello) => result(null, hello)); return Q.resolve(); } testException(arg: string, result: (err: any) => void): Q.IPromise { - if (arg === 'Xception') { + if (arg === "Xception") { var x = new ttypes.Xception(); x.errorCode = 1001; x.message = arg; result(x); - } else if (arg === 'TException') { + } else if (arg === "TException") { result(new Thrift.TException(arg)); } else { result(null); } return Q.resolve(); } - testMultiException(arg0: string, arg1: string, result: (err: any, res?: ttypes.Xtruct) => void): Q.IPromise { - if (arg0 === ('Xception')) { + testMultiException( + arg0: string, + arg1: string, + result: (err: any, res?: ttypes.Xtruct) => void, + ): Q.IPromise { + if (arg0 === "Xception") { var x = new ttypes.Xception(); x.errorCode = 1001; - x.message = 'This is an Xception'; + x.message = "This is an Xception"; result(x); - } else if (arg0 === ('Xception2')) { + } else if (arg0 === "Xception2") { var x2 = new ttypes.Xception2(); x2.errorCode = 2002; x2.struct_thing = new ttypes.Xtruct(); - x2.struct_thing.string_thing = 'This is an Xception2'; + x2.struct_thing.string_thing = "This is an Xception2"; result(x2); } else { var res = new ttypes.Xtruct(); @@ -237,63 +260,108 @@ export class AsyncThriftTestHandler { testOneway(sleepFor: number, result: Function) { this.syncHandler.testOneway(sleepFor); } - testString(thing: string, callback: (err: any, result: string) => void): Q.IPromise { + testString( + thing: string, + callback: (err: any, result: string) => void, + ): Q.IPromise { callback(null, thing); return Q.resolve(); } - testByte(thing: number, callback: (err: any, result: number) => void): Q.IPromise { + testByte( + thing: number, + callback: (err: any, result: number) => void, + ): Q.IPromise { callback(null, thing); return Q.resolve(); } - testBool(thing: boolean, callback: (err: any, result: boolean) => void ): Q.IPromise { + testBool( + thing: boolean, + callback: (err: any, result: boolean) => void, + ): Q.IPromise { callback(null, thing); return Q.resolve(); } - testI32(thing: number, callback: (err: any, result: number) => void): Q.IPromise { + testI32( + thing: number, + callback: (err: any, result: number) => void, + ): Q.IPromise { callback(null, thing); return Q.resolve(); } - testI64(thing: number, callback: (err: any, result: number) => void): Q.IPromise { + testI64( + thing: number, + callback: (err: any, result: number) => void, + ): Q.IPromise { callback(null, thing); return Q.resolve(); } - testDouble(thing: number, callback: (err: any, result: number) => void): Q.IPromise { + testDouble( + thing: number, + callback: (err: any, result: number) => void, + ): Q.IPromise { callback(null, thing); return Q.resolve(); } - testBinary(thing: Buffer, callback: (err: any, result: Buffer) => void): Q.IPromise { + testBinary( + thing: Buffer, + callback: (err: any, result: Buffer) => void, + ): Q.IPromise { callback(null, thing); return Q.resolve(); } - testStruct(thing: ttypes.Xtruct, callback: (err: any, result: ttypes.Xtruct) => void): Q.IPromise { + testStruct( + thing: ttypes.Xtruct, + callback: (err: any, result: ttypes.Xtruct) => void, + ): Q.IPromise { callback(null, thing); return Q.resolve(); } - testNest(thing: ttypes.Xtruct2, callback: (err: any, result: ttypes.Xtruct2) => void): Q.IPromise { + testNest( + thing: ttypes.Xtruct2, + callback: (err: any, result: ttypes.Xtruct2) => void, + ): Q.IPromise { callback(null, thing); return Q.resolve(); } - testMap(thing: { [k: number]: number; }, callback: (err: any, result: { [k: number]: number; }) => void): Q.IPromise<{ [k: number]: number; }> { + testMap( + thing: { [k: number]: number }, + callback: (err: any, result: { [k: number]: number }) => void, + ): Q.IPromise<{ [k: number]: number }> { callback(null, thing); return Q.resolve(); } - testStringMap(thing: { [k: string]: string; }, callback: (err: any, result: { [k: string]: string; }) => void): Q.IPromise<{ [k: string]: string; }> { + testStringMap( + thing: { [k: string]: string }, + callback: (err: any, result: { [k: string]: string }) => void, + ): Q.IPromise<{ [k: string]: string }> { callback(null, thing); return Q.resolve(); } - testSet(thing: number[], callback: (err: any, result: number[]) => void): Q.IPromise { + testSet( + thing: number[], + callback: (err: any, result: number[]) => void, + ): Q.IPromise { callback(null, thing); return Q.resolve(); } - testList(thing: number[], callback: (err: any, result: number[]) => void): Q.IPromise { + testList( + thing: number[], + callback: (err: any, result: number[]) => void, + ): Q.IPromise { callback(null, thing); return Q.resolve(); } - testEnum(thing: ttypes.Numberz, callback: (err: any, result: ttypes.Numberz) => void): Q.IPromise { + testEnum( + thing: ttypes.Numberz, + callback: (err: any, result: ttypes.Numberz) => void, + ): Q.IPromise { callback(null, thing); return Q.resolve(); } - testTypedef(thing: number, callback: (err: any, result: number) => void): Q.IPromise { + testTypedef( + thing: number, + callback: (err: any, result: number) => void, + ): Q.IPromise { callback(null, thing); return Q.resolve(); } diff --git a/lib/ts/Gruntfile.js b/lib/ts/Gruntfile.js index 61ab582741d..3e4b1c49227 100644 --- a/lib/ts/Gruntfile.js +++ b/lib/ts/Gruntfile.js @@ -5,55 +5,57 @@ // Grunt Setup - npm install //reads the ./package.json and installs project dependencies // Run grunt - npx grunt // uses project-local installed version of grunt (from package.json) -module.exports = function(grunt) { - 'use strict'; +module.exports = function (grunt) { + "use strict"; grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), + pkg: grunt.file.readJSON("package.json"), concat: { options: { - separator: ';' + separator: ";", }, dist: { - src: ['src/**/*.js'], - dest: 'dist/<%= pkg.name %>.js' - } + src: ["src/**/*.js"], + dest: "dist/<%= pkg.name %>.js", + }, }, shell: { InstallThriftJS: { - command: 'mkdir -p test/build/ts/lib; cp ../js/src/thrift.js test/build/ts/thrift.js' + command: + "mkdir -p test/build/ts/lib; cp ../js/src/thrift.js test/build/ts/thrift.js", }, InstallThriftNodeJSDep: { - command: 'cd ../..; npm install' + command: "cd ../..; npm install", }, InstallTestLibs: { - command: 'cd test; ant download_jslibs' + command: "cd test; ant download_jslibs", }, ThriftGen: { command: [ - 'mkdir -p test/gen-js', - '../../compiler/cpp/thrift -gen js:ts --out test/gen-js ../../test/v0.16/ThriftTest.thrift', - 'mkdir -p test/gen-nodejs', - '../../compiler/cpp/thrift -gen js:node,ts --out test/gen-nodejs ../../test/v0.16/ThriftTest.thrift', - ].join(' && ') + "mkdir -p test/gen-js", + "../../compiler/cpp/thrift -gen js:ts --out test/gen-js ../../test/v0.16/ThriftTest.thrift", + "mkdir -p test/gen-nodejs", + "../../compiler/cpp/thrift -gen js:node,ts --out test/gen-nodejs ../../test/v0.16/ThriftTest.thrift", + ].join(" && "), }, ThriftBrowserifyNodeInt64: { command: [ - './node_modules/browserify/bin/cmd.js ./node_modules/node-int64/Int64.js -s Int64 -o test/build/js/lib/Int64.js', - './node_modules/browserify/bin/cmd.js ../nodejs/lib/thrift/int64_util.js -s Int64Util -o test/build/js/lib/Int64Util.js', - './node_modules/browserify/bin/cmd.js ./node_modules/json-int64/index.js -s JSONInt64 -o test/build/js/lib/JSONInt64.js' - ].join(' && ') + "./node_modules/browserify/bin/cmd.js ./node_modules/node-int64/Int64.js -s Int64 -o test/build/js/lib/Int64.js", + "./node_modules/browserify/bin/cmd.js ../nodejs/lib/thrift/int64_util.js -s Int64Util -o test/build/js/lib/Int64Util.js", + "./node_modules/browserify/bin/cmd.js ./node_modules/json-int64/index.js -s JSONInt64 -o test/build/js/lib/JSONInt64.js", + ].join(" && "), }, ThriftGenInt64: { - command: '../../compiler/cpp/thrift -gen js:ts -o test ../../test/Int64Test.thrift' + command: + "../../compiler/cpp/thrift -gen js:ts -o test ../../test/Int64Test.thrift", }, ThriftTestServer: { options: { async: true, execOptions: { cwd: "./test", - env: {NODE_PATH: "../../nodejs/lib:../../../node_modules"} - } + env: { NODE_PATH: "../../nodejs/lib:../../../node_modules" }, + }, }, command: "node server_http.js", }, @@ -61,103 +63,104 @@ module.exports = function(grunt) { options: { execOptions: { cwd: "./test", - } + }, }, - command : "../node_modules/typescript/bin/tsc --listFiles --outDir build/ts" + command: + "../node_modules/typescript/bin/tsc --listFiles --outDir build/ts", }, BrowserifyCompiledTS: { command: [ "./node_modules/browserify/bin/cmd.js test/build/ts/test.js -o test/build/ts/lib/test.js --standalone test", "./node_modules/browserify/bin/cmd.js test/build/ts/test-int64.js -o test/build/ts/lib/test-int64.js --standalone testInt64", - ].join(" && ") + ].join(" && "), }, InstallGeneratedCode: { command: [ "mkdir -p test/build/ts", - "cp -r test/gen-js test/build/ts" - ].join(" && ") + "cp -r test/gen-js test/build/ts", + ].join(" && "), }, }, qunit: { ThriftJS: { options: { - urls: [ - 'http://localhost:8089/test.html' - ], + urls: ["http://localhost:8089/test.html"], puppeteer: { headless: true, - args: ['--no-sandbox'], + args: ["--no-sandbox"], }, - } + }, }, ThriftJS_Int64: { options: { - urls: [ - 'http://localhost:8089/test-int64.html' - ], + urls: ["http://localhost:8089/test-int64.html"], puppeteer: { headless: true, - args: ['--no-sandbox'], + args: ["--no-sandbox"], ignoreHTTPSErrors: true, }, - } + }, }, }, jshint: { // The main Thrift library file. not es6 yet :( lib: { - src: ['../js/src/**/*.js'], + src: ["../js/src/**/*.js"], }, // The test files use es6 test: { - src: ['Gruntfile.js', 'test/*.js'], + src: ["Gruntfile.js", "test/*.js"], options: { esversion: 6, - } + }, }, gen_js_code: { - src: ['test/gen-js/*.js'], + src: ["test/gen-js/*.js"], }, gen_node_code: { - src: ['test/gen-nodejs/*.js'], + src: ["test/gen-nodejs/*.js"], options: { node: true, - } + }, }, }, }); - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-qunit'); - grunt.loadNpmTasks('grunt-shell-spawn'); + grunt.loadNpmTasks("grunt-contrib-jshint"); + grunt.loadNpmTasks("grunt-contrib-qunit"); + grunt.loadNpmTasks("grunt-shell-spawn"); - grunt.registerTask('wait', 'Wait just one second for the server to start', function () { - var done = this.async(); - setTimeout(function() { - done(true); - }, 1000); - }); + grunt.registerTask( + "wait", + "Wait just one second for the server to start", + function () { + var done = this.async(); + setTimeout(function () { + done(true); + }, 1000); + }, + ); - grunt.registerTask('installAndGenerate', [ - 'shell:InstallThriftJS', - 'shell:InstallThriftNodeJSDep', - 'shell:ThriftGen', - 'shell:ThriftBrowserifyNodeInt64', - 'shell:ThriftGenInt64', - 'shell:InstallTestLibs', - 'shell:BuildTS', - 'shell:InstallGeneratedCode', - 'shell:BrowserifyCompiledTS', + grunt.registerTask("installAndGenerate", [ + "shell:InstallThriftJS", + "shell:InstallThriftNodeJSDep", + "shell:ThriftGen", + "shell:ThriftBrowserifyNodeInt64", + "shell:ThriftGenInt64", + "shell:InstallTestLibs", + "shell:BuildTS", + "shell:InstallGeneratedCode", + "shell:BrowserifyCompiledTS", ]); - grunt.registerTask('test', [ - 'installAndGenerate', - 'jshint', - 'shell:ThriftTestServer', - 'wait', - 'qunit:ThriftJS', - 'qunit:ThriftJS_Int64', - 'shell:ThriftTestServer:kill', + grunt.registerTask("test", [ + "installAndGenerate", + "jshint", + "shell:ThriftTestServer", + "wait", + "qunit:ThriftJS", + "qunit:ThriftJS_Int64", + "shell:ThriftTestServer:kill", ]); - grunt.registerTask('default', ['test']); + grunt.registerTask("default", ["test"]); }; diff --git a/lib/ts/test/phantom-client.ts b/lib/ts/test/phantom-client.ts index 55189372536..90a532d6ff8 100644 --- a/lib/ts/test/phantom-client.ts +++ b/lib/ts/test/phantom-client.ts @@ -16,337 +16,360 @@ * specific language governing permissions and limitations * under the License. */ - /* jshint -W100 */ +/* jshint -W100 */ import { ThriftTest } from "./gen-js/ThriftTest_types"; import "./gen-js/ThriftTest"; var Int64 = require("node-int64"); var phantom = require("phantom"); -const int64_2_pow_60: typeof Int64 = new Int64('1000000000000000'); -const int64_minus_2_pow_60: typeof Int64 = new Int64('f000000000000000'); - - (function() { - 'use strict'; - - // Rudimentary test helper functions - // TODO: Return error code based on kind of errors rather than throw - var ok = function(t, msg) { - if (!t) { - console.log('*** FAILED ***'); - throw new Error(msg); - } - }; - var equal = function(a, b) { - if (a !== b) { - console.log('*** FAILED ***'); - throw new Error(); - } - }; - var test = function(name, f) { - console.log('TEST : ' + name); - f(); - console.log('OK\n'); +const int64_2_pow_60: typeof Int64 = new Int64("1000000000000000"); +const int64_minus_2_pow_60: typeof Int64 = new Int64("f000000000000000"); + +(function () { + "use strict"; + + // Rudimentary test helper functions + // TODO: Return error code based on kind of errors rather than throw + var ok = function (t, msg) { + if (!t) { + console.log("*** FAILED ***"); + throw new Error(msg); + } + }; + var equal = function (a, b) { + if (a !== b) { + console.log("*** FAILED ***"); + throw new Error(); + } + }; + var test = function (name, f) { + console.log("TEST : " + name); + f(); + console.log("OK\n"); + }; + + var parseArgs = function (args) { + var skips = ["--transport=http", "--protocol=json"]; + var opts = { + port: "9090", + // protocol: 'json', }; - - var parseArgs = function(args) { - var skips = [ - '--transport=http', - '--protocol=json' - ]; - var opts = { - port: '9090' - // protocol: 'json', - }; - var keys = {}; - for (var key in opts) { - keys['--' + key + '='] = key; + var keys = {}; + for (var key in opts) { + keys["--" + key + "="] = key; + } + for (var i in args) { + var arg = args[i]; + if (skips.indexOf(arg) != -1) { + continue; } - for (var i in args) { - var arg = args[i]; - if (skips.indexOf(arg) != -1) { - continue; - } - var hit = false; - for (var k in keys) { - if (arg.slice(0, k.length) === k) { - opts[keys[k]] = arg.slice(k.length); - hit = true; - break; - } - } - if (!hit) { - throw new Error('Unknown argument: ' + arg); + var hit = false; + for (var k in keys) { + if (arg.slice(0, k.length) === k) { + opts[keys[k]] = arg.slice(k.length); + hit = true; + break; } } - var portAsInt: number = parseInt(opts.port, 10); - if (!opts.port || portAsInt < 1 || portAsInt > 65535) { - throw new Error('Invalid port number'); + if (!hit) { + throw new Error("Unknown argument: " + arg); } - return opts; - }; - - var execute = function() { - console.log('### Apache Thrift Javascript standalone test client'); - console.log('------------------------------------------------------------'); - - phantom.page.injectJs('thrift.js'); - phantom.page.injectJs('gen-js/ThriftTest_types.js'); - phantom.page.injectJs('gen-js/ThriftTest.js'); - - var system = require('system'); - var opts = parseArgs(system.args.slice(1)); - var port = opts.port; - var transport = new Thrift.Transport('http://localhost:' + port + '/service'); - var protocol = new Thrift.Protocol(transport); - var client = new ThriftTest.ThriftTestClient(protocol); - - - // TODO: Remove duplicate code with test.js. - // all Languages in UTF-8 - var stringTest = "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語"; - - function checkRecursively(map1, map2) { - if (typeof map1 !== 'function' && typeof map2 !== 'function') { - if (!map1 || typeof map1 !== 'object') { - equal(map1, map2); - } else { - for (var key in map1) { - checkRecursively(map1[key], map2[key]); - } + } + var portAsInt: number = parseInt(opts.port, 10); + if (!opts.port || portAsInt < 1 || portAsInt > 65535) { + throw new Error("Invalid port number"); + } + return opts; + }; + + var execute = function () { + console.log("### Apache Thrift Javascript standalone test client"); + console.log("------------------------------------------------------------"); + + phantom.page.injectJs("thrift.js"); + phantom.page.injectJs("gen-js/ThriftTest_types.js"); + phantom.page.injectJs("gen-js/ThriftTest.js"); + + var system = require("system"); + var opts = parseArgs(system.args.slice(1)); + var port = opts.port; + var transport = new Thrift.Transport( + "http://localhost:" + port + "/service", + ); + var protocol = new Thrift.Protocol(transport); + var client = new ThriftTest.ThriftTestClient(protocol); + + // TODO: Remove duplicate code with test.js. + // all Languages in UTF-8 + var stringTest = + "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語"; + + function checkRecursively(map1, map2) { + if (typeof map1 !== "function" && typeof map2 !== "function") { + if (!map1 || typeof map1 !== "object") { + equal(map1, map2); + } else { + for (var key in map1) { + checkRecursively(map1[key], map2[key]); } } } - - test('Void', function() { - equal(client.testVoid(), undefined); - }); - test('Binary (String)', function() { - var binary: string = ''; - for (var v = 255; v >= 0; --v) { - binary += String.fromCharCode(v); - } - equal(client.testBinary(binary), binary); - }); - test('Binary (Uint8Array)', function() { - var binary: string = ''; - for (var v = 255; v >= 0; --v) { - binary += String.fromCharCode(v); - } - var arr = new Uint8Array(binary.length); - for (var i = 0; i < binary.length; ++i) { - arr[i] = binary[i].charCodeAt(0); - } - const hexEncodedString = Array.from(arr, function(byte) { - return String.fromCharCode(byte); - }).join('') - equal(client.testBinary(hexEncodedString), binary); - }); - test('String', function() { - equal(client.testString(''), ''); - equal(client.testString(stringTest), stringTest); - - var specialCharacters = 'quote: \" backslash:' + - ' forwardslash-escaped: \/ ' + - ' backspace: \b formfeed: \f newline: \n return: \r tab: ' + - ' now-all-of-them-together: "\\\/\b\n\r\t' + - ' now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><'; - equal(client.testString(specialCharacters), specialCharacters); - }); - test('Double', function() { - equal(client.testDouble(0), 0); - equal(client.testDouble(-1), -1); - equal(client.testDouble(3.14), 3.14); - equal(client.testDouble(Math.pow(2, 60)), Math.pow(2, 60)); - }); - test('Bool', function() { - equal(client.testBool(true), true); - equal(client.testBool(false), false); - }); - test('I8', function() { - equal(client.testByte(0), 0); - equal(client.testByte(0x01), 0x01); - }); - test('I32', function() { - equal(client.testI32(0), 0); - equal(client.testI32(Math.pow(2, 30)), Math.pow(2, 30)); - equal(client.testI32(-Math.pow(2, 30)), -Math.pow(2, 30)); - }); - test('I64', function() { - equal(client.testI64(new Int64(0)), 0); - equal(client.testI64(int64_2_pow_60), Math.pow(2, 52)); - equal(client.testI64(int64_minus_2_pow_60), -Math.pow(2, 52)); - }); - - test('Struct', function() { - var structTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct(); - structTestInput.string_thing = 'worked'; - structTestInput.byte_thing = 0x01; - structTestInput.i32_thing = Math.pow(2, 30); - structTestInput.i64_thing = int64_2_pow_60; - - var structTestOutput: ThriftTest.Xtruct = client.testStruct(structTestInput); - - equal(structTestOutput.string_thing, structTestInput.string_thing); - equal(structTestOutput.byte_thing, structTestInput.byte_thing); - equal(structTestOutput.i32_thing, structTestInput.i32_thing); - equal(structTestOutput.i64_thing, structTestInput.i64_thing); - - equal(JSON.stringify(structTestOutput), JSON.stringify(structTestInput)); - }); - - test('Nest', function() { - var xtrTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct(); - xtrTestInput.string_thing = 'worked'; - xtrTestInput.byte_thing = 0x01; - xtrTestInput.i32_thing = Math.pow(2, 30); - xtrTestInput.i64_thing = int64_2_pow_60; - - var nestTestInput: ThriftTest.Xtruct2 = new ThriftTest.Xtruct2(); - nestTestInput.byte_thing = 0x02; - nestTestInput.struct_thing = xtrTestInput; - nestTestInput.i32_thing = Math.pow(2, 15); - - var nestTestOutput = client.testNest(nestTestInput); - - equal(nestTestOutput.byte_thing, nestTestInput.byte_thing); - equal(nestTestOutput.struct_thing.string_thing, nestTestInput.struct_thing.string_thing); - equal(nestTestOutput.struct_thing.byte_thing, nestTestInput.struct_thing.byte_thing); - equal(nestTestOutput.struct_thing.i32_thing, nestTestInput.struct_thing.i32_thing); - equal(nestTestOutput.struct_thing.i64_thing, nestTestInput.struct_thing.i64_thing); - equal(nestTestOutput.i32_thing, nestTestInput.i32_thing); - - equal(JSON.stringify(nestTestOutput), JSON.stringify(nestTestInput)); - }); - - test('Map', function() { - var mapTestInput: {[k: number]: number;} = {7: 77, 8: 88, 9: 99}; - - var mapTestOutput: {[k: number]: number;} = client.testMap(mapTestInput); - - for (var key in mapTestOutput) { - equal(mapTestOutput[key], mapTestInput[key]); - } - }); - - test('StringMap', function() { - var mapTestInput: {[k: string]: string;} = { - 'a': '123', 'a b': 'with spaces ', 'same': 'same', '0': 'numeric key', - 'longValue': stringTest, stringTest: 'long key' - }; - - var mapTestOutput: {[k: string]: string;} = client.testStringMap(mapTestInput); - - for (var key in mapTestOutput) { - equal(mapTestOutput[key], mapTestInput[key]); - } - }); - - test('Set', function() { - var setTestInput: number[] = [1, 2, 3]; - ok(client.testSet(setTestInput), setTestInput); - }); - - test('List', function() { - var listTestInput: number[] = [1, 2, 3]; - ok(client.testList(listTestInput), listTestInput); - }); - - test('Enum', function() { - equal(client.testEnum(ThriftTest.Numberz.ONE), ThriftTest.Numberz.ONE); - }); - - test('TypeDef', function() { - equal(client.testTypedef(new Int64(69)), 69); - }); - - test('MapMap', function() { - var mapMapTestExpectedResult: {[K: number]: {[k: number]: number}} = { - '4': {'1': 1, '2': 2, '3': 3, '4': 4}, - '-4': {'-4': -4, '-3': -3, '-2': -2, '-1': -1} - }; - - var mapMapTestOutput = client.testMapMap(1); - - - for (var key in mapMapTestOutput) { - for (var key2 in mapMapTestOutput[key]) { - equal(mapMapTestOutput[key][key2], mapMapTestExpectedResult[key][key2]); - } - } - - checkRecursively(mapMapTestOutput, mapMapTestExpectedResult); - }); - - test('Xception', function() { - try { - client.testException('Xception'); - ok(false, "expected an exception but there was no exception"); - } catch (e) { - equal(e.errorCode, 1001); - equal(e.message, 'Xception'); - } - }); - - test('no Exception', function() { - try { - client.testException('no Exception'); - } catch (e) { - ok(false, "expected no exception but here was an exception"); - } - }); - - test('TException', function() { - try { - client.testException('TException'); - ok(false, "expected an exception but there was no exception"); - } catch (e) { - ok(ok, "succesfully got exception"); + } + + test("Void", function () { + equal(client.testVoid(), undefined); + }); + test("Binary (String)", function () { + var binary: string = ""; + for (var v = 255; v >= 0; --v) { + binary += String.fromCharCode(v); + } + equal(client.testBinary(binary), binary); + }); + test("Binary (Uint8Array)", function () { + var binary: string = ""; + for (var v = 255; v >= 0; --v) { + binary += String.fromCharCode(v); + } + var arr = new Uint8Array(binary.length); + for (var i = 0; i < binary.length; ++i) { + arr[i] = binary[i].charCodeAt(0); + } + const hexEncodedString = Array.from(arr, function (byte) { + return String.fromCharCode(byte); + }).join(""); + equal(client.testBinary(hexEncodedString), binary); + }); + test("String", function () { + equal(client.testString(""), ""); + equal(client.testString(stringTest), stringTest); + + var specialCharacters = + 'quote: \" backslash:' + + " forwardslash-escaped: \/ " + + " backspace: \b formfeed: \f newline: \n return: \r tab: " + + ' now-all-of-them-together: "\\\/\b\n\r\t' + + " now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><"; + equal(client.testString(specialCharacters), specialCharacters); + }); + test("Double", function () { + equal(client.testDouble(0), 0); + equal(client.testDouble(-1), -1); + equal(client.testDouble(3.14), 3.14); + equal(client.testDouble(Math.pow(2, 60)), Math.pow(2, 60)); + }); + test("Bool", function () { + equal(client.testBool(true), true); + equal(client.testBool(false), false); + }); + test("I8", function () { + equal(client.testByte(0), 0); + equal(client.testByte(0x01), 0x01); + }); + test("I32", function () { + equal(client.testI32(0), 0); + equal(client.testI32(Math.pow(2, 30)), Math.pow(2, 30)); + equal(client.testI32(-Math.pow(2, 30)), -Math.pow(2, 30)); + }); + test("I64", function () { + equal(client.testI64(new Int64(0)), 0); + equal(client.testI64(int64_2_pow_60), Math.pow(2, 52)); + equal(client.testI64(int64_minus_2_pow_60), -Math.pow(2, 52)); + }); + + test("Struct", function () { + var structTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct(); + structTestInput.string_thing = "worked"; + structTestInput.byte_thing = 0x01; + structTestInput.i32_thing = Math.pow(2, 30); + structTestInput.i64_thing = int64_2_pow_60; + + var structTestOutput: ThriftTest.Xtruct = + client.testStruct(structTestInput); + + equal(structTestOutput.string_thing, structTestInput.string_thing); + equal(structTestOutput.byte_thing, structTestInput.byte_thing); + equal(structTestOutput.i32_thing, structTestInput.i32_thing); + equal(structTestOutput.i64_thing, structTestInput.i64_thing); + + equal(JSON.stringify(structTestOutput), JSON.stringify(structTestInput)); + }); + + test("Nest", function () { + var xtrTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct(); + xtrTestInput.string_thing = "worked"; + xtrTestInput.byte_thing = 0x01; + xtrTestInput.i32_thing = Math.pow(2, 30); + xtrTestInput.i64_thing = int64_2_pow_60; + + var nestTestInput: ThriftTest.Xtruct2 = new ThriftTest.Xtruct2(); + nestTestInput.byte_thing = 0x02; + nestTestInput.struct_thing = xtrTestInput; + nestTestInput.i32_thing = Math.pow(2, 15); + + var nestTestOutput = client.testNest(nestTestInput); + + equal(nestTestOutput.byte_thing, nestTestInput.byte_thing); + equal( + nestTestOutput.struct_thing.string_thing, + nestTestInput.struct_thing.string_thing, + ); + equal( + nestTestOutput.struct_thing.byte_thing, + nestTestInput.struct_thing.byte_thing, + ); + equal( + nestTestOutput.struct_thing.i32_thing, + nestTestInput.struct_thing.i32_thing, + ); + equal( + nestTestOutput.struct_thing.i64_thing, + nestTestInput.struct_thing.i64_thing, + ); + equal(nestTestOutput.i32_thing, nestTestInput.i32_thing); + + equal(JSON.stringify(nestTestOutput), JSON.stringify(nestTestInput)); + }); + + test("Map", function () { + var mapTestInput: { [k: number]: number } = { 7: 77, 8: 88, 9: 99 }; + + var mapTestOutput: { [k: number]: number } = client.testMap(mapTestInput); + + for (var key in mapTestOutput) { + equal(mapTestOutput[key], mapTestInput[key]); + } + }); + + test("StringMap", function () { + var mapTestInput: { [k: string]: string } = { + a: "123", + "a b": "with spaces ", + same: "same", + "0": "numeric key", + longValue: stringTest, + stringTest: "long key", + }; + + var mapTestOutput: { [k: string]: string } = + client.testStringMap(mapTestInput); + + for (var key in mapTestOutput) { + equal(mapTestOutput[key], mapTestInput[key]); + } + }); + + test("Set", function () { + var setTestInput: number[] = [1, 2, 3]; + ok(client.testSet(setTestInput), setTestInput); + }); + + test("List", function () { + var listTestInput: number[] = [1, 2, 3]; + ok(client.testList(listTestInput), listTestInput); + }); + + test("Enum", function () { + equal(client.testEnum(ThriftTest.Numberz.ONE), ThriftTest.Numberz.ONE); + }); + + test("TypeDef", function () { + equal(client.testTypedef(new Int64(69)), 69); + }); + + test("MapMap", function () { + var mapMapTestExpectedResult: { [K: number]: { [k: number]: number } } = { + "4": { "1": 1, "2": 2, "3": 3, "4": 4 }, + "-4": { "-4": -4, "-3": -3, "-2": -2, "-1": -1 }, + }; + + var mapMapTestOutput = client.testMapMap(1); + + for (var key in mapMapTestOutput) { + for (var key2 in mapMapTestOutput[key]) { + equal( + mapMapTestOutput[key][key2], + mapMapTestExpectedResult[key][key2], + ); } - }); - - const crazy: ThriftTest.Insanity = { - 'userMap': { '5': new Int64(5), '8': new Int64(8) }, - 'xtructs': [{ - 'string_thing': 'Goodbye4', - 'byte_thing': 4, - 'i32_thing': 4, - 'i64_thing': new Int64(4) + } + + checkRecursively(mapMapTestOutput, mapMapTestExpectedResult); + }); + + test("Xception", function () { + try { + client.testException("Xception"); + ok(false, "expected an exception but there was no exception"); + } catch (e) { + equal(e.errorCode, 1001); + equal(e.message, "Xception"); + } + }); + + test("no Exception", function () { + try { + client.testException("no Exception"); + } catch (e) { + ok(false, "expected no exception but here was an exception"); + } + }); + + test("TException", function () { + try { + client.testException("TException"); + ok(false, "expected an exception but there was no exception"); + } catch (e) { + ok(ok, "succesfully got exception"); + } + }); + + const crazy: ThriftTest.Insanity = { + userMap: { "5": new Int64(5), "8": new Int64(8) }, + xtructs: [ + { + string_thing: "Goodbye4", + byte_thing: 4, + i32_thing: 4, + i64_thing: new Int64(4), }, { - 'string_thing': 'Hello2', - 'byte_thing': 2, - 'i32_thing': 2, - 'i64_thing': new Int64(2) - }] - }; - test('Insanity', function() { - const insanity: {[k: number]: (ThriftTest.Insanity | {[k:number]: ThriftTest.Insanity})} = { - '1': { - '2': crazy, - '3': crazy - }, - '2': { '6': new ThriftTest.Insanity() } - }; - var res = client.testInsanity(new ThriftTest.Insanity(crazy)); - ok(res, JSON.stringify(res)); - ok(insanity, JSON.stringify(insanity)); - - checkRecursively(res, insanity); - }); - - console.log('------------------------------------------------------------'); - console.log('### All tests succeeded.'); - return 0; + string_thing: "Hello2", + byte_thing: 2, + i32_thing: 2, + i64_thing: new Int64(2), + }, + ], }; - - try { - var ret = execute(); - phantom.exit(ret); - } catch (err) { - // Catch all and exit to avoid hang. - console.error(err); - phantom.exit(1); - } - })(); - \ No newline at end of file + test("Insanity", function () { + const insanity: { + [k: number]: ThriftTest.Insanity | { [k: number]: ThriftTest.Insanity }; + } = { + "1": { + "2": crazy, + "3": crazy, + }, + "2": { "6": new ThriftTest.Insanity() }, + }; + var res = client.testInsanity(new ThriftTest.Insanity(crazy)); + ok(res, JSON.stringify(res)); + ok(insanity, JSON.stringify(insanity)); + + checkRecursively(res, insanity); + }); + + console.log("------------------------------------------------------------"); + console.log("### All tests succeeded."); + return 0; + }; + + try { + var ret = execute(); + phantom.exit(ret); + } catch (err) { + // Catch all and exit to avoid hang. + console.error(err); + phantom.exit(1); + } +})(); diff --git a/lib/ts/test/server_http.js b/lib/ts/test/server_http.js index 8380c3a7732..662a0a7b313 100644 --- a/lib/ts/test/server_http.js +++ b/lib/ts/test/server_http.js @@ -28,28 +28,30 @@ // for the es6 environment or for pre-es6 environment. // -const thrift = require('../../nodejs/lib/thrift'); -const es6Mode = process.argv.includes('--es6'); -const genFolder = es6Mode ? 'gen-nodejs-es6' : 'gen-nodejs'; +const thrift = require("../../nodejs/lib/thrift"); +const es6Mode = process.argv.includes("--es6"); +const genFolder = es6Mode ? "gen-nodejs-es6" : "gen-nodejs"; const ThriftTestSvc = require(`./${genFolder}/ThriftTest.js`); -const ThriftTestHandler = require('./test_handler').ThriftTestHandler; +const ThriftTestHandler = require("./test_handler").ThriftTestHandler; const ThriftTestSvcOpt = { - transport: thrift.TBufferedTransport, - protocol: thrift.TJSONProtocol, - processor: ThriftTestSvc, - handler: ThriftTestHandler + transport: thrift.TBufferedTransport, + protocol: thrift.TJSONProtocol, + processor: ThriftTestSvc, + handler: ThriftTestHandler, }; const ThriftWebServerOptions = { - files: __dirname, - services: { - '/service': ThriftTestSvcOpt - } + files: __dirname, + services: { + "/service": ThriftTestSvcOpt, + }, }; const server = thrift.createWebServer(ThriftWebServerOptions); const port = es6Mode ? 8088 : 8089; server.listen(port); console.log(`Serving files from: ${__dirname}`); -console.log(`Http/Thrift Server (ES6 mode ${es6Mode}) running on port: ${port}`); +console.log( + `Http/Thrift Server (ES6 mode ${es6Mode}) running on port: ${port}`, +); diff --git a/lib/ts/test/test-int64.ts b/lib/ts/test/test-int64.ts index 254d8d7bfcc..10e5946fc96 100644 --- a/lib/ts/test/test-int64.ts +++ b/lib/ts/test/test-int64.ts @@ -16,86 +16,90 @@ * specific language governing permissions and limitations * under the License. */ - /* jshint -W100 */ +/* jshint -W100 */ var Int64 = require("node-int64"); var JSONInt64 = require("json-int64"); import { Int64Test } from "./gen-js/Int64Test_types"; - // Work around for old API used by QUnitAdapter of jsTestDriver -if (typeof QUnit.log == 'function') { +if (typeof QUnit.log == "function") { // When using real QUnit (fron PhantomJS) log failures to console - QUnit.log(function(details) { + QUnit.log(function (details) { if (!details.result) { - console.log('======== FAIL ========'); - console.log('TestName: ' + details.name); + console.log("======== FAIL ========"); + console.log("TestName: " + details.name); if (details.message) console.log(details.message); - console.log('Expected: ' + details.expected); - console.log('Actual : ' + details.actual); - console.log('======================'); + console.log("Expected: " + details.expected); + console.log("Actual : " + details.actual); + console.log("======================"); } }); } -QUnit.module('Int64'); - - QUnit.test('Int64', function(assert) { - console.log('Int64 test -- starts'); - const EXPECTED_SMALL_INT64_AS_NUMBER: number = 42; - const EXPECTED_SMALL_INT64: typeof Int64 = new Int64(42); - const EXPECTED_MAX_JS_SAFE_INT64: typeof Int64 = new Int64(Number.MAX_SAFE_INTEGER); - const EXPECTED_MIN_JS_SAFE_INT64: typeof Int64 = new Int64(Number.MIN_SAFE_INTEGER); - const EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64: typeof Int64 = new Int64("0020000000000000"); // hex-encoded - const EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64: typeof Int64 = new Int64("ffe0000000000000"); // hex-encoded 2's complement - const EXPECTED_MAX_SIGNED_INT64: typeof Int64 = new Int64("7fffffffffffffff"); // hex-encoded - const EXPECTED_MIN_SIGNED_INT64: typeof Int64 = new Int64("8000000000000000"); // hex-encoded 2's complement - const EXPECTED_INT64_LIST = [ - EXPECTED_SMALL_INT64, - EXPECTED_MAX_JS_SAFE_INT64, - EXPECTED_MIN_JS_SAFE_INT64, - EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64, - EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64, - EXPECTED_MAX_SIGNED_INT64, - EXPECTED_MIN_SIGNED_INT64 - ]; - assert.ok(EXPECTED_SMALL_INT64.equals(Int64Test.SMALL_INT64)); - assert.ok(EXPECTED_MAX_JS_SAFE_INT64.equals(Int64Test.MAX_JS_SAFE_INT64)); - assert.ok(EXPECTED_MIN_JS_SAFE_INT64.equals(Int64Test.MIN_JS_SAFE_INT64)); - assert.ok( - EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64.equals( - Int64Test.MAX_JS_SAFE_PLUS_ONE_INT64 - ) - ); - assert.ok( - EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64.equals( - Int64Test.MIN_JS_SAFE_MINUS_ONE_INT64 - ) - ); - assert.ok(EXPECTED_MAX_SIGNED_INT64.equals(Int64Test.MAX_SIGNED_INT64)); - assert.ok(EXPECTED_MIN_SIGNED_INT64.equals(Int64Test.MIN_SIGNED_INT64)); - assert.equal( - EXPECTED_SMALL_INT64_AS_NUMBER, - Int64Test.SMALL_INT64.toNumber() - ); - assert.equal( - Number.MAX_SAFE_INTEGER, - Int64Test.MAX_JS_SAFE_INT64.toNumber() - ); - assert.equal( - Number.MIN_SAFE_INTEGER, - Int64Test.MIN_JS_SAFE_INT64.toNumber() - ); +QUnit.module("Int64"); - for (let i = 0; i < EXPECTED_INT64_LIST.length; ++i) { - assert.ok(EXPECTED_INT64_LIST[i].equals(Int64Test.INT64_LIST[i])); - } +QUnit.test("Int64", function (assert) { + console.log("Int64 test -- starts"); + const EXPECTED_SMALL_INT64_AS_NUMBER: number = 42; + const EXPECTED_SMALL_INT64: typeof Int64 = new Int64(42); + const EXPECTED_MAX_JS_SAFE_INT64: typeof Int64 = new Int64( + Number.MAX_SAFE_INTEGER, + ); + const EXPECTED_MIN_JS_SAFE_INT64: typeof Int64 = new Int64( + Number.MIN_SAFE_INTEGER, + ); + const EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64: typeof Int64 = new Int64( + "0020000000000000", + ); // hex-encoded + const EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64: typeof Int64 = new Int64( + "ffe0000000000000", + ); // hex-encoded 2's complement + const EXPECTED_MAX_SIGNED_INT64: typeof Int64 = new Int64("7fffffffffffffff"); // hex-encoded + const EXPECTED_MIN_SIGNED_INT64: typeof Int64 = new Int64("8000000000000000"); // hex-encoded 2's complement + const EXPECTED_INT64_LIST = [ + EXPECTED_SMALL_INT64, + EXPECTED_MAX_JS_SAFE_INT64, + EXPECTED_MIN_JS_SAFE_INT64, + EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64, + EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64, + EXPECTED_MAX_SIGNED_INT64, + EXPECTED_MIN_SIGNED_INT64, + ]; + assert.ok(EXPECTED_SMALL_INT64.equals(Int64Test.SMALL_INT64)); + assert.ok(EXPECTED_MAX_JS_SAFE_INT64.equals(Int64Test.MAX_JS_SAFE_INT64)); + assert.ok(EXPECTED_MIN_JS_SAFE_INT64.equals(Int64Test.MIN_JS_SAFE_INT64)); + assert.ok( + EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64.equals( + Int64Test.MAX_JS_SAFE_PLUS_ONE_INT64, + ), + ); + assert.ok( + EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64.equals( + Int64Test.MIN_JS_SAFE_MINUS_ONE_INT64, + ), + ); + assert.ok(EXPECTED_MAX_SIGNED_INT64.equals(Int64Test.MAX_SIGNED_INT64)); + assert.ok(EXPECTED_MIN_SIGNED_INT64.equals(Int64Test.MIN_SIGNED_INT64)); + assert.equal( + EXPECTED_SMALL_INT64_AS_NUMBER, + Int64Test.SMALL_INT64.toNumber(), + ); + assert.equal(Number.MAX_SAFE_INTEGER, Int64Test.MAX_JS_SAFE_INT64.toNumber()); + assert.equal(Number.MIN_SAFE_INTEGER, Int64Test.MIN_JS_SAFE_INT64.toNumber()); - for (let i = 0; i < EXPECTED_INT64_LIST.length; ++i){ - let int64Object = EXPECTED_INT64_LIST[i]; - assert.ok(Int64Test.INT64_2_INT64_MAP[JSONInt64.toDecimalString(int64Object)].equals(int64Object)); - } + for (let i = 0; i < EXPECTED_INT64_LIST.length; ++i) { + assert.ok(EXPECTED_INT64_LIST[i].equals(Int64Test.INT64_LIST[i])); + } - console.log('Int64 test -- ends'); - }); + for (let i = 0; i < EXPECTED_INT64_LIST.length; ++i) { + let int64Object = EXPECTED_INT64_LIST[i]; + assert.ok( + Int64Test.INT64_2_INT64_MAP[ + JSONInt64.toDecimalString(int64Object) + ].equals(int64Object), + ); + } + console.log("Int64 test -- ends"); +}); diff --git a/lib/ts/test/test.ts b/lib/ts/test/test.ts index 31fdcbff8bc..614461dc1fc 100644 --- a/lib/ts/test/test.ts +++ b/lib/ts/test/test.ts @@ -7,336 +7,365 @@ var QUnit = require("./qunit"); const transport: Thrift.Transport = new Thrift.Transport("/service"); const protocol: Thrift.Protocol = new Thrift.Protocol(transport); -const client: ThriftTest.ThriftTestClient = new ThriftTest.ThriftTestClient(protocol); +const client: ThriftTest.ThriftTestClient = new ThriftTest.ThriftTestClient( + protocol, +); -const int64_2_pow_60: typeof Int64 = new Int64('1000000000000000'); -const int64_minus_2_pow_60: typeof Int64 = new Int64('f000000000000000'); +const int64_2_pow_60: typeof Int64 = new Int64("1000000000000000"); +const int64_minus_2_pow_60: typeof Int64 = new Int64("f000000000000000"); // Work around for old API used by QUnitAdapter of jsTestDriver -if (typeof QUnit.log == 'function') { - // When using real QUnit (fron PhantomJS) log failures to console - QUnit.log(function(details) { - if (!details.result) { - console.log('======== FAIL ========'); - console.log('TestName: ' + details.name); - if (details.message) console.log(details.message); - console.log('Expected: ' + JSONInt64.stringify(details.expected)); - console.log('Actual : ' + JSONInt64.stringify(details.actual)); - console.log('======================'); - } - }); +if (typeof QUnit.log == "function") { + // When using real QUnit (fron PhantomJS) log failures to console + QUnit.log(function (details) { + if (!details.result) { + console.log("======== FAIL ========"); + console.log("TestName: " + details.name); + if (details.message) console.log(details.message); + console.log("Expected: " + JSONInt64.stringify(details.expected)); + console.log("Actual : " + JSONInt64.stringify(details.actual)); + console.log("======================"); + } + }); } // all Languages in UTF-8 -const stringTest: string = "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語"; - +const stringTest: string = + "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語"; function checkRecursively(assert, map1: Object, map2: Object): void { - if (typeof map1 !== 'function' && typeof map2 !== 'function') { - if (!map1 || typeof map1 !== 'object') { - assert.equal(map1, map2); - } else { - for (let key in map1) { - checkRecursively(assert, map1[key], map2[key]); - } - } + if (typeof map1 !== "function" && typeof map2 !== "function") { + if (!map1 || typeof map1 !== "object") { + assert.equal(map1, map2); + } else { + for (let key in map1) { + checkRecursively(assert, map1[key], map2[key]); + } } + } } - -QUnit.module('Base Types'); - - QUnit.test('Void', function(assert) { - assert.equal(client.testVoid(), undefined); - }); - QUnit.test('Binary (String)', function(assert) { - let binary: string = ''; - for (let v = 255; v >= 0; --v) { - binary += String.fromCharCode(v); - } - assert.equal(client.testBinary(binary), binary); - }); - QUnit.test('Binary (Uint8Array)', function(assert) { - let binary: string = ''; - for (let v = 255; v >= 0; --v) { - binary += String.fromCharCode(v); - } - const arr: Uint8Array = new Uint8Array(binary.length); - for (let i = 0; i < binary.length; ++i) { - arr[i] = binary[i].charCodeAt(0); - } - const hexEncodedString = Array.from(arr, function(byte) { - return String.fromCharCode(byte); - }).join('') - assert.equal(client.testBinary(hexEncodedString), binary); - }); - QUnit.test('String', function(assert) { - assert.equal(client.testString(''), ''); - assert.equal(client.testString(stringTest), stringTest); - - const specialCharacters: string = 'quote: \" backslash:' + - ' forwardslash-escaped: \/ ' + - ' backspace: \b formfeed: \f newline: \n return: \r tab: ' + - ' now-all-of-them-together: "\\\/\b\n\r\t' + - ' now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><'; - assert.equal(client.testString(specialCharacters), specialCharacters); - }); - QUnit.test('Double', function(assert) { - assert.equal(client.testDouble(0), 0); - assert.equal(client.testDouble(-1), -1); - assert.equal(client.testDouble(3.14), 3.14); - assert.equal(client.testDouble(Math.pow(2, 60)), Math.pow(2, 60)); - }); - QUnit.test('Byte', function(assert) { - assert.equal(client.testByte(0), 0); - assert.equal(client.testByte(0x01), 0x01); - }); - QUnit.test('I32', function(assert) { - assert.equal(client.testI32(0), 0); - assert.equal(client.testI32(Math.pow(2, 30)), Math.pow(2, 30)); - assert.equal(client.testI32(-Math.pow(2, 30)), -Math.pow(2, 30)); - }); - QUnit.test('I64', function(assert) { - assert.equal(client.testI64(new Int64(0)), 0); - - let int64_2_pow_60_result: typeof Int64 = client.testI64(int64_2_pow_60); - assert.ok(int64_2_pow_60.equals(int64_2_pow_60_result)); - - let int64_minus_2_pow_60_result: typeof Int64 = client.testI64(int64_minus_2_pow_60); - assert.ok(int64_minus_2_pow_60.equals(int64_minus_2_pow_60_result)); - }); - - -QUnit.module('Structured Types'); - - QUnit.test('Struct', function(assert) { - const structTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct(); - structTestInput.string_thing = 'worked'; - structTestInput.byte_thing = 0x01; - structTestInput.i32_thing = Math.pow(2, 30); - structTestInput.i64_thing = int64_2_pow_60; - - const structTestOutput: ThriftTest.Xtruct = client.testStruct(structTestInput); - - assert.equal(structTestOutput.string_thing, structTestInput.string_thing); - assert.equal(structTestOutput.byte_thing, structTestInput.byte_thing); - assert.equal(structTestOutput.i32_thing, structTestInput.i32_thing); - assert.ok(structTestOutput.i64_thing.equals(structTestInput.i64_thing)); - assert.ok(structTestInput.i64_thing.equals(structTestOutput.i64_thing)); - - assert.equal(JSONInt64.stringify(structTestOutput), JSONInt64.stringify(structTestInput)); - }); - - QUnit.test('Nest', function(assert) { - const xtrTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct(); - xtrTestInput.string_thing = 'worked'; - xtrTestInput.byte_thing = 0x01; - xtrTestInput.i32_thing = Math.pow(2, 30); - xtrTestInput.i64_thing = int64_2_pow_60; - - const nestTestInput: ThriftTest.Xtruct2 = new ThriftTest.Xtruct2(); - nestTestInput.byte_thing = 0x02; - nestTestInput.struct_thing = xtrTestInput; - nestTestInput.i32_thing = Math.pow(2, 15); - - const nestTestOutput: ThriftTest.Xtruct2 = client.testNest(nestTestInput); - - assert.equal(nestTestOutput.byte_thing, nestTestInput.byte_thing); - assert.equal(nestTestOutput.struct_thing.string_thing, nestTestInput.struct_thing.string_thing); - assert.equal(nestTestOutput.struct_thing.byte_thing, nestTestInput.struct_thing.byte_thing); - assert.equal(nestTestOutput.struct_thing.i32_thing, nestTestInput.struct_thing.i32_thing); - assert.ok(nestTestOutput.struct_thing.i64_thing.equals(nestTestInput.struct_thing.i64_thing)); - assert.equal(nestTestOutput.i32_thing, nestTestInput.i32_thing); - - assert.equal(JSONInt64.stringify(nestTestOutput), JSONInt64.stringify(nestTestInput)); - }); - - QUnit.test('Map', function(assert) { - const mapTestInput: {[k: number]: number;} = {7: 77, 8: 88, 9: 99}; - - const mapTestOutput: {[k: number]: number;} = client.testMap(mapTestInput); - - for (let key in mapTestOutput) { - assert.equal(mapTestOutput[key], mapTestInput[key]); - } - }); - - QUnit.test('StringMap', function(assert) { - const mapTestInput: {[k: string]: string;} = { - 'a': '123', 'a b': 'with spaces ', 'same': 'same', '0': 'numeric key', - 'longValue': stringTest, stringTest: 'long key' - }; - - const mapTestOutput: {[k: string]: string;} = client.testStringMap(mapTestInput); - - for (let key in mapTestOutput) { - assert.equal(mapTestOutput[key], mapTestInput[key]); - } - }); - - QUnit.test('Set', function(assert) { - const setTestInput: number[] = [1, 2, 3]; - assert.ok(client.testSet(setTestInput), setTestInput); - }); - - QUnit.test('List', function(assert) { - const listTestInput: number[] = [1, 2, 3]; - assert.ok(client.testList(listTestInput), listTestInput); - }); - - QUnit.test('Enum', function(assert) { - assert.equal(client.testEnum(ThriftTest.Numberz.ONE), ThriftTest.Numberz.ONE); - }); - - QUnit.test('TypeDef', function(assert) { - assert.equal(client.testTypedef(new Int64(69)), 69); - }); - - -QUnit.module('deeper!'); - - QUnit.test('MapMap', function(assert) { - const mapMapTestExpectedResult: {[K: number]: {[k: number]: number}} = { - '4': {'1': 1, '2': 2, '3': 3, '4': 4}, - '-4': {'-4': -4, '-3': -3, '-2': -2, '-1': -1} - }; - - const mapMapTestOutput = client.testMapMap(1); - - - for (let key in mapMapTestOutput) { - for (let key2 in mapMapTestOutput[key]) { - assert.equal(mapMapTestOutput[key][key2], mapMapTestExpectedResult[key][key2]); - } - } - - checkRecursively(assert, mapMapTestOutput, mapMapTestExpectedResult); - }); - - -QUnit.module('Exception'); - - QUnit.test('Xception', function(assert) { - assert.expect(2); - const done = assert.async(); - try { - client.testException('Xception'); - assert.ok(false); - }catch (e) { - assert.equal(e.errorCode, 1001); - assert.equal(e.message, 'Xception'); - done(); - } - }); - - QUnit.test('no Exception', function(assert) { - assert.expect(1); - try { - client.testException('no Exception'); - assert.ok(true); - }catch (e) { - assert.ok(false); - } - }); - - QUnit.test('TException', function(assert) { - //ThriftTest does not list TException as a legal exception so it will - // generate an exception on the server that does not propagate back to - // the client. This test has been modified to equate to "no exception" - assert.expect(1); - try { - client.testException('TException'); - } catch (e) { - //assert.ok(false); - } - assert.ok(true); - }); - - -QUnit.module('Insanity'); - - const crazy: ThriftTest.Insanity = { - 'userMap': { '5': new Int64(5), '8': new Int64(8) }, - 'xtructs': [{ - 'string_thing': 'Goodbye4', - 'byte_thing': 4, - 'i32_thing': 4, - 'i64_thing': new Int64(4) - }, - { - 'string_thing': 'Hello2', - 'byte_thing': 2, - 'i32_thing': 2, - 'i64_thing': new Int64(2) - }] - }; - QUnit.test('testInsanity', function(assert) { - const insanity: {[k: number]: (ThriftTest.Insanity | {[k:number]: ThriftTest.Insanity})} = { - '1': { - '2': crazy, - '3': crazy - }, - '2': { '6': new ThriftTest.Insanity() } - }; - const res = client.testInsanity(new ThriftTest.Insanity(crazy)); - assert.ok(res, JSONInt64.stringify(res)); - assert.ok(insanity, JSONInt64.stringify(insanity)); - - checkRecursively(assert, res, insanity); - }); - +QUnit.module("Base Types"); + +QUnit.test("Void", function (assert) { + assert.equal(client.testVoid(), undefined); +}); +QUnit.test("Binary (String)", function (assert) { + let binary: string = ""; + for (let v = 255; v >= 0; --v) { + binary += String.fromCharCode(v); + } + assert.equal(client.testBinary(binary), binary); +}); +QUnit.test("Binary (Uint8Array)", function (assert) { + let binary: string = ""; + for (let v = 255; v >= 0; --v) { + binary += String.fromCharCode(v); + } + const arr: Uint8Array = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; ++i) { + arr[i] = binary[i].charCodeAt(0); + } + const hexEncodedString = Array.from(arr, function (byte) { + return String.fromCharCode(byte); + }).join(""); + assert.equal(client.testBinary(hexEncodedString), binary); +}); +QUnit.test("String", function (assert) { + assert.equal(client.testString(""), ""); + assert.equal(client.testString(stringTest), stringTest); + + const specialCharacters: string = + 'quote: \" backslash:' + + " forwardslash-escaped: \/ " + + " backspace: \b formfeed: \f newline: \n return: \r tab: " + + ' now-all-of-them-together: "\\\/\b\n\r\t' + + " now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><"; + assert.equal(client.testString(specialCharacters), specialCharacters); +}); +QUnit.test("Double", function (assert) { + assert.equal(client.testDouble(0), 0); + assert.equal(client.testDouble(-1), -1); + assert.equal(client.testDouble(3.14), 3.14); + assert.equal(client.testDouble(Math.pow(2, 60)), Math.pow(2, 60)); +}); +QUnit.test("Byte", function (assert) { + assert.equal(client.testByte(0), 0); + assert.equal(client.testByte(0x01), 0x01); +}); +QUnit.test("I32", function (assert) { + assert.equal(client.testI32(0), 0); + assert.equal(client.testI32(Math.pow(2, 30)), Math.pow(2, 30)); + assert.equal(client.testI32(-Math.pow(2, 30)), -Math.pow(2, 30)); +}); +QUnit.test("I64", function (assert) { + assert.equal(client.testI64(new Int64(0)), 0); + + let int64_2_pow_60_result: typeof Int64 = client.testI64(int64_2_pow_60); + assert.ok(int64_2_pow_60.equals(int64_2_pow_60_result)); + + let int64_minus_2_pow_60_result: typeof Int64 = + client.testI64(int64_minus_2_pow_60); + assert.ok(int64_minus_2_pow_60.equals(int64_minus_2_pow_60_result)); +}); + +QUnit.module("Structured Types"); + +QUnit.test("Struct", function (assert) { + const structTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct(); + structTestInput.string_thing = "worked"; + structTestInput.byte_thing = 0x01; + structTestInput.i32_thing = Math.pow(2, 30); + structTestInput.i64_thing = int64_2_pow_60; + + const structTestOutput: ThriftTest.Xtruct = + client.testStruct(structTestInput); + + assert.equal(structTestOutput.string_thing, structTestInput.string_thing); + assert.equal(structTestOutput.byte_thing, structTestInput.byte_thing); + assert.equal(structTestOutput.i32_thing, structTestInput.i32_thing); + assert.ok(structTestOutput.i64_thing.equals(structTestInput.i64_thing)); + assert.ok(structTestInput.i64_thing.equals(structTestOutput.i64_thing)); + + assert.equal( + JSONInt64.stringify(structTestOutput), + JSONInt64.stringify(structTestInput), + ); +}); + +QUnit.test("Nest", function (assert) { + const xtrTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct(); + xtrTestInput.string_thing = "worked"; + xtrTestInput.byte_thing = 0x01; + xtrTestInput.i32_thing = Math.pow(2, 30); + xtrTestInput.i64_thing = int64_2_pow_60; + + const nestTestInput: ThriftTest.Xtruct2 = new ThriftTest.Xtruct2(); + nestTestInput.byte_thing = 0x02; + nestTestInput.struct_thing = xtrTestInput; + nestTestInput.i32_thing = Math.pow(2, 15); + + const nestTestOutput: ThriftTest.Xtruct2 = client.testNest(nestTestInput); + + assert.equal(nestTestOutput.byte_thing, nestTestInput.byte_thing); + assert.equal( + nestTestOutput.struct_thing.string_thing, + nestTestInput.struct_thing.string_thing, + ); + assert.equal( + nestTestOutput.struct_thing.byte_thing, + nestTestInput.struct_thing.byte_thing, + ); + assert.equal( + nestTestOutput.struct_thing.i32_thing, + nestTestInput.struct_thing.i32_thing, + ); + assert.ok( + nestTestOutput.struct_thing.i64_thing.equals( + nestTestInput.struct_thing.i64_thing, + ), + ); + assert.equal(nestTestOutput.i32_thing, nestTestInput.i32_thing); + + assert.equal( + JSONInt64.stringify(nestTestOutput), + JSONInt64.stringify(nestTestInput), + ); +}); + +QUnit.test("Map", function (assert) { + const mapTestInput: { [k: number]: number } = { 7: 77, 8: 88, 9: 99 }; + + const mapTestOutput: { [k: number]: number } = client.testMap(mapTestInput); + + for (let key in mapTestOutput) { + assert.equal(mapTestOutput[key], mapTestInput[key]); + } +}); + +QUnit.test("StringMap", function (assert) { + const mapTestInput: { [k: string]: string } = { + a: "123", + "a b": "with spaces ", + same: "same", + "0": "numeric key", + longValue: stringTest, + stringTest: "long key", + }; + + const mapTestOutput: { [k: string]: string } = + client.testStringMap(mapTestInput); + + for (let key in mapTestOutput) { + assert.equal(mapTestOutput[key], mapTestInput[key]); + } +}); + +QUnit.test("Set", function (assert) { + const setTestInput: number[] = [1, 2, 3]; + assert.ok(client.testSet(setTestInput), setTestInput); +}); + +QUnit.test("List", function (assert) { + const listTestInput: number[] = [1, 2, 3]; + assert.ok(client.testList(listTestInput), listTestInput); +}); + +QUnit.test("Enum", function (assert) { + assert.equal(client.testEnum(ThriftTest.Numberz.ONE), ThriftTest.Numberz.ONE); +}); + +QUnit.test("TypeDef", function (assert) { + assert.equal(client.testTypedef(new Int64(69)), 69); +}); + +QUnit.module("deeper!"); + +QUnit.test("MapMap", function (assert) { + const mapMapTestExpectedResult: { [K: number]: { [k: number]: number } } = { + "4": { "1": 1, "2": 2, "3": 3, "4": 4 }, + "-4": { "-4": -4, "-3": -3, "-2": -2, "-1": -1 }, + }; + + const mapMapTestOutput = client.testMapMap(1); + + for (let key in mapMapTestOutput) { + for (let key2 in mapMapTestOutput[key]) { + assert.equal( + mapMapTestOutput[key][key2], + mapMapTestExpectedResult[key][key2], + ); + } + } + + checkRecursively(assert, mapMapTestOutput, mapMapTestExpectedResult); +}); + +QUnit.module("Exception"); + +QUnit.test("Xception", function (assert) { + assert.expect(2); + const done = assert.async(); + try { + client.testException("Xception"); + assert.ok(false); + } catch (e) { + assert.equal(e.errorCode, 1001); + assert.equal(e.message, "Xception"); + done(); + } +}); + +QUnit.test("no Exception", function (assert) { + assert.expect(1); + try { + client.testException("no Exception"); + assert.ok(true); + } catch (e) { + assert.ok(false); + } +}); + +QUnit.test("TException", function (assert) { + //ThriftTest does not list TException as a legal exception so it will + // generate an exception on the server that does not propagate back to + // the client. This test has been modified to equate to "no exception" + assert.expect(1); + try { + client.testException("TException"); + } catch (e) { + //assert.ok(false); + } + assert.ok(true); +}); + +QUnit.module("Insanity"); + +const crazy: ThriftTest.Insanity = { + userMap: { "5": new Int64(5), "8": new Int64(8) }, + xtructs: [ + { + string_thing: "Goodbye4", + byte_thing: 4, + i32_thing: 4, + i64_thing: new Int64(4), + }, + { + string_thing: "Hello2", + byte_thing: 2, + i32_thing: 2, + i64_thing: new Int64(2), + }, + ], +}; +QUnit.test("testInsanity", function (assert) { + const insanity: { + [k: number]: ThriftTest.Insanity | { [k: number]: ThriftTest.Insanity }; + } = { + "1": { + "2": crazy, + "3": crazy, + }, + "2": { "6": new ThriftTest.Insanity() }, + }; + const res = client.testInsanity(new ThriftTest.Insanity(crazy)); + assert.ok(res, JSONInt64.stringify(res)); + assert.ok(insanity, JSONInt64.stringify(insanity)); + + checkRecursively(assert, res, insanity); +}); ////////////////////////////////// //Run same tests asynchronously -QUnit.module('Async'); - - QUnit.test('Double', function(assert) { - assert.expect(1); - - const done = assert.async(); - client.testDouble(3.14159265, function(result) { - assert.equal(result, 3.14159265); - done(); - }); - }); - - QUnit.test('Byte', function(assert) { - assert.expect(1); - - const done = assert.async(); - client.testByte(0x01, function(result) { - assert.equal(result, 0x01); - done(); - }); - }); - - QUnit.test('I32', function(assert) { - assert.expect(2); - - const done = assert.async(2); - client.testI32(Math.pow(2, 30), function(result) { - assert.equal(result, Math.pow(2, 30)); - done(); - }); - - client.testI32(Math.pow(-2, 31), function(result) { - assert.equal(result, Math.pow(-2, 31)); - done(); - }); - }); - - QUnit.test('I64', function(assert) { - assert.expect(2); - - const done = assert.async(2); - client.testI64(int64_2_pow_60, function(result) { - assert.ok(int64_2_pow_60.equals(result)); - done(); - }); - - client.testI64(int64_minus_2_pow_60, function(result) { - assert.ok(int64_minus_2_pow_60.equals(result)); - done(); - }); - }); +QUnit.module("Async"); + +QUnit.test("Double", function (assert) { + assert.expect(1); + + const done = assert.async(); + client.testDouble(3.14159265, function (result) { + assert.equal(result, 3.14159265); + done(); + }); +}); + +QUnit.test("Byte", function (assert) { + assert.expect(1); + + const done = assert.async(); + client.testByte(0x01, function (result) { + assert.equal(result, 0x01); + done(); + }); +}); + +QUnit.test("I32", function (assert) { + assert.expect(2); + + const done = assert.async(2); + client.testI32(Math.pow(2, 30), function (result) { + assert.equal(result, Math.pow(2, 30)); + done(); + }); + + client.testI32(Math.pow(-2, 31), function (result) { + assert.equal(result, Math.pow(-2, 31)); + done(); + }); +}); + +QUnit.test("I64", function (assert) { + assert.expect(2); + + const done = assert.async(2); + client.testI64(int64_2_pow_60, function (result) { + assert.ok(int64_2_pow_60.equals(result)); + done(); + }); + + client.testI64(int64_minus_2_pow_60, function (result) { + assert.ok(int64_minus_2_pow_60.equals(result)); + done(); + }); +}); diff --git a/lib/ts/test/test_handler.js b/lib/ts/test/test_handler.js index 8ba296ba108..825c5675c8c 100644 --- a/lib/ts/test/test_handler.js +++ b/lib/ts/test/test_handler.js @@ -20,87 +20,87 @@ //This is the server side Node test handler for the standard // Apache Thrift test service. -const es6Mode = process.argv.includes('--es6'); -const genFolder = es6Mode ? 'gen-nodejs-es6' : 'gen-nodejs'; +const es6Mode = process.argv.includes("--es6"); +const genFolder = es6Mode ? "gen-nodejs-es6" : "gen-nodejs"; const ttypes = require(`./${genFolder}/ThriftTest_types`); -const TException = require('../../nodejs/lib/thrift').TException; -const Int64 = require('node-int64'); +const TException = require("../../nodejs/lib/thrift").TException; +const Int64 = require("node-int64"); exports.ThriftTestHandler = { - testVoid: function(result) { - console.log('testVoid()'); + testVoid: function (result) { + console.log("testVoid()"); result(null); }, - testString: function(thing, result) { - console.log('testString(\'' + thing + '\')'); + testString: function (thing, result) { + console.log("testString('" + thing + "')"); result(null, thing); }, - testByte: function(thing, result) { - console.log('testByte(' + thing + ')'); + testByte: function (thing, result) { + console.log("testByte(" + thing + ")"); result(null, thing); }, - testI32: function(thing, result) { - console.log('testI32(' + thing + ')'); + testI32: function (thing, result) { + console.log("testI32(" + thing + ")"); result(null, thing); }, - testI64: function(thing, result) { - console.log('testI64(' + thing + ')'); + testI64: function (thing, result) { + console.log("testI64(" + thing + ")"); result(null, thing); }, - testDouble: function(thing, result) { - console.log('testDouble(' + thing + ')'); + testDouble: function (thing, result) { + console.log("testDouble(" + thing + ")"); result(null, thing); }, - testBinary: function(thing, result) { - console.log('testBinary(\'' + thing + '\')'); + testBinary: function (thing, result) { + console.log("testBinary('" + thing + "')"); result(null, thing); }, - testStruct: function(thing, result) { - console.log('testStruct('); + testStruct: function (thing, result) { + console.log("testStruct("); console.log(thing); - console.log(')'); + console.log(")"); result(null, thing); }, - testNest: function(nest, result) { - console.log('testNest('); + testNest: function (nest, result) { + console.log("testNest("); console.log(nest); - console.log(')'); + console.log(")"); result(null, nest); }, - testMap: function(thing, result) { - console.log('testMap('); + testMap: function (thing, result) { + console.log("testMap("); console.log(thing); - console.log(')'); + console.log(")"); result(null, thing); }, - testStringMap: function(thing, result) { - console.log('testStringMap('); + testStringMap: function (thing, result) { + console.log("testStringMap("); console.log(thing); - console.log(')'); + console.log(")"); result(null, thing); }, - testSet: function(thing, result) { - console.log('testSet('); + testSet: function (thing, result) { + console.log("testSet("); console.log(thing); - console.log(')'); + console.log(")"); result(null, thing); }, - testList: function(thing, result) { - console.log('testList('); + testList: function (thing, result) { + console.log("testList("); console.log(thing); - console.log(')'); + console.log(")"); result(null, thing); }, - testEnum: function(thing, result) { - console.log('testEnum(' + thing + ')'); + testEnum: function (thing, result) { + console.log("testEnum(" + thing + ")"); result(null, thing); }, - testTypedef: function(thing, result) { - console.log('testTypedef(' + thing + ')'); + testTypedef: function (thing, result) { + console.log("testTypedef(" + thing + ")"); result(null, thing); }, - testMapMap: function(hello, result) { - console.log('testMapMap(' + hello + ')'); + testMapMap: function (hello, result) { + console.log("testMapMap(" + hello + ")"); const mapmap = []; const pos = []; @@ -114,19 +114,19 @@ exports.ThriftTestHandler = { result(null, mapmap); }, - testInsanity: function(argument, result) { - console.log('testInsanity('); + testInsanity: function (argument, result) { + console.log("testInsanity("); console.log(argument); - console.log(')'); + console.log(")"); const hello = new ttypes.Xtruct(); - hello.string_thing = 'Hello2'; + hello.string_thing = "Hello2"; hello.byte_thing = 2; hello.i32_thing = 2; hello.i64_thing = new Int64(2); const goodbye = new ttypes.Xtruct(); - goodbye.string_thing = 'Goodbye4'; + goodbye.string_thing = "Goodbye4"; goodbye.byte_thing = 4; goodbye.i32_thing = 4; goodbye.i64_thing = new Int64(4); @@ -150,45 +150,45 @@ exports.ThriftTestHandler = { insane[1] = first_map; insane[2] = second_map; - console.log('insane result:'); + console.log("insane result:"); console.log(insane); result(null, insane); }, - testMulti: function(arg0, arg1, arg2, arg3, arg4, arg5, result) { - console.log('testMulti()'); + testMulti: function (arg0, arg1, arg2, arg3, arg4, arg5, result) { + console.log("testMulti()"); const hello = new ttypes.Xtruct(); - hello.string_thing = 'Hello2'; + hello.string_thing = "Hello2"; hello.byte_thing = arg0; hello.i32_thing = arg1; hello.i64_thing = arg2; result(null, hello); }, - testException: function(arg, result) { - console.log('testException(' + arg + ')'); - if (arg === 'Xception') { + testException: function (arg, result) { + console.log("testException(" + arg + ")"); + if (arg === "Xception") { const x = new ttypes.Xception(); x.errorCode = 1001; x.message = arg; result(x); - } else if (arg === 'TException') { + } else if (arg === "TException") { result(new TException(arg)); } else { result(null); } }, - testMultiException: function(arg0, arg1, result) { - console.log('testMultiException(' + arg0 + ', ' + arg1 + ')'); - if (arg0 === ('Xception')) { + testMultiException: function (arg0, arg1, result) { + console.log("testMultiException(" + arg0 + ", " + arg1 + ")"); + if (arg0 === "Xception") { const x = new ttypes.Xception(); x.errorCode = 1001; - x.message = 'This is an Xception'; + x.message = "This is an Xception"; result(x); - } else if (arg0 === ('Xception2')) { + } else if (arg0 === "Xception2") { const x2 = new ttypes.Xception2(); x2.errorCode = 2002; x2.struct_thing = new ttypes.Xtruct(); - x2.struct_thing.string_thing = 'This is an Xception2'; + x2.struct_thing.string_thing = "This is an Xception2"; result(x2); } @@ -196,7 +196,9 @@ exports.ThriftTestHandler = { res.string_thing = arg1; result(null, res); }, - testOneway: function(sleepFor, result) { - console.log('testOneway(' + sleepFor + ') => JavaScript (like Rust) never sleeps!'); - } -}; //ThriftTestSvcHandler + testOneway: function (sleepFor, result) { + console.log( + "testOneway(" + sleepFor + ") => JavaScript (like Rust) never sleeps!", + ); + }, +}; //ThriftTestSvcHandler diff --git a/lib/ts/thrift.d.ts b/lib/ts/thrift.d.ts index 0ba46c91497..8e9d565fab5 100644 --- a/lib/ts/thrift.d.ts +++ b/lib/ts/thrift.d.ts @@ -29,7 +29,7 @@ declare module Thrift { * @property {number} VOID - No value (only legal for return types). * @property {number} BOOL - True/False integer. * @property {number} BYTE - Signed 8 bit integer. - * @property {number} I08 - Signed 8 bit integer. + * @property {number} I08 - Signed 8 bit integer. * @property {number} DOUBLE - 64 bit IEEE 854 floating point. * @property {number} I16 - Signed 16 bit integer. * @property {number} I32 - Signed 32 bit integer. @@ -44,23 +44,23 @@ declare module Thrift { * @property {number} UTF16 - Array of bytes representing a string of UTF16 encoded characters. */ interface Type { - 'STOP': number; - 'VOID': number; - 'BOOL': number; - 'BYTE': number; - 'I08': number; - 'DOUBLE': number; - 'I16': number; - 'I32': number; - 'I64': number; - 'STRING': number; - 'UTF7': number; - 'STRUCT': number; - 'MAP': number; - 'SET': number; - 'LIST': number; - 'UTF8': number; - 'UTF16': number; + STOP: number; + VOID: number; + BOOL: number; + BYTE: number; + I08: number; + DOUBLE: number; + I16: number; + I32: number; + I64: number; + STRING: number; + UTF7: number; + STRUCT: number; + MAP: number; + SET: number; + LIST: number; + UTF8: number; + UTF16: number; } var Type: Type; @@ -72,10 +72,10 @@ declare module Thrift { * @property {number} ONEWAY - Oneway RPC call from client to server with no response. */ interface MessageType { - 'CALL': number; - 'REPLY': number; - 'EXCEPTION': number; - 'ONEWAY': number; + CALL: number; + REPLY: number; + EXCEPTION: number; + ONEWAY: number; } var MessageType: MessageType; @@ -92,7 +92,11 @@ declare module Thrift { * @param {function} superConstructor - Contstructor function to set as base. * @param {string} [name] - Type name to set as name property in derived prototype. */ - function inherits(constructor: Function, superConstructor: Function, name?: string): void; + function inherits( + constructor: Function, + superConstructor: Function, + name?: string, + ): void; /** * TException is the base class for all Thrift exceptions types. @@ -129,17 +133,17 @@ declare module Thrift { * @property {number} UNSUPPORTED_CLIENT_TYPE - Unused. */ interface TApplicationExceptionType { - 'UNKNOWN': number; - 'UNKNOWN_METHOD': number; - 'INVALID_MESSAGE_TYPE': number; - 'WRONG_METHOD_NAME': number; - 'BAD_SEQUENCE_ID': number; - 'MISSING_RESULT': number; - 'INTERNAL_ERROR': number; - 'PROTOCOL_ERROR': number; - 'INVALID_TRANSFORM': number; - 'INVALID_PROTOCOL': number; - 'UNSUPPORTED_CLIENT_TYPE': number; + UNKNOWN: number; + UNKNOWN_METHOD: number; + INVALID_MESSAGE_TYPE: number; + WRONG_METHOD_NAME: number; + BAD_SEQUENCE_ID: number; + MISSING_RESULT: number; + INTERNAL_ERROR: number; + PROTOCOL_ERROR: number; + INVALID_TRANSFORM: number; + INVALID_PROTOCOL: number; + UNSUPPORTED_CLIENT_TYPE: number; } var TApplicationExceptionType: TApplicationExceptionType; @@ -179,7 +183,7 @@ declare module Thrift { /** * The Apache Thrift Transport layer performs byte level I/O between RPC * clients and servers. The JavaScript Transport object type uses Http[s]/XHR and is - * the sole browser based Thrift transport. Target servers must implement the http[s] + * the sole browser based Thrift transport. Target servers must implement the http[s] * transport (see: node.js example server). */ class TXHRTransport { @@ -208,7 +212,7 @@ declare module Thrift { /** * Sends the current XRH request if the transport was created with a URL and * the async parameter if false. If the transport was not created with a URL - * or the async parameter is True or the URL is an empty string, the current + * or the async parameter is True or the URL is an empty string, the current * send buffer is returned. * @param {object} async - If true the current send buffer is returned. * @param {function} callback - Optional async completion callback. @@ -224,7 +228,12 @@ declare module Thrift { * @param {function} recv_method - The Thrift Service Client receive method for the call. * @returns {object} A new jQuery XHR object. */ - jqRequest(client: Object, postData: any, args: Function, recv_method: Function): Object; + jqRequest( + client: Object, + postData: any, + args: Function, + recv_method: Function, + ): Object; /** * Sets the buffer to use when receiving server responses. @@ -281,22 +290,22 @@ declare module Thrift { /** * Old alias of the TXHRTransport for backwards compatibility. */ - class Transport extends TXHRTransport { } + class Transport extends TXHRTransport {} /** - * The Apache Thrift Transport layer performs byte level I/O - * between RPC clients and servers. The JavaScript TWebSocketTransport object + * The Apache Thrift Transport layer performs byte level I/O + * between RPC clients and servers. The JavaScript TWebSocketTransport object * uses the WebSocket protocol. Target servers must implement WebSocket. */ class TWebSocketTransport { - url: string; //Where to connect - socket: any; //The web socket + url: string; //Where to connect + socket: any; //The web socket callbacks: Function[]; //Pending callbacks - send_pending: any[]; //Buffers/Callback pairs waiting to be sent - send_buf: string; //Outbound data, immutable until sent - recv_buf: string; //Inbound data - rb_wpos: number; //Network write position in receive buffer - rb_rpos: number; //Client read position in receive buffer + send_pending: any[]; //Buffers/Callback pairs waiting to be sent + send_buf: string; //Outbound data, immutable until sent + recv_buf: string; //Inbound data + rb_wpos: number; //Network write position in receive buffer + rb_rpos: number; //Client read position in receive buffer /** * Constructor Function for the WebSocket transport. @@ -307,12 +316,12 @@ declare module Thrift { __reset(url: string): void; /** - * Sends the current WS request and registers callback. The async - * parameter is ignored (WS flush is always async) and the callback + * Sends the current WS request and registers callback. The async + * parameter is ignored (WS flush is always async) and the callback * function parameter is required. * @param {object} async - Ignored. * @param {function} callback - The client completion callback. - * @returns {undefined|string} Nothing (undefined) + * @returns {undefined|string} Nothing (undefined) */ flush(async: any, callback: Function): string; @@ -332,7 +341,7 @@ declare module Thrift { /** * Returns true if the transport is open - * @returns {boolean} + * @returns {boolean} */ isOpen(): boolean; @@ -374,8 +383,8 @@ declare module Thrift { } /** - * Apache Thrift Protocols perform serialization which enables cross - * language RPC. The Protocol type is the JavaScript browser implementation + * Apache Thrift Protocols perform serialization which enables cross + * language RPC. The Protocol type is the JavaScript browser implementation * of the Apache Thrift TJSONProtocol. */ class TJSONProtocol { @@ -401,17 +410,17 @@ declare module Thrift { /** * Thrift IDL type string to Id mapping. * The mapping table looks as follows: - * "tf" -> Thrift.Type.BOOL - * "i8" -> Thrift.Type.BYTE - * "i16" -> Thrift.Type.I16 - * "i32" -> Thrift.Type.I32 - * "i64" -> Thrift.Type.I64 + * "tf" -> Thrift.Type.BOOL + * "i8" -> Thrift.Type.BYTE + * "i16" -> Thrift.Type.I16 + * "i32" -> Thrift.Type.I32 + * "i64" -> Thrift.Type.I64 * "dbl" -> Thrift.Type.DOUBLE * "rec" -> Thrift.Type.STRUCT * "str" -> Thrift.Type.STRING - * "map" -> Thrift.Type.MAP - * "lst" -> Thrift.Type.LIST - * "set" -> Thrift.Type.SET + * "map" -> Thrift.Type.MAP + * "lst" -> Thrift.Type.LIST + * "set" -> Thrift.Type.SET */ RType: { [k: string]: number }; @@ -542,8 +551,8 @@ declare module Thrift { @property {Thrift.MessageType} mtype - The type of message call. @property {number} rseqid - The sequence number of the message (0 in Thrift RPC). */ - /** - * Deserializes the beginning of a message. + /** + * Deserializes the beginning of a message. * @returns {AnonReadMessageBeginReturn} */ readMessageBegin(): { fname: string; mtype: number; rseqid: number }; @@ -551,8 +560,8 @@ declare module Thrift { /** Deserializes the end of a message. */ readMessageEnd(): void; - /** - * Deserializes the beginning of a struct. + /** + * Deserializes the beginning of a struct. * @param {string} [name] - The name of the struct (ignored). * @returns {object} - An object with an empty string fname property. */ @@ -568,8 +577,8 @@ declare module Thrift { @property {Thrift.Type} ftype - The data type of the field. @property {number} fid - The unique identifier of the field. */ - /** - * Deserializes the beginning of a field. + /** + * Deserializes the beginning of a field. * @returns {AnonReadFieldBeginReturn} */ readFieldBegin(): { fname: string; ftype: number; fid: number }; @@ -584,8 +593,8 @@ declare module Thrift { @property {Thrift.Type} vtype - The data type of the value. @property {number} size - The number of elements in the map. */ - /** - * Deserializes the beginning of a map. + /** + * Deserializes the beginning of a map. * @returns {AnonReadMapBeginReturn} */ readMapBegin(): { ktype: number; vtype: number; size: number }; @@ -599,8 +608,8 @@ declare module Thrift { @property {Thrift.Type} etype - The data type of the element. @property {number} size - The number of elements in the collection. */ - /** - * Deserializes the beginning of a list. + /** + * Deserializes the beginning of a list. * @returns {AnonReadColBeginReturn} */ readListBegin(): { etype: number; size: number }; @@ -608,19 +617,22 @@ declare module Thrift { /** Deserializes the end of a list. */ readListEnd(): void; - /** - * Deserializes the beginning of a set. + /** + * Deserializes the beginning of a set. * @param {Thrift.Type} elemType - The data type of the elements (ignored). * @param {number} size - The number of elements in the list (ignored). * @returns {AnonReadColBeginReturn} */ - readSetBegin(elemType?: number, size?: number): { etype: number; size: number }; + readSetBegin( + elemType?: number, + size?: number, + ): { etype: number; size: number }; /** Deserializes the end of a set. */ readSetEnd(): void; - /** Returns an object with a value property set to - * False unless the next number in the protocol buffer + /** Returns an object with a value property set to + * False unless the next number in the protocol buffer * is 1, in which case the value property is True. */ readBool(): Object; @@ -652,7 +664,7 @@ declare module Thrift { next value found in the protocol buffer. */ readBinary(): Object; - /** + /** * Method to arbitrarily skip over data (not implemented). */ skip(type: number): void; @@ -661,7 +673,7 @@ declare module Thrift { /** * Old alias of the TXHRTransport for backwards compatibility. */ - class Protocol extends TJSONProtocol { } + class Protocol extends TJSONProtocol {} class MultiplexProtocol extends TJSONProtocol { serviceName: string; @@ -673,7 +685,12 @@ declare module Thrift { * @param {any} [strictRead] * @param {any} [strictWrite] */ - constructor(srvName: string, trans: Object, strictRead?: any, strictWrite?: any); + constructor( + srvName: string, + trans: Object, + strictRead?: any, + strictWrite?: any, + ); /** * Override writeMessageBegin method of prototype diff --git a/package-lock.json b/package-lock.json index 50f7d58558f..9b7db5c87d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,20 +16,22 @@ "ws": "^5.2.3" }, "devDependencies": { + "@eslint/js": "^9.18.0", "@types/node": "^10.12.6", "@types/node-int64": "^0.4.29", "@types/q": "^1.5.1", "buffer-equals": "^1.0.4", "commander": "^2.14.1", "connect": "^3.6.6", - "eslint": "^5.7.0", - "eslint-config-prettier": "^3.1.0", - "eslint-plugin-prettier": "^3.0.0", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.2.1", + "globals": "^15.14.0", "html-validator-cli": "^2.0.0", "jsdoc": "^4.0.2", "json-int64": "^1.0.2", "nyc": "^15.0.0", - "prettier": "^1.14.3", + "prettier": "^3.4.2", "tape": "^4.9.0", "typescript": "^3.1.6", "utf-8-validate": "^5.0.0" @@ -285,6 +287,15 @@ "ms": "^2.1.1" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/traverse/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -305,6 +316,262 @@ "node": ">=6.9.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.5", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/@eslint/core": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/@eslint/js": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz", + "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", + "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", + "dev": true, + "dependencies": { + "@eslint/core": "^0.10.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", @@ -398,12 +665,36 @@ "node": ">=v12.0.0" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, "node_modules/@types/linkify-it": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", @@ -448,9 +739,9 @@ "dev": true }, "node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -460,12 +751,12 @@ } }, "node_modules/acorn-jsx": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.0.tgz", - "integrity": "sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "peerDependencies": { - "acorn": "^6.0.0" + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/aggregate-error": { @@ -497,30 +788,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -560,36 +827,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -694,25 +931,13 @@ "node": ">=8" } }, - "node_modules/caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "dependencies": { - "callsites": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/camelcase": { @@ -756,19 +981,6 @@ "node": ">=4" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", - "dev": true - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -778,24 +990,6 @@ "node": ">=6" } }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, "node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -927,19 +1121,17 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=4.8" + "node": ">= 8" } }, "node_modules/dashdash": { @@ -979,9 +1171,9 @@ "dev": true }, "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "node_modules/default-require-extensions": { @@ -1014,24 +1206,6 @@ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", "dev": true }, - "node_modules/del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "dependencies": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1041,18 +1215,6 @@ "node": ">=0.4.0" } }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1145,159 +1307,315 @@ } }, "node_modules/eslint": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.7.0.tgz", - "integrity": "sha512-zYCeFQahsxffGl87U2aJ7DPyH8CbWgxBC213Y8+TCanhUTf2gEvfq3EKpHmEcozTLyPmGe9LZdMAwC/CpJBM5A==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.5.3", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", - "esquery": "^1.0.1", + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz", + "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.10.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.18.0", + "@eslint/plugin-kit": "^0.2.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.1.0", - "is-resolvable": "^1.1.0", - "js-yaml": "^3.12.0", + "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.5", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.0.2", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-config-prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.1.0.tgz", - "integrity": "sha512-QYGfmzuc4q4J6XIhlp8vRKdI/fI0tQfQPy1dME3UOLprE+v4ssH/3W9LM2Q7h5qBcy5m0ehCrBDU2YF8q6OY8w==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz", + "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==", "dev": true, - "dependencies": { - "get-stdin": "^6.0.0" - }, "bin": { - "eslint-config-prettier-check": "bin/cli.js" + "eslint-config-prettier": "build/bin/cli.js" }, "peerDependencies": { - "eslint": ">=3.14.1" + "eslint": ">=7.0.0" } }, "node_modules/eslint-plugin-prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.0.tgz", - "integrity": "sha512-4g11opzhqq/8+AMmo5Vc2Gn7z9alZ4JqrbZ+D4i8KlSyxeQhZHlmIrY8U9Akf514MoEhogPa87Jgkq87aZ2Ohw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" }, "engines": { - "node": ">=6.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" }, "peerDependencies": { - "eslint": ">= 5.0.0", - "prettier": ">= 1.13.0" + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, "node_modules/espree": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", - "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "dependencies": { - "acorn": "^6.0.2", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">=6.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -1314,42 +1632,42 @@ } }, "node_modules/esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=0.6" + "node": ">=0.10" } }, "node_modules/esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "dependencies": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" }, "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, "node_modules/esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "engines": { "node": ">=0.10.0" @@ -1361,20 +1679,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -1384,6 +1688,12 @@ "node >=0.6.0" ] }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "node_modules/fast-diff": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", @@ -1399,32 +1709,19 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=16.0.0" } }, "node_modules/finalhandler": { @@ -1476,20 +1773,24 @@ } }, "node_modules/flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=16" } }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -1512,65 +1813,6 @@ "node": ">=8.0.0" } }, - "node_modules/foreground-child/node_modules/cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/foreground-child/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -1612,12 +1854,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, "node_modules/gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -1636,15 +1872,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -1671,30 +1898,28 @@ "node": "*" } }, - "node_modules/globals": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", - "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, - "node_modules/globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "node_modules/globals": { + "version": "15.14.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/graceful-fs": { @@ -1826,25 +2051,29 @@ "npm": ">=1.3.7" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, "engines": { - "node": ">= 4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { @@ -1881,30 +2110,6 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, - "node_modules/inquirer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", - "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.0", - "figures": "^2.0.0", - "lodash": "^4.17.10", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.1.0", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", @@ -1923,54 +2128,27 @@ "node": ">= 0.4" } }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "dependencies": { - "is-path-inside": "^1.0.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "path-is-inside": "^1.0.1" + "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, "node_modules/is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -1983,12 +2161,6 @@ "node": ">= 0.4" } }, - "node_modules/is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, "node_modules/is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -2111,29 +2283,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-processinfo/node_modules/cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -2149,42 +2298,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/istanbul-lib-processinfo/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", @@ -2350,22 +2463,10 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsdoc/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" + "mkdirp": "bin/cmd.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10" } }, "node_modules/jsesc": { @@ -2380,6 +2481,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-int64": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-int64/-/json-int64-1.0.2.tgz", @@ -2440,6 +2547,15 @@ "node": ">=0.6.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/klaw": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", @@ -2450,13 +2566,13 @@ } }, "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -2495,6 +2611,12 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/make-dir": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", @@ -2590,15 +2712,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2620,42 +2733,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node_modules/node-gyp-build": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz", @@ -2779,15 +2868,6 @@ "node": "*" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", @@ -2824,44 +2904,23 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/p-limit": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", @@ -2931,6 +2990,18 @@ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -2958,19 +3029,13 @@ "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/performance-now": { @@ -2979,36 +3044,6 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -3021,34 +3056,28 @@ "node": ">=8" } }, - "node_modules/pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.14.3.tgz", - "integrity": "sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=4" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-linter-helpers": { @@ -3075,15 +3104,6 @@ "node": ">=8" } }, - "node_modules/progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -3117,15 +3137,6 @@ "node": ">=0.6" } }, - "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, - "engines": { - "node": ">=6.5.0" - } - }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -3185,19 +3196,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "node_modules/require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "dependencies": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/requizzle": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", @@ -3208,23 +3206,10 @@ } }, "node_modules/resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, "engines": { "node": ">=4" } @@ -3238,42 +3223,6 @@ "through": "~2.3.4" } }, - "node_modules/rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "dependencies": { - "glob": "^7.0.5" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "dependencies": { - "is-promise": "^2.1.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -3302,24 +3251,24 @@ "dev": true }, "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/signal-exit": { @@ -3328,18 +3277,6 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "node_modules/slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", @@ -3372,21 +3309,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/spawn-wrap/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -3427,19 +3349,6 @@ "node": ">= 0.6" } }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/string.prototype.trim": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", @@ -3454,18 +3363,6 @@ "node": ">= 0.4" } }, - "node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -3476,12 +3373,15 @@ } }, "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/supports-color": { @@ -3496,19 +3396,20 @@ "node": ">=4" } }, - "node_modules/table": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", - "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==", + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", "dev": true, "dependencies": { - "ajv": "^6.5.3", - "lodash": "^4.17.10", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, "node_modules/tape": { @@ -3584,30 +3485,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, "node_modules/through": { "version": "2.3.8", "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -3631,9 +3514,9 @@ } }, "node_modules/tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, "node_modules/tunnel-agent": { @@ -3655,12 +3538,12 @@ "dev": true }, "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" @@ -3777,15 +3660,18 @@ } }, "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-module": { @@ -3794,11 +3680,14 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/wrap-ansi": { "version": "6.2.0", @@ -3898,18 +3787,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "node_modules/write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/write-file-atomic": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", @@ -4020,6 +3897,18 @@ "engines": { "node": ">=6" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 5b02952667b..6ed792df260 100644 --- a/package.json +++ b/package.json @@ -43,20 +43,22 @@ "ws": "^5.2.3" }, "devDependencies": { + "@eslint/js": "^9.18.0", "@types/node": "^10.12.6", "@types/node-int64": "^0.4.29", "@types/q": "^1.5.1", "buffer-equals": "^1.0.4", "commander": "^2.14.1", "connect": "^3.6.6", - "eslint": "^5.7.0", - "eslint-config-prettier": "^3.1.0", - "eslint-plugin-prettier": "^3.0.0", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.2.1", + "globals": "^15.14.0", "html-validator-cli": "^2.0.0", "jsdoc": "^4.0.2", "json-int64": "^1.0.2", "nyc": "^15.0.0", - "prettier": "^1.14.3", + "prettier": "^3.4.2", "tape": "^4.9.0", "typescript": "^3.1.6", "utf-8-validate": "^5.0.0" @@ -65,8 +67,8 @@ "cover": "lib/nodejs/test/testAll.sh COVER", "test": "lib/nodejs/test/testAll.sh", "test-ts": "lib/nodets/test/testAll.sh", - "prettier": "prettier --write '**/*.js'", - "lint": "eslint lib/nodejs/. --ext .js", - "lint-tests": "eslint lib/nodejs/test/. --ext .js" + "prettier": "prettier --write '**/*.{js,mjs,ts}'", + "lint": "eslint lib/nodejs", + "lint-tests": "eslint lib/nodejs/test" } } diff --git a/test/result.js b/test/result.js index 18b1a593d18..a6dd00a7a9f 100644 --- a/test/result.js +++ b/test/result.js @@ -18,47 +18,62 @@ */ -$.getJSON('results.json', function(results) { - $(document).ready(function() { - var transport = 3; - var socket = 4; - var success = 5; - var expected = 6; - var returnCode = 7; - var logFile = 8; - testTable = $('#test_results').DataTable({ - data: results['results'], - columnDefs: [ - { - targets: 3, - render: function(data, type, row) { - return row[transport] + '-' + row[socket]; - }, - }, - { - targets: 4, - render: function(data, type, row) { - return (row[success] ? 'success' : 'failure') - + '(' + (row[returnCode] == 128 ? 'timeout' : row[returnCode]) + ')' - + '(Server, ' - + 'Client)'; - }, - }, - { - targets: 5, - render: function(data, type, row) { - // 'yes' rather than 'expected' to ease search - return row[expected] ? 'yes' : 'unexpected'; - }, - } - ], - }); - $('#test_results_filter label input').focus().val('unexpected failure'); - $('#test_info').text( - "Test Date: " + results['date'] + "\n" + - "Revision: " + results['revision'] + "\n" + - "Platform: " + results['platform'] + "\n" + - "Test duration: " + results['duration']) + " seconds"; +$.getJSON("results.json", function (results) { + $(document).ready(function () { + var transport = 3; + var socket = 4; + var success = 5; + var expected = 6; + var returnCode = 7; + var logFile = 8; + testTable = $("#test_results").DataTable({ + data: results["results"], + columnDefs: [ + { + targets: 3, + render: function (data, type, row) { + return row[transport] + "-" + row[socket]; + }, + }, + { + targets: 4, + render: function (data, type, row) { + return ( + (row[success] ? "success" : "failure") + + "(" + + (row[returnCode] == 128 ? "timeout" : row[returnCode]) + + ")" + + '(Server, ' + + 'Client)' + ); + }, + }, + { + targets: 5, + render: function (data, type, row) { + // 'yes' rather than 'expected' to ease search + return row[expected] ? "yes" : "unexpected"; + }, + }, + ], }); + $("#test_results_filter label input").focus().val("unexpected failure"); + $("#test_info").text( + "Test Date: " + + results["date"] + + "\n" + + "Revision: " + + results["revision"] + + "\n" + + "Platform: " + + results["platform"] + + "\n" + + "Test duration: " + + results["duration"], + ) + " seconds"; + }); }); - diff --git a/tutorial/nodejs/NodeClient.js b/tutorial/nodejs/NodeClient.js index b4886e82608..e4e92cc0f30 100644 --- a/tutorial/nodejs/NodeClient.js +++ b/tutorial/nodejs/NodeClient.js @@ -17,47 +17,44 @@ * under the License. */ -var thrift = require('thrift'); -var Calculator = require('./gen-nodejs/Calculator'); -var ttypes = require('./gen-nodejs/tutorial_types'); -const assert = require('assert'); +var thrift = require("thrift"); +var Calculator = require("./gen-nodejs/Calculator"); +var ttypes = require("./gen-nodejs/tutorial_types"); +const assert = require("assert"); var transport = thrift.TBufferedTransport; var protocol = thrift.TBinaryProtocol; var connection = thrift.createConnection("localhost", 9090, { - transport : transport, - protocol : protocol + transport: transport, + protocol: protocol, }); -connection.on('error', function(err) { +connection.on("error", function (err) { assert(false, err); }); // Create a Calculator client with the connection var client = thrift.createClient(Calculator, connection); - -client.ping(function(err, response) { - console.log('ping()'); +client.ping(function (err, response) { + console.log("ping()"); }); - -client.add(1,1, function(err, response) { +client.add(1, 1, function (err, response) { console.log("1+1=" + response); }); - work = new ttypes.Work(); work.op = ttypes.Operation.DIVIDE; work.num1 = 1; work.num2 = 0; -client.calculate(1, work, function(err, message) { +client.calculate(1, work, function (err, message) { if (err) { console.log("InvalidOperation " + err); } else { - console.log('Whoa? You know how to divide by zero?'); + console.log("Whoa? You know how to divide by zero?"); } }); @@ -65,11 +62,11 @@ work.op = ttypes.Operation.SUBTRACT; work.num1 = 15; work.num2 = 10; -client.calculate(1, work, function(err, message) { - console.log('15-10=' + message); +client.calculate(1, work, function (err, message) { + console.log("15-10=" + message); - client.getStruct(1, function(err, message){ - console.log('Check log: ' + message.value); + client.getStruct(1, function (err, message) { + console.log("Check log: " + message.value); //close the connection once we're done connection.end(); diff --git a/tutorial/nodejs/NodeClientPromise.js b/tutorial/nodejs/NodeClientPromise.js index e6ff2d7f42c..0ba5f4f005f 100644 --- a/tutorial/nodejs/NodeClientPromise.js +++ b/tutorial/nodejs/NodeClientPromise.js @@ -17,64 +17,62 @@ * under the License. */ -var thrift = require('thrift'); -var Calculator = require('./gen-nodejs/Calculator'); -var ttypes = require('./gen-nodejs/tutorial_types'); -const assert = require('assert'); +var thrift = require("thrift"); +var Calculator = require("./gen-nodejs/Calculator"); +var ttypes = require("./gen-nodejs/tutorial_types"); +const assert = require("assert"); var transport = thrift.TBufferedTransport; var protocol = thrift.TBinaryProtocol; var connection = thrift.createConnection("localhost", 9090, { - transport : transport, - protocol : protocol + transport: transport, + protocol: protocol, }); -connection.on('error', function(err) { +connection.on("error", function (err) { assert(false, err); }); // Create a Calculator client with the connection var client = thrift.createClient(Calculator, connection); +client.ping().then(function () { + console.log("ping()"); +}); -client.ping() - .then(function() { - console.log('ping()'); - }); - -client.add(1,1) - .then(function(response) { - console.log("1+1=" + response); - }); +client.add(1, 1).then(function (response) { + console.log("1+1=" + response); +}); work = new ttypes.Work(); work.op = ttypes.Operation.DIVIDE; work.num1 = 1; work.num2 = 0; -client.calculate(1, work) - .then(function(message) { - console.log('Whoa? You know how to divide by zero?'); +client + .calculate(1, work) + .then(function (message) { + console.log("Whoa? You know how to divide by zero?"); }) - .catch(function(err) { + .catch(function (err) { console.log("InvalidOperation " + err); }); - work.op = ttypes.Operation.SUBTRACT; work.num1 = 15; work.num2 = 10; -client.calculate(1, work) - .then(function(value) { - console.log('15-10=' + value); - return client.getStruct(1); +client + .calculate(1, work) + .then(function (value) { + console.log("15-10=" + value); + return client.getStruct(1); }) - .then(function(message) { - console.log('Check log: ' + message.value); + .then(function (message) { + console.log("Check log: " + message.value); }) - .finally(function() { - //close the connection once we're done - connection.end(); + .finally(function () { + //close the connection once we're done + connection.end(); }); diff --git a/tutorial/nodejs/NodeServer.js b/tutorial/nodejs/NodeServer.js index 2e198825c10..5181e5128d2 100644 --- a/tutorial/nodejs/NodeServer.js +++ b/tutorial/nodejs/NodeServer.js @@ -25,17 +25,17 @@ var SharedStruct = require("./gen-nodejs/shared_types").SharedStruct; var data = {}; var server = thrift.createServer(Calculator, { - ping: function(result) { + ping: function (result) { console.log("ping()"); result(null); }, - add: function(n1, n2, result) { + add: function (n1, n2, result) { console.log("add(", n1, ",", n2, ")"); result(null, n1 + n2); }, - calculate: function(logid, work, result) { + calculate: function (logid, work, result) { console.log("calculate(", logid, ",", work, ")"); var val = 0; @@ -49,7 +49,7 @@ var server = thrift.createServer(Calculator, { if (work.num2 === 0) { var x = new ttypes.InvalidOperation(); x.whatOp = work.op; - x.why = 'Cannot divide by 0'; + x.why = "Cannot divide by 0"; result(x); return; } @@ -57,28 +57,27 @@ var server = thrift.createServer(Calculator, { } else { var x = new ttypes.InvalidOperation(); x.whatOp = work.op; - x.why = 'Invalid operation'; + x.why = "Invalid operation"; result(x); return; } var entry = new SharedStruct(); entry.key = logid; - entry.value = ""+val; + entry.value = "" + val; data[logid] = entry; result(null, val); }, - getStruct: function(key, result) { + getStruct: function (key, result) { console.log("getStruct(", key, ")"); result(null, data[key]); }, - zip: function() { + zip: function () { console.log("zip()"); - } - + }, }); server.listen(9090); diff --git a/tutorial/nodejs/NodeServerPromise.js b/tutorial/nodejs/NodeServerPromise.js index bff287b1823..ddd18f4990c 100644 --- a/tutorial/nodejs/NodeServerPromise.js +++ b/tutorial/nodejs/NodeServerPromise.js @@ -25,16 +25,16 @@ var SharedStruct = require("./gen-nodejs/shared_types").SharedStruct; var data = {}; var server = thrift.createServer(Calculator, { - ping: function() { + ping: function () { console.log("ping()"); }, - add: function(n1, n2) { + add: function (n1, n2) { console.log("add(", n1, ",", n2, ")"); return n1 + n2; }, - calculate: function(logid, work) { + calculate: function (logid, work) { console.log("calculate(", logid, ",", work, ")"); var val = 0; @@ -48,33 +48,32 @@ var server = thrift.createServer(Calculator, { if (work.num2 === 0) { var x = new ttypes.InvalidOperation(); x.whatOp = work.op; - x.why = 'Cannot divide by 0'; - throw x; + x.why = "Cannot divide by 0"; + throw x; } val = work.num1 / work.num2; } else { var x = new ttypes.InvalidOperation(); x.whatOp = work.op; - x.why = 'Invalid operation'; + x.why = "Invalid operation"; throw x; } var entry = new SharedStruct(); entry.key = logid; - entry.value = ""+val; + entry.value = "" + val; data[logid] = entry; return val; }, - getStruct: function(key) { + getStruct: function (key) { console.log("getStruct(", key, ")"); return data[key]; }, - zip: function() { + zip: function () { console.log("zip()"); - } - + }, }); server.listen(9090); From bdc43afc7929e35ac92a9a759121d49f6492850a Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 4 Mar 2025 00:42:56 +0100 Subject: [PATCH 216/430] Update LANGUAGES.md --- LANGUAGES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LANGUAGES.md b/LANGUAGES.md index ee772a7bfa1..ba02f1f9da6 100644 --- a/LANGUAGES.md +++ b/LANGUAGES.md @@ -127,7 +127,7 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr Delphi 0.8.0 -2010Alexandria 11.2 +2010Athens 12.2 Yes Yes YesYes @@ -139,7 +139,7 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr .NET Standard 0.13.0 Yes -.NET Standard 2.x, .NET 6 +.NET Standard 2.x, net8, net9 Yes YesYesYesYes YesYes From 1075010915ee9638e22b33a11ea37b55699e267b Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 4 Mar 2025 00:50:15 +0100 Subject: [PATCH 217/430] Update LANGUAGES.md --- LANGUAGES.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/LANGUAGES.md b/LANGUAGES.md index ba02f1f9da6..05e29475c41 100644 --- a/LANGUAGES.md +++ b/LANGUAGES.md @@ -1,6 +1,11 @@ # Apache Thrift Language Support # -Guidance For: 0.17.0 | +Guidance For: 0.22.0 | +[0.21.0](https://github.com/apache/thrift/blob/v0.21.0/LANGUAGES.md) | +[0.20.0](https://github.com/apache/thrift/blob/v0.20.0/LANGUAGES.md) | +[0.19.0](https://github.com/apache/thrift/blob/v0.19.0/LANGUAGES.md) | +[0.18.0](https://github.com/apache/thrift/blob/v0.18.0/LANGUAGES.md) | +[0.17.0](https://github.com/apache/thrift/blob/v0.17.0/LANGUAGES.md) | [0.16.0](https://github.com/apache/thrift/blob/v0.16.0/LANGUAGES.md) | [0.15.0](https://github.com/apache/thrift/blob/v0.15.0/LANGUAGES.md) | [0.14.0](https://github.com/apache/thrift/blob/v0.14.0/LANGUAGES.md) | @@ -129,14 +134,14 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr 2010Athens 12.2 Yes -Yes +YesYesYesYes YesYes YesYesYesYes Yes Delphi -.NET Standard +.NET 0.13.0 Yes .NET Standard 2.x, net8, net9 @@ -145,7 +150,7 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr YesYes YesYesYesYes Yes -.NET Standard +.NET Erlang From 6e380306ef48af4050a61f2f91b3c8380d8e78fb Mon Sep 17 00:00:00 2001 From: Vitaly Zdanevich Date: Sat, 1 Mar 2025 09:29:48 +0400 Subject: [PATCH 218/430] http.client.HTTPSConnection: drop key_file, cert_file Because remove in Python 3.12 https://docs.python.org/3/whatsnew/3.12.html#others --- lib/py/src/transport/THttpClient.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/py/src/transport/THttpClient.py b/lib/py/src/transport/THttpClient.py index d545ce56d1f..cda5f83d462 100644 --- a/lib/py/src/transport/THttpClient.py +++ b/lib/py/src/transport/THttpClient.py @@ -111,8 +111,6 @@ def open(self): timeout=self.__timeout) elif self.scheme == 'https': self.__http = http.client.HTTPSConnection(self.host, self.port, - key_file=self.keyfile, - cert_file=self.certfile, timeout=self.__timeout, context=self.context) if self.using_proxy(): From fdaca5ec85540eb81c574c178ac777f069b641eb Mon Sep 17 00:00:00 2001 From: Cameron Martin Date: Tue, 7 Jan 2025 15:25:15 +0000 Subject: [PATCH 219/430] Upgrade typescript Client: nodejs Patch: Cameron Martin Typescript was on a really old version, and upgrading this is necessary for future changes. Upgrading this required upgrading `@types/node` and `commander`, since the old versions of these are not compatible with the newer version of typescript. This closes #3084 --- LANGUAGES.md | 2 +- lib/nodejs/test/client.js | 33 +++++++------ .../episodic-code-generation-test/client.js | 7 +-- .../episodic-code-generation-test/server.js | 5 +- lib/nodejs/test/server.js | 25 +++++----- lib/nodets/test/client.ts | 11 +++-- lib/nodets/test/server.ts | 24 +++++----- lib/ts/package-lock.json | 27 +++++++---- lib/ts/package.json | 2 +- package-lock.json | 48 ++++++++++++------- package.json | 6 +-- 11 files changed, 106 insertions(+), 84 deletions(-) diff --git a/LANGUAGES.md b/LANGUAGES.md index 05e29475c41..eca3dfba3f8 100644 --- a/LANGUAGES.md +++ b/LANGUAGES.md @@ -252,7 +252,7 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr node.ts 0.12.0 Yes -3.1.6 +5.7.2 YesYes diff --git a/lib/nodejs/test/client.js b/lib/nodejs/test/client.js index 1d137fff51a..617039b2413 100644 --- a/lib/nodejs/test/client.js +++ b/lib/nodejs/test/client.js @@ -29,7 +29,7 @@ const ThriftTestDriverPromise = require("./test_driver").ThriftTestDriverPromise; const SecondService = require(`./${helpers.genPath}/SecondService`); -const program = require("commander"); +const { program } = require("commander"); program .option( @@ -49,7 +49,7 @@ program .option("--ssl", "use SSL transport") .option("--callback", "test with callback style functions") .option( - "-t, --type ", + "--type ", "Select server type (http|multiplex|tcp|websocket)", "tcp", ) @@ -57,26 +57,27 @@ program .option("--es5", "Use es5 code") .parse(process.argv); -const host = program.host; -const port = program.port; -const domainSocket = program.domainSocket; -const ssl = program.ssl; -let type = program.type; +const opts = program.opts(); +const host = opts.host; +const port = opts.port; +const domainSocket = opts.domainSocket; +const ssl = opts.ssl; +let type = opts.type; /* for compatibility with cross test invocation for http transport testing */ -if (program.transport === "http") { - program.transport = "buffered"; +if (opts.transport === "http") { + opts.transport = "buffered"; type = "http"; } -if (program.transport === "websocket") { - program.transport = "buffered"; +if (opts.transport === "websocket") { + opts.transport = "buffered"; type = "websocket"; } const options = { - transport: helpers.transports[program.transport], - protocol: helpers.protocols[program.protocol], + transport: helpers.transports[opts.transport], + protocol: helpers.protocols[opts.protocol], }; if (type === "http" || type === "websocket") { @@ -101,10 +102,8 @@ if (ssl) { let connection; let client; -const testDriver = program.callback - ? ThriftTestDriver - : ThriftTestDriverPromise; -if (helpers.ecmaMode === "es6" && program.callback) { +const testDriver = opts.callback ? ThriftTestDriver : ThriftTestDriverPromise; +if (helpers.ecmaMode === "es6" && opts.callback) { console.log("ES6 does not support callback style"); process.exit(0); } diff --git a/lib/nodejs/test/episodic-code-generation-test/client.js b/lib/nodejs/test/episodic-code-generation-test/client.js index 631bfe73a7e..cf014c26354 100644 --- a/lib/nodejs/test/episodic-code-generation-test/client.js +++ b/lib/nodejs/test/episodic-code-generation-test/client.js @@ -22,7 +22,7 @@ const assert = require("assert"); const test = require("tape"); const thrift = require("thrift"); -const program = require("commander"); +const { program } = require("commander"); program .option("--host ", "Set the thrift server host to connect", "localhost") @@ -32,8 +32,9 @@ program const Service = require("./gen-2/second-episode/gen-nodejs/Service"); const Types = require("types-package/first-episode/Types_types"); -const host = program.host; -const port = program.port; +const opts = program.opts(); +const host = opts.host; +const port = opts.port; const options = { transport: thrift.TBufferedTransport, diff --git a/lib/nodejs/test/episodic-code-generation-test/server.js b/lib/nodejs/test/episodic-code-generation-test/server.js index feca38045d9..2b9a96d0cac 100644 --- a/lib/nodejs/test/episodic-code-generation-test/server.js +++ b/lib/nodejs/test/episodic-code-generation-test/server.js @@ -20,7 +20,7 @@ */ const thrift = require("../../lib/thrift"); -const program = require("commander"); +const { program } = require("commander"); program .option("--port ", "Set the thrift server port", 9090) @@ -29,7 +29,8 @@ program const Service = require("./gen-2/second-episode/gen-nodejs/Service"); const Types = require("types-package/first-episode/Types_types"); -const port = program.port; +const opts = program.opts(); +const port = opts.port; const options = { transport: thrift.TBufferedTransport, diff --git a/lib/nodejs/test/server.js b/lib/nodejs/test/server.js index c8e7808202a..b56bea7add5 100644 --- a/lib/nodejs/test/server.js +++ b/lib/nodejs/test/server.js @@ -22,7 +22,7 @@ const fs = require("fs"); const path = require("path"); const thrift = require("../lib/thrift"); -const program = require("commander"); +const { program } = require("commander"); const helpers = require("./helpers"); program @@ -40,7 +40,7 @@ program .option("--port ", "Set thrift server port", 9090) .option("--domain-socket ", "Set thift server unix domain socket") .option( - "-t, --type ", + "--type ", "Select server type (http|multiplex|tcp|websocket)", "tcp", ) @@ -53,22 +53,23 @@ const ThriftTest = require(`./${helpers.genPath}/ThriftTest`); const SecondService = require(`./${helpers.genPath}/SecondService`); const { ThriftTestHandler } = require("./test_handler"); -const port = program.port; -const domainSocket = program.domainSocket; -const ssl = program.ssl; +const opts = program.opts(); +const port = opts.port; +const domainSocket = opts.domainSocket; +const ssl = opts.ssl; -let type = program.type; -if (program.transport === "http") { - program.transport = "buffered"; +let type = opts.type; +if (opts.transport === "http") { + opts.transport = "buffered"; type = "http"; -} else if (program.transport === "websocket") { - program.transport = "buffered"; +} else if (opts.transport === "websocket") { + opts.transport = "buffered"; type = "websocket"; } let options = { - transport: helpers.transports[program.transport], - protocol: helpers.protocols[program.protocol], + transport: helpers.transports[opts.transport], + protocol: helpers.protocols[opts.protocol], }; if (type === "http" || type === "websocket") { diff --git a/lib/nodets/test/client.ts b/lib/nodets/test/client.ts index a95567f8dc3..c2666bc0d86 100644 --- a/lib/nodets/test/client.ts +++ b/lib/nodets/test/client.ts @@ -25,17 +25,18 @@ import test_driver = require("./test_driver"); import ThriftTestDriver = test_driver.ThriftTestDriver; import ThriftTestDriverPromise = test_driver.ThriftTestDriverPromise; -// var program = require("commander"); -import * as program from "commander"; +import { program } from "commander"; program - .option("--port ", "Set thrift server port number to connect", 9090) + .option("--port ", "Set thrift server port number to connect", Number.parseInt, 9090) .option("--promise", "test with promise style functions") .option("--protocol", "Set thrift protocol (binary) [protocol]") .parse(process.argv); -var port: number = program.port; -var promise = program.promise; + +var opts = program.opts(); +var port: number = opts.port; +var promise = opts.promise; var options = { transport: Thrift.TBufferedTransport, diff --git a/lib/nodets/test/server.ts b/lib/nodets/test/server.ts index 79457ce99aa..59113840a41 100644 --- a/lib/nodets/test/server.ts +++ b/lib/nodets/test/server.ts @@ -1,15 +1,17 @@ import thrift = require("thrift"); -var program = require("commander"); -import ThriftTest = require("./gen-nodejs/ThriftTest"); -import test_handler = require("./test_handler"); +import { program } from 'commander'; +import ThriftTest = require('./gen-nodejs/ThriftTest'); +import test_handler = require('./test_handler'); + program - .option("--port ", "Set thrift server port", 9090) - .option("--promise", "test with promise style functions") - .option("--protocol", '"Set thrift protocol (binary) [protocol]"') + .option('--port ', 'Set thrift server port', Number.parseInt, 9090) + .option('--promise', 'test with promise style functions') + .option('--protocol', '"Set thrift protocol (binary) [protocol]"') .parse(process.argv); -var port: number = program.port; +var opts = program.opts(); +var port: number = opts.port; var options: thrift.ServerOptions = { transport: thrift.TBufferedTransport, @@ -17,12 +19,8 @@ var options: thrift.ServerOptions = { }; var server: thrift.Server; -if (program.promise) { - server = thrift.createServer( - ThriftTest.Processor, - new test_handler.AsyncThriftTestHandler(), - options, - ); +if (opts.promise) { + server = thrift.createServer(ThriftTest.Processor, new test_handler.AsyncThriftTestHandler(), options); } else { server = thrift.createServer( ThriftTest.Processor, diff --git a/lib/ts/package-lock.json b/lib/ts/package-lock.json index 244d91d7655..97400009484 100644 --- a/lib/ts/package-lock.json +++ b/lib/ts/package-lock.json @@ -31,7 +31,7 @@ "jslint": "^0.12.0", "node-int64": "^0.4.0", "phantom": "^6.0.3", - "typescript": "^3.2.4" + "typescript": "^5.7.2" } }, "node_modules/@babel/parser": { @@ -85,10 +85,13 @@ "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==" }, "node_modules/@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", - "dev": true + "version": "22.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", + "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.20.0" + } }, "node_modules/@types/node-int64": { "version": "0.4.29", @@ -4631,16 +4634,16 @@ "dev": true }, "node_modules/typescript": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", - "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/uc.micro": { @@ -4729,6 +4732,12 @@ "node": "*" } }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + }, "node_modules/uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", diff --git a/lib/ts/package.json b/lib/ts/package.json index 13aefaabf6a..17988c6a4a0 100644 --- a/lib/ts/package.json +++ b/lib/ts/package.json @@ -27,7 +27,7 @@ "jslint": "^0.12.0", "node-int64": "^0.4.0", "phantom": "^6.0.3", - "typescript": "^3.2.4" + "typescript": "^5.7.2" }, "dependencies": { "bufferutil": "^4.0.1", diff --git a/package-lock.json b/package-lock.json index 9b7db5c87d0..701dd076b71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,11 +17,11 @@ }, "devDependencies": { "@eslint/js": "^9.18.0", - "@types/node": "^10.12.6", + "@types/node": "^22.10.5", "@types/node-int64": "^0.4.29", "@types/q": "^1.5.1", "buffer-equals": "^1.0.4", - "commander": "^2.14.1", + "commander": "^13.0.0", "connect": "^3.6.6", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", @@ -33,7 +33,7 @@ "nyc": "^15.0.0", "prettier": "^3.4.2", "tape": "^4.9.0", - "typescript": "^3.1.6", + "typescript": "^5.7.2", "utf-8-validate": "^5.0.0" }, "engines": { @@ -718,15 +718,18 @@ "dev": true }, "node_modules/@types/node": { - "version": "10.12.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.6.tgz", - "integrity": "sha512-+ZWB5Ec1iki99xQFzBlivlKxSZQ+fuUKBott8StBOnLN4dWbRHlgdg1XknpW6g0tweniN5DcOqA64CJyOUPSAw==", - "dev": true + "version": "22.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", + "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.20.0" + } }, "node_modules/@types/node-int64": { - "version": "0.4.29", - "resolved": "https://registry.npmjs.org/@types/node-int64/-/node-int64-0.4.29.tgz", - "integrity": "sha512-rHXvenLTj/CcsmNAebaBOhxQ2MqEGl3yXZZcZ21XYR+gzGTTcpOy2N4IxpvTCz48loyQNatHvfn6GhIbbZ1R3Q==", + "version": "0.4.32", + "resolved": "https://registry.npmjs.org/@types/node-int64/-/node-int64-0.4.32.tgz", + "integrity": "sha512-xf/JsSlnXQ+mzvc0IpXemcrO4BrCfpgNpMco+GLcXkFk01k/gW9lGJu+Vof0ZSvHK6DsHJDPSbjFPs36QkWXqw==", "dev": true, "dependencies": { "@types/node": "*" @@ -1073,10 +1076,13 @@ } }, "node_modules/commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.0.0.tgz", + "integrity": "sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ==", + "dev": true, + "engines": { + "node": ">=18" + } }, "node_modules/commondir": { "version": "1.0.1", @@ -3568,16 +3574,16 @@ } }, "node_modules/typescript": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz", - "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/uc.micro": { @@ -3592,6 +3598,12 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index 6ed792df260..c86c155689e 100644 --- a/package.json +++ b/package.json @@ -44,11 +44,11 @@ }, "devDependencies": { "@eslint/js": "^9.18.0", - "@types/node": "^10.12.6", + "@types/node": "^22.10.5", "@types/node-int64": "^0.4.29", "@types/q": "^1.5.1", "buffer-equals": "^1.0.4", - "commander": "^2.14.1", + "commander": "^13.0.0", "connect": "^3.6.6", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", @@ -60,7 +60,7 @@ "nyc": "^15.0.0", "prettier": "^3.4.2", "tape": "^4.9.0", - "typescript": "^3.1.6", + "typescript": "^5.7.2", "utf-8-validate": "^5.0.0" }, "scripts": { From aee3f637bef38f69b6b52140bca6448d1f617633 Mon Sep 17 00:00:00 2001 From: Carel Combrink Date: Thu, 5 Sep 2024 18:26:42 +0000 Subject: [PATCH 220/430] THRIFT-5817: [C++] Avoid copy of TUuid Client: cpp Patch: Carel Combrink This closes #3038 --- compiler/cpp/src/thrift/generate/t_cpp_generator.cc | 9 ++++++--- lib/c_glib/test/testthrifttestclient.cpp | 4 ++-- lib/c_glib/test/testthrifttestzlibclient.cpp | 8 ++++---- test/cpp/src/TestClient.cpp | 4 +++- test/cpp/src/TestServer.cpp | 9 +++++---- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc index c0767c33ec0..5777b278421 100644 --- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc @@ -274,9 +274,12 @@ class t_cpp_generator : public t_oop_generator { bool is_complex_type(t_type* ttype) { ttype = get_true_type(ttype); - return ttype->is_container() || ttype->is_struct() || ttype->is_xception() + return ttype->is_container() // + || ttype->is_struct() // + || ttype->is_xception() || (ttype->is_base_type() - && (((t_base_type*)ttype)->get_base() == t_base_type::TYPE_STRING)); + && ((((t_base_type*)ttype)->get_base() == t_base_type::TYPE_STRING) + || (((t_base_type*)ttype)->get_base() == t_base_type::TYPE_UUID))); } void set_use_include_prefix(bool use_include_prefix) { use_include_prefix_ = use_include_prefix; } @@ -4498,7 +4501,7 @@ string t_cpp_generator::type_name(t_type* ttype, bool in_typedef, bool arg) { return bname; } - if (((t_base_type*)ttype)->get_base() == t_base_type::TYPE_STRING) { + if ((((t_base_type*)ttype)->get_base() == t_base_type::TYPE_STRING) || ((((t_base_type*)ttype)->get_base() == t_base_type::TYPE_UUID))) { return "const " + bname + "&"; } else { return "const " + bname; diff --git a/lib/c_glib/test/testthrifttestclient.cpp b/lib/c_glib/test/testthrifttestclient.cpp index 513f0712b52..745feb786c0 100644 --- a/lib/c_glib/test/testthrifttestclient.cpp +++ b/lib/c_glib/test/testthrifttestclient.cpp @@ -112,9 +112,9 @@ class TestHandler : public ThriftTestIf { out = thing; } - apache::thrift::TUuid testUuid(const apache::thrift::TUuid thing) override { + void testUuid(apache::thrift::TUuid& out, const apache::thrift::TUuid& thing) override { cout << "[C -> C++] testUuid(\"" << thing << "\")" << '\n'; - return thing; + out = thing; } void testStruct(Xtruct& out, const Xtruct &thing) override { diff --git a/lib/c_glib/test/testthrifttestzlibclient.cpp b/lib/c_glib/test/testthrifttestzlibclient.cpp index dbcd64e76a6..783d06550a2 100644 --- a/lib/c_glib/test/testthrifttestzlibclient.cpp +++ b/lib/c_glib/test/testthrifttestzlibclient.cpp @@ -107,9 +107,9 @@ class TestHandler : public ThriftTestIf { out = thing; } - apache::thrift::TUuid testUuid(const apache::thrift::TUuid thing) override { + void testUuid(apache::thrift::TUuid& out, const apache::thrift::TUuid& thing) override { cout << "[C -> C++] testUuid(\"" << thing << "\")" << '\n'; - return thing; + out = thing; } void testStruct(Xtruct& out, const Xtruct &thing) override { @@ -297,7 +297,7 @@ class TestHandler : public ThriftTestIf { } void testException(const std::string &arg) - throw(Xception, apache::thrift::TException) override + noexcept(false) override { cout << "[C -> C++] testException(" << arg << ")" << '\n'; if (arg.compare("Xception") == 0) { @@ -315,7 +315,7 @@ class TestHandler : public ThriftTestIf { } } - void testMultiException(Xtruct &result, const std::string &arg0, const std::string &arg1) throw(Xception, Xception2) override { + void testMultiException(Xtruct &result, const std::string &arg0, const std::string &arg1) noexcept(false) override { cout << "[C -> C++] testMultiException(" << arg0 << ", " << arg1 << ")" << '\n'; diff --git a/test/cpp/src/TestClient.cpp b/test/cpp/src/TestClient.cpp index 6bda29431ef..64193c657c6 100644 --- a/test/cpp/src/TestClient.cpp +++ b/test/cpp/src/TestClient.cpp @@ -181,7 +181,9 @@ bool print_eq(T expected, T actual) { #define UUID_TEST(func, value, expected) \ cout << #func "(" << value << ") = "; \ try { \ - if (!print_eq(expected, testClient.func(value))) \ + TUuid ret; \ + testClient.func(ret, value); \ + if (!print_eq(expected, ret)) \ return_code |= ERR_BASETYPES; \ } catch (TTransportException&) { \ throw; \ diff --git a/test/cpp/src/TestServer.cpp b/test/cpp/src/TestServer.cpp index dc6e69f6f0d..858fffa3852 100644 --- a/test/cpp/src/TestServer.cpp +++ b/test/cpp/src/TestServer.cpp @@ -132,9 +132,9 @@ class TestHandler : public ThriftTestIf { _return = thing; } - TUuid testUuid(const TUuid thing) override { + void testUuid(apache::thrift::TUuid& _return, const apache::thrift::TUuid& thing) override { printf("testUuid(\"{%s}\")\n", to_string(thing).c_str()); - return thing; + _return = thing; } void testStruct(Xtruct& out, const Xtruct& thing) override { @@ -447,8 +447,9 @@ class TestHandlerAsync : public ThriftTestCobSvIf { cob(res); } - void testUuid(::std::function cob, const TUuid thing) override { - TUuid res = _delegate->testUuid(thing); + void testUuid(::std::function cob, const apache::thrift::TUuid& thing) override { + TUuid res; + _delegate->testUuid(res, thing); cob(res); } From 21ed4a2f690fb8547593c64df376b97a877b1675 Mon Sep 17 00:00:00 2001 From: Cameron Martin Date: Mon, 22 Apr 2024 11:08:19 +0100 Subject: [PATCH 221/430] THRIFT-5811: Add ESM support to nodejs codegen Client: nodejs Patch: Cameron Martin This closes #3083 This adds a flag to the JS generator to output ES modules instead of CommonJS. This is only valid when targeting node. A lot of the changes here are to test this. The `testAll.sh` script now generates an ES module version of the services and types, and tests the client and the server with these. This has a few knock-on effects. Firstly, any module that imports a generated ES module must itself be an ES module, since CommonJS modules cannot import ES modules. ES modules also do not support `NODE_PATH`, so instead the tests directory is converted into a node package with a `file:` dependency on the root thrift package. --- .../cpp/src/thrift/generate/t_js_generator.cc | 165 ++++++++++++------ eslint.config.mjs | 8 +- lib/nodejs/Makefile.am | 7 +- lib/nodejs/test/binary.test.js | 2 +- lib/nodejs/test/{client.js => client.mjs} | 23 +-- lib/nodejs/test/helpers.js | 39 ++++- lib/nodejs/test/include.test.mjs | 18 ++ lib/nodejs/test/package-lock.json | 52 ++++++ lib/nodejs/test/package.json | 5 + lib/nodejs/test/{server.js => server.mjs} | 25 +-- .../test/{test-cases.js => test-cases.mjs} | 45 ++--- lib/nodejs/test/testAll.sh | 28 +-- .../test/{test_driver.js => test_driver.mjs} | 21 ++- .../{test_handler.js => test_handler.mjs} | 10 +- 14 files changed, 319 insertions(+), 129 deletions(-) rename lib/nodejs/test/{client.js => client.mjs} (90%) create mode 100644 lib/nodejs/test/include.test.mjs create mode 100644 lib/nodejs/test/package-lock.json create mode 100644 lib/nodejs/test/package.json rename lib/nodejs/test/{server.js => server.mjs} (84%) rename lib/nodejs/test/{test-cases.js => test-cases.mjs} (85%) rename lib/nodejs/test/{test_driver.js => test_driver.mjs} (96%) rename lib/nodejs/test/{test_handler.js => test_handler.mjs} (95%) diff --git a/compiler/cpp/src/thrift/generate/t_js_generator.cc b/compiler/cpp/src/thrift/generate/t_js_generator.cc index 27240e4f0b5..402ff50da58 100644 --- a/compiler/cpp/src/thrift/generate/t_js_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_js_generator.cc @@ -68,6 +68,7 @@ class t_js_generator : public t_oop_generator { gen_jquery_ = false; gen_ts_ = false; gen_es6_ = false; + gen_esm_ = false; gen_episode_file_ = false; bool with_ns_ = false; @@ -83,6 +84,8 @@ class t_js_generator : public t_oop_generator { with_ns_ = true; } else if( iter->first.compare("es6") == 0) { gen_es6_ = true; + } else if ( iter->first.compare("esm") == 0) { + gen_esm_ = true; } else if( iter->first.compare("imports") == 0) { parse_imports(program, iter->second); } else if (iter->first.compare("thrift_package_output_directory") == 0) { @@ -105,6 +108,10 @@ class t_js_generator : public t_oop_generator { throw std::invalid_argument("invalid switch: [-gen js:with_ns] is only valid when using node.js"); } + if (!gen_node_ && gen_esm_) { + throw std::invalid_argument("invalid switch: [-gen js:esm] is only valid when using node.js"); + } + // Depending on the processing flags, we will update these to be ES6 compatible js_const_type_ = "var "; js_let_type_ = "var "; @@ -278,13 +285,6 @@ class t_js_generator : public t_oop_generator { return js_namespace(p); } - std::string js_export_namespace(t_program* p) { - if (gen_node_) { - return "exports."; - } - return js_namespace(p); - } - bool has_js_namespace(t_program* p) { if (no_ns_) { return false; @@ -374,6 +374,11 @@ class t_js_generator : public t_oop_generator { */ bool gen_es6_; + /** + * True if we should generate ES modules, instead of CommonJS. + */ + bool gen_esm_; + /** * True if we will generate an episode file. */ @@ -452,7 +457,7 @@ void t_js_generator::init_generator() { f_episode_.open(f_episode_file_path); } - const auto f_types_name = outdir + program_->get_name() + "_types.js"; + const auto f_types_name = outdir + program_->get_name() + "_types" + (gen_esm_ ? ".mjs" : ".js"); f_types_.open(f_types_name.c_str()); if (gen_episode_file_) { const auto types_module = program_->get_name() + "_types"; @@ -478,7 +483,13 @@ void t_js_generator::init_generator() { } if (gen_node_) { - f_types_ << js_const_type_ << "ttypes = module.exports = {};" << '\n'; + if (gen_esm_) { + // Import the current module, so we can reference it as ttypes. This is + // fine in ESM, because it allows circular imports. + f_types_ << "import * as ttypes from './" + program_->get_name() + "_types.mjs';" << '\n'; + } else { + f_types_ << js_const_type_ << "ttypes = module.exports = {};" << '\n'; + } } string pns; @@ -507,12 +518,26 @@ void t_js_generator::init_generator() { */ string t_js_generator::js_includes() { if (gen_node_) { - string result = js_const_type_ + "thrift = require('thrift');\n" - + js_const_type_ + "Thrift = thrift.Thrift;\n"; + string result; + + if (gen_esm_) { + result += "import { Thrift } from 'thrift';\n"; + } else { + result += js_const_type_ + "thrift = require('thrift');\n" + + js_const_type_ + "Thrift = thrift.Thrift;\n"; + } if (!gen_es6_) { - result += js_const_type_ + "Q = thrift.Q;\n"; + if (gen_esm_) { + result += "import { Q } from 'thrift';\n"; + } else { + result += js_const_type_ + "Q = thrift.Q;\n"; + } + } + if (gen_esm_) { + result += "import Int64 from 'node-int64';"; + } else { + result += js_const_type_ + "Int64 = require('node-int64');\n"; } - result += js_const_type_ + "Int64 = require('node-int64');\n"; return result; } string result = "if (typeof Int64 === 'undefined' && typeof require === 'function') {\n " + js_const_type_ + "Int64 = require('node-int64');\n}\n"; @@ -556,7 +581,11 @@ string t_js_generator::render_includes() { if (gen_node_) { const vector& includes = program_->get_includes(); for (auto include : includes) { - result += js_const_type_ + make_valid_nodeJs_identifier(include->get_name()) + "_ttypes = require('" + get_import_path(include) + "');\n"; + if (gen_esm_) { + result += "import * as " + make_valid_nodeJs_identifier(include->get_name()) + "_ttypes from '" + get_import_path(include) + "';\n"; + } else { + result += js_const_type_ + make_valid_nodeJs_identifier(include->get_name()) + "_ttypes = require('" + get_import_path(include) + "');\n"; + } } if (includes.size() > 0) { result += "\n"; @@ -590,17 +619,17 @@ string t_js_generator::render_ts_includes() { string t_js_generator::get_import_path(t_program* program) { const string import_file_name(program->get_name() + "_types"); + const string import_file_name_with_extension = import_file_name + (gen_esm_ ? ".mjs" : ".js"); + if (program->get_recursive()) { - return "./" + import_file_name; + return "./" + import_file_name_with_extension; } - const string import_file_name_with_extension = import_file_name + ".js"; - - auto module_name_and_import_path_iterator = module_name_2_import_path.find(import_file_name); - if (module_name_and_import_path_iterator != module_name_2_import_path.end()) { - return module_name_and_import_path_iterator->second; - } - return "./" + import_file_name; + auto module_name_and_import_path_iterator = module_name_2_import_path.find(import_file_name); + if (module_name_and_import_path_iterator != module_name_2_import_path.end()) { + return module_name_and_import_path_iterator->second; + } + return "./" + import_file_name_with_extension; } /** @@ -638,7 +667,11 @@ void t_js_generator::generate_typedef(t_typedef* ttypedef) { * @param tenum The enumeration */ void t_js_generator::generate_enum(t_enum* tenum) { - f_types_ << js_type_namespace(tenum->get_program()) << tenum->get_name() << " = {" << '\n'; + if (gen_esm_) { + f_types_ << "export const " << tenum->get_name() << " = {" << '\n'; + } else { + f_types_ << js_type_namespace(tenum->get_program()) << tenum->get_name() << " = {" << '\n'; + } if (gen_ts_) { f_types_ts_ << ts_print_doc(tenum) << ts_indent() << ts_declare() << "enum " @@ -680,7 +713,11 @@ void t_js_generator::generate_const(t_const* tconst) { string name = tconst->get_name(); t_const_value* value = tconst->get_value(); - f_types_ << js_type_namespace(program_) << name << " = "; + if (gen_esm_) { + f_types_ << "export const " << name << " = "; + } else { + f_types_ << js_type_namespace(program_) << name << " = "; + } f_types_ << render_const_value(type, value) << ";" << '\n'; if (gen_ts_) { @@ -859,9 +896,18 @@ void t_js_generator::generate_js_struct_definition(ostream& out, vector::const_iterator m_iter; if (gen_node_) { + string commonjs_export = ""; + + if (is_exported) { + if (gen_esm_) { + out << "export "; + } else { + commonjs_export = " = module.exports." + tstruct->get_name(); + } + } + string prefix = has_js_namespace(tstruct->get_program()) ? js_namespace(tstruct->get_program()) : js_const_type_; - out << prefix << tstruct->get_name() << - (is_exported ? " = module.exports." + tstruct->get_name() : ""); + out << prefix << tstruct->get_name() << commonjs_export; if (gen_ts_) { f_types_ts_ << ts_print_doc(tstruct) << ts_indent() << ts_declare() << "class " << tstruct->get_name() << (is_exception ? " extends Thrift.TException" : "") @@ -1198,7 +1244,7 @@ void t_js_generator::generate_js_struct_writer(ostream& out, t_struct* tstruct) * @param tservice The service definition */ void t_js_generator::generate_service(t_service* tservice) { - string f_service_name = get_out_dir() + service_name_ + ".js"; + string f_service_name = get_out_dir() + service_name_ + (gen_esm_ ? ".mjs" : ".js"); f_service_.open(f_service_name.c_str()); if (gen_episode_file_) { f_episode_ << service_name_ << ":" << thrift_package_output_directory_ << "/" << service_name_ << '\n'; @@ -1282,7 +1328,11 @@ void t_js_generator::generate_service(t_service* tservice) { << tservice->get_extends()->get_name() << "');" << '\n'; } - f_service_ << js_const_type_ << "ttypes = require('./" + program_->get_name() + "_types');" << '\n'; + if (gen_esm_) { + f_service_ << "import * as ttypes from './" + program_->get_name() + "_types.mjs';" << '\n'; + } else { + f_service_ << js_const_type_ << "ttypes = require('./" + program_->get_name() + "_types');" << '\n'; + } } generate_service_helpers(tservice); @@ -1317,27 +1367,28 @@ void t_js_generator::generate_service_processor(t_service* tservice) { vector functions = tservice->get_functions(); vector::iterator f_iter; - if (gen_node_) { - string prefix = has_js_namespace(tservice->get_program()) ? js_namespace(tservice->get_program()) : js_const_type_; - f_service_ << prefix << service_name_ << "Processor = " << "exports.Processor"; - if (gen_ts_) { - f_service_ts_ << '\n' << "declare class Processor "; - if (tservice->get_extends() != nullptr) { - f_service_ts_ << "extends " << tservice->get_extends()->get_name() << ".Processor "; - } - f_service_ts_ << "{" << '\n'; - indent_up(); + std::string service_var; + if (!gen_node_ || has_js_namespace(tservice->get_program())) { + service_var = js_namespace(tservice->get_program()) + service_name_ + "Processor"; + f_service_ << service_var; + } else { + service_var = service_name_ + "Processor"; + f_service_ << js_const_type_ << service_var; + }; + if (gen_node_ && gen_ts_) { + f_service_ts_ << '\n' << "declare class Processor "; + if (tservice->get_extends() != nullptr) { + f_service_ts_ << "extends " << tservice->get_extends()->get_name() << ".Processor "; + } + f_service_ts_ << "{" << '\n'; + indent_up(); - if(tservice->get_extends() == nullptr) { - f_service_ts_ << ts_indent() << "private _handler: object;" << '\n' << '\n'; - } - f_service_ts_ << ts_indent() << "constructor(handler: object);" << '\n'; - f_service_ts_ << ts_indent() << "process(input: thrift.TProtocol, output: thrift.TProtocol): void;" << '\n'; - indent_down(); + if(tservice->get_extends() == nullptr) { + f_service_ts_ << ts_indent() << "private _handler: object;" << '\n' << '\n'; } - } else { - f_service_ << js_namespace(tservice->get_program()) << service_name_ << "Processor = " - << "exports.Processor"; + f_service_ts_ << ts_indent() << "constructor(handler: object);" << '\n'; + f_service_ts_ << ts_indent() << "process(input: thrift.TProtocol, output: thrift.TProtocol): void;" << '\n'; + indent_down(); } bool is_subclass_service = tservice->get_extends() != nullptr; @@ -1419,6 +1470,12 @@ void t_js_generator::generate_service_processor(t_service* tservice) { if (gen_node_ && gen_ts_) { f_service_ts_ << "}" << '\n'; } + + if(gen_esm_) { + f_service_ << "export { " << service_var << " as Processor };" << '\n'; + } else { + f_service_ << "exports.Processor = " << service_var << ";" << '\n'; + } } /** @@ -1702,9 +1759,10 @@ void t_js_generator::generate_service_client(t_service* tservice) { bool is_subclass_service = tservice->get_extends() != nullptr; + string client_var = js_namespace(tservice->get_program()) + service_name_ + "Client"; if (gen_node_) { - string prefix = has_js_namespace(tservice->get_program()) ? js_namespace(tservice->get_program()) : js_const_type_; - f_service_ << prefix << service_name_ << "Client = " << "exports.Client"; + string prefix = has_js_namespace(tservice->get_program()) ? "" : js_const_type_; + f_service_ << prefix << client_var; if (gen_ts_) { f_service_ts_ << ts_print_doc(tservice) << ts_indent() << ts_declare() << "class " << "Client "; @@ -1714,8 +1772,7 @@ void t_js_generator::generate_service_client(t_service* tservice) { f_service_ts_ << "{" << '\n'; } } else { - f_service_ << js_namespace(tservice->get_program()) << service_name_ - << "Client"; + f_service_ << client_var; if (gen_ts_) { f_service_ts_ << ts_print_doc(tservice) << ts_indent() << ts_declare() << "class " << service_name_ << "Client "; @@ -2204,6 +2261,12 @@ void t_js_generator::generate_service_client(t_service* tservice) { indent_down(); f_service_ << "};" << '\n'; } + + if(gen_esm_) { + f_service_ << "export { " << client_var << " as Client };" << '\n'; + } else if(gen_node_) { + f_service_ << "exports.Client = " << client_var << ";" << '\n'; + } } std::string t_js_generator::render_recv_throw(std::string var) { diff --git a/eslint.config.mjs b/eslint.config.mjs index a27b211ec7f..2f70a8824f0 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -24,7 +24,7 @@ export default [ ...globals.node, }, - ecmaVersion: 2017, + ecmaVersion: 2022, sourceType: "commonjs", }, @@ -41,4 +41,10 @@ export default [ ], }, }, + { + files: ["**/*.mjs"], + languageOptions: { + sourceType: "module", + }, + }, ]; diff --git a/lib/nodejs/Makefile.am b/lib/nodejs/Makefile.am index 9503f04c9e1..5be81615352 100644 --- a/lib/nodejs/Makefile.am +++ b/lib/nodejs/Makefile.am @@ -20,9 +20,14 @@ stubs: $(top_srcdir)/test/v0.16/ThriftTest.thrift $(THRIFT) --gen js:node -o test/ $(top_srcdir)/test/v0.16/ThriftTest.thrift -deps: $(top_srcdir)/package.json +deps-root: $(top_srcdir)/package.json $(NPM) install $(top_srcdir)/ || $(NPM) install $(top_srcdir)/ +deps-test: test/package.json test/package-lock.json + cd test/ && $(NPM) install && cd .. + +deps: deps-root deps-test + all-local: deps precross: deps stubs diff --git a/lib/nodejs/test/binary.test.js b/lib/nodejs/test/binary.test.js index 343d39a9923..1e749d8e3d5 100644 --- a/lib/nodejs/test/binary.test.js +++ b/lib/nodejs/test/binary.test.js @@ -18,7 +18,7 @@ */ const test = require("tape"); -const binary = require("thrift/binary"); +const binary = require("thrift/lib/nodejs/lib/thrift/binary"); const cases = { "Should read signed byte": function (assert) { diff --git a/lib/nodejs/test/client.js b/lib/nodejs/test/client.mjs similarity index 90% rename from lib/nodejs/test/client.js rename to lib/nodejs/test/client.mjs index 617039b2413..6200dc6c428 100644 --- a/lib/nodejs/test/client.js +++ b/lib/nodejs/test/client.mjs @@ -19,17 +19,19 @@ * under the License. */ -const assert = require("assert"); -const thrift = require("thrift"); -const helpers = require("./helpers"); +import assert from "assert"; +import thrift from "thrift"; +import helpers from "./helpers.js"; -const ThriftTest = require(`./${helpers.genPath}/ThriftTest`); -const ThriftTestDriver = require("./test_driver").ThriftTestDriver; -const ThriftTestDriverPromise = - require("./test_driver").ThriftTestDriverPromise; -const SecondService = require(`./${helpers.genPath}/SecondService`); +const ThriftTest = await import( + `./${helpers.genPath}/ThriftTest.${helpers.moduleExt}` +); +import { ThriftTestDriver, ThriftTestDriverPromise } from "./test_driver.mjs"; +const SecondService = await import( + `./${helpers.genPath}/SecondService.${helpers.moduleExt}` +); -const { program } = require("commander"); +import { program } from "commander"; program .option( @@ -55,6 +57,7 @@ program ) .option("--es6", "Use es6 code") .option("--es5", "Use es5 code") + .option("--esm", "Use es modules") .parse(process.argv); const opts = program.opts(); @@ -171,4 +174,4 @@ function runTests() { }); } -exports.expressoTest = function () {}; +export const expressoTest = function () {}; diff --git a/lib/nodejs/test/helpers.js b/lib/nodejs/test/helpers.js index 51a0523139e..1ece2f1dcb3 100644 --- a/lib/nodejs/test/helpers.js +++ b/lib/nodejs/test/helpers.js @@ -18,7 +18,7 @@ */ "use strict"; -const thrift = require("../lib/thrift"); +const thrift = require("thrift"); module.exports.transports = { buffered: thrift.TBufferedTransport, @@ -32,7 +32,36 @@ module.exports.protocols = { header: thrift.THeaderProtocol, }; -module.exports.ecmaMode = process.argv.includes("--es6") ? "es6" : "es5"; -module.exports.genPath = process.argv.includes("--es6") - ? "gen-nodejs-es6" - : "gen-nodejs"; +const variant = (function () { + if (process.argv.includes("--es6")) { + return "es6"; + } else if (process.argv.includes("--esm")) { + return "esm"; + } else { + return "es5"; + } +})(); + +module.exports.ecmaMode = ["esm", "es6"].includes(variant) ? "es6" : "es5"; +const genPath = (module.exports.genPath = (function () { + if (variant == "es5") { + return "gen-nodejs"; + } else { + return `gen-nodejs-${variant}`; + } +})()); + +const moduleExt = (module.exports.moduleExt = variant === "esm" ? "mjs" : "js"); + +/** + * Imports a types module, correctly handling the differences in esm and commonjs + */ +module.exports.importTypes = async function (filename) { + const typesModule = await import(`./${genPath}/${filename}.${moduleExt}`); + + if (variant === "esm") { + return typesModule; + } else { + return typesModule.default; + } +}; diff --git a/lib/nodejs/test/include.test.mjs b/lib/nodejs/test/include.test.mjs new file mode 100644 index 00000000000..70c7b242f6f --- /dev/null +++ b/lib/nodejs/test/include.test.mjs @@ -0,0 +1,18 @@ +import test from "tape"; +import { IncludeTest as IncludeTestEs5 } from "./gen-nodejs/Include_types.js"; +import { IncludeTest as IncludeTestEs6 } from "./gen-nodejs-es6/Include_types.js"; +import { IncludeTest as IncludeTestEsm } from "./gen-nodejs-esm/Include_types.mjs"; + +function constructTest(classVariant) { + return function (t) { + const obj = new classVariant({ bools: { im_true: true, im_false: false } }); + + t.assert(obj.bools.im_true === true); + t.assert(obj.bools.im_false === false); + t.end(); + }; +} + +test("construct es5", constructTest(IncludeTestEs5)); +test("construct es6", constructTest(IncludeTestEs6)); +test("construct esm", constructTest(IncludeTestEsm)); diff --git a/lib/nodejs/test/package-lock.json b/lib/nodejs/test/package-lock.json new file mode 100644 index 00000000000..e7f9543794f --- /dev/null +++ b/lib/nodejs/test/package-lock.json @@ -0,0 +1,52 @@ +{ + "name": "test", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "thrift": "file:../../.." + } + }, + "../../..": { + "version": "0.22.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "browser-or-node": "^1.2.1", + "isomorphic-ws": "^4.0.1", + "node-int64": "^0.4.0", + "q": "^1.5.0", + "ws": "^5.2.3" + }, + "devDependencies": { + "@eslint/js": "^9.18.0", + "@types/node": "^22.10.5", + "@types/node-int64": "^0.4.29", + "@types/q": "^1.5.1", + "buffer-equals": "^1.0.4", + "commander": "^13.0.0", + "connect": "^3.6.6", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.2.1", + "globals": "^15.14.0", + "html-validator-cli": "^2.0.0", + "jsdoc": "^4.0.2", + "json-int64": "^1.0.2", + "nyc": "^15.0.0", + "prettier": "^3.4.2", + "tape": "^4.9.0", + "typescript": "^5.7.2", + "utf-8-validate": "^5.0.0" + }, + "engines": { + "node": ">= 10.18.0" + } + }, + "node_modules/thrift": { + "resolved": "../../..", + "link": true + } + } +} diff --git a/lib/nodejs/test/package.json b/lib/nodejs/test/package.json new file mode 100644 index 00000000000..22220ec724a --- /dev/null +++ b/lib/nodejs/test/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "thrift": "file:../../.." + } +} diff --git a/lib/nodejs/test/server.js b/lib/nodejs/test/server.mjs similarity index 84% rename from lib/nodejs/test/server.js rename to lib/nodejs/test/server.mjs index b56bea7add5..7a3c593c07f 100644 --- a/lib/nodejs/test/server.js +++ b/lib/nodejs/test/server.mjs @@ -19,11 +19,11 @@ * under the License. */ -const fs = require("fs"); -const path = require("path"); -const thrift = require("../lib/thrift"); -const { program } = require("commander"); -const helpers = require("./helpers"); +import fs from "fs"; +import path from "path"; +import thrift from "thrift"; +import { program } from "commander"; +import helpers from "./helpers.js"; program .option( @@ -47,11 +47,16 @@ program .option("--callback", "test with callback style functions") .option("--es6", "Use es6 code") .option("--es5", "Use es5 code") + .option("--esm", "Use es modules") .parse(process.argv); -const ThriftTest = require(`./${helpers.genPath}/ThriftTest`); -const SecondService = require(`./${helpers.genPath}/SecondService`); -const { ThriftTestHandler } = require("./test_handler"); +const ThriftTest = await import( + `./${helpers.genPath}/ThriftTest.${helpers.moduleExt}` +); +const SecondService = await import( + `./${helpers.genPath}/SecondService.${helpers.moduleExt}` +); +import { ThriftTestHandler } from "./test_handler.mjs"; const opts = program.opts(); const port = opts.port; @@ -114,8 +119,8 @@ if (ssl) { type === "websocket" ) { options.tls = { - key: fs.readFileSync(path.resolve(__dirname, "server.key")), - cert: fs.readFileSync(path.resolve(__dirname, "server.crt")), + key: fs.readFileSync(path.resolve(import.meta.dirname, "server.key")), + cert: fs.readFileSync(path.resolve(import.meta.dirname, "server.crt")), }; } } diff --git a/lib/nodejs/test/test-cases.js b/lib/nodejs/test/test-cases.mjs similarity index 85% rename from lib/nodejs/test/test-cases.js rename to lib/nodejs/test/test-cases.mjs index 98077f70321..543e3539ce1 100644 --- a/lib/nodejs/test/test-cases.js +++ b/lib/nodejs/test/test-cases.mjs @@ -19,13 +19,14 @@ "use strict"; -const helpers = require("./helpers"); -const ttypes = require(`./${helpers.genPath}/ThriftTest_types`); -const Int64 = require("node-int64"); +import helpers from "./helpers.js"; +import Int64 from "node-int64"; + +const ttypes = await helpers.importTypes(`ThriftTest_types`); //all Languages in UTF-8 /*jshint -W100 */ -const stringTest = (module.exports.stringTest = +export const stringTest = "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, " + "Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, " + "Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, " + @@ -50,27 +51,27 @@ const stringTest = (module.exports.stringTest = "Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, " + "Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, " + "Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, " + - "Bân-lâm-gú, 粵語"); + "Bân-lâm-gú, 粵語"; /*jshint +W100 */ -const specialCharacters = (module.exports.specialCharacters = +export const specialCharacters = 'quote: " backslash:' + " forwardslash-escaped: / " + " backspace: \b formfeed: \f newline: \n return: \r tab: " + ' now-all-of-them-together: "\\/\b\n\r\t' + " now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><" + - ' char-to-test-json-parsing: ]] "]] \\" }}}{ [[[ '); + ' char-to-test-json-parsing: ]] "]] \\" }}}{ [[[ '; -const mapTestInput = (module.exports.mapTestInput = { +export const mapTestInput = { a: "123", "a b": "with spaces ", same: "same", 0: "numeric key", longValue: stringTest, stringTest: "long key", -}); +}; -const simple = [ +export const simple = [ ["testVoid", undefined], ["testString", "Test"], ["testString", ""], @@ -103,32 +104,32 @@ for (let i = 0; i < 5; ++i) { mapout[i] = i - 10; } -const deep = [ +export const deep = [ [ "testList", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], ], ]; -const deepUnordered = [ +export const deepUnordered = [ ["testMap", mapout], ["testSet", [1, 2, 3]], ["testStringMap", mapTestInput], ]; -const out = new ttypes.Xtruct({ +export const out = new ttypes.Xtruct({ string_thing: "Zero", byte_thing: 1, i32_thing: -3, i64_thing: 1000000, }); -const out2 = new ttypes.Xtruct2(); +export const out2 = new ttypes.Xtruct2(); out2.byte_thing = 1; out2.struct_thing = out; out2.i32_thing = 5; -const crazy = new ttypes.Insanity({ +export const crazy = new ttypes.Insanity({ userMap: { 5: 5, 8: 8 }, xtructs: [ new ttypes.Xtruct({ @@ -146,7 +147,7 @@ const crazy = new ttypes.Insanity({ ], }); -const crazy2 = new ttypes.Insanity({ +export const crazy2 = new ttypes.Insanity({ userMap: { 5: 5, 8: 8 }, xtructs: [ { @@ -164,17 +165,7 @@ const crazy2 = new ttypes.Insanity({ ], }); -const insanity = { +export const insanity = { 1: { 2: crazy, 3: crazy }, 2: { 6: { userMap: {}, xtructs: [] } }, }; - -module.exports.simple = simple; -module.exports.deep = deep; -module.exports.deepUnordered = deepUnordered; - -module.exports.out = out; -module.exports.out2 = out2; -module.exports.crazy = crazy; -module.exports.crazy2 = crazy2; -module.exports.insanity = insanity; diff --git a/lib/nodejs/test/testAll.sh b/lib/nodejs/test/testAll.sh index 144832ee43d..a3baa6e438b 100755 --- a/lib/nodejs/test/testAll.sh +++ b/lib/nodejs/test/testAll.sh @@ -35,25 +35,23 @@ REPORT_PREFIX="${DIR}/../coverage/report" COUNT=0 -export NODE_PATH="${DIR}:${DIR}/../lib:${NODE_PATH}" - testServer() { - echo " [ECMA $1] Testing $2 Client/Server with protocol $3 and transport $4 $5"; + echo " [Variant: $1] Testing $2 Client/Server with protocol $3 and transport $4 $5"; RET=0 if [ -n "${COVER}" ]; then - ${ISTANBUL} cover ${DIR}/server.js --dir ${REPORT_PREFIX}${COUNT} --handle-sigint -- --type $2 -p $3 -t $4 $5 & + ${ISTANBUL} cover ${DIR}/server.mjs --dir ${REPORT_PREFIX}${COUNT} --handle-sigint -- --type $2 -p $3 -t $4 $5 & COUNT=$((COUNT+1)) else - node ${DIR}/server.js --${1} --type $2 -p $3 -t $4 $5 & + node ${DIR}/server.mjs --${1} --type $2 -p $3 -t $4 $5 & fi SERVERPID=$! sleep 0.1 if [ -n "${COVER}" ]; then - ${ISTANBUL} cover ${DIR}/client.js --dir ${REPORT_PREFIX}${COUNT} -- --${1} --type $2 -p $3 -t $4 $5 || RET=1 + ${ISTANBUL} cover ${DIR}/client.mjs --dir ${REPORT_PREFIX}${COUNT} -- --${1} --type $2 -p $3 -t $4 $5 || RET=1 COUNT=$((COUNT+1)) else - node ${DIR}/client.js --${1} --type $2 -p $3 -t $4 $5 || RET=1 + node ${DIR}/client.mjs --${1} --type $2 -p $3 -t $4 $5 || RET=1 fi kill -2 $SERVERPID || RET=1 wait $SERVERPID @@ -90,10 +88,17 @@ TESTOK=0 ${THRIFT_COMPILER} -o ${DIR} --gen js:node ${THRIFT_FILES_DIR}/v0.16/ThriftTest.thrift ${THRIFT_COMPILER} -o ${DIR} --gen js:node ${THRIFT_FILES_DIR}/JsDeepConstructorTest.thrift ${THRIFT_COMPILER} -o ${DIR} --gen js:node ${THRIFT_FILES_DIR}/Int64Test.thrift +${THRIFT_COMPILER} -o ${DIR} --gen js:node ${THRIFT_FILES_DIR}/Include.thrift mkdir ${DIR}/gen-nodejs-es6 ${THRIFT_COMPILER} -out ${DIR}/gen-nodejs-es6 --gen js:node,es6 ${THRIFT_FILES_DIR}/v0.16/ThriftTest.thrift ${THRIFT_COMPILER} -out ${DIR}/gen-nodejs-es6 --gen js:node,es6 ${THRIFT_FILES_DIR}/JsDeepConstructorTest.thrift ${THRIFT_COMPILER} -out ${DIR}/gen-nodejs-es6 --gen js:node,es6 ${THRIFT_FILES_DIR}/Int64Test.thrift +${THRIFT_COMPILER} -out ${DIR}/gen-nodejs-es6 --gen js:node,es6 ${THRIFT_FILES_DIR}/Include.thrift +mkdir ${DIR}/gen-nodejs-esm +${THRIFT_COMPILER} -out ${DIR}/gen-nodejs-esm --gen js:node,es6,esm ${THRIFT_FILES_DIR}/v0.16/ThriftTest.thrift +${THRIFT_COMPILER} -out ${DIR}/gen-nodejs-esm --gen js:node,es6,esm ${THRIFT_FILES_DIR}/JsDeepConstructorTest.thrift +${THRIFT_COMPILER} -out ${DIR}/gen-nodejs-esm --gen js:node,es6,esm ${THRIFT_FILES_DIR}/Int64Test.thrift +${THRIFT_COMPILER} -out ${DIR}/gen-nodejs-esm --gen js:node,es6,esm ${THRIFT_FILES_DIR}/Include.thrift # generate episodic compilation test code TYPES_PACKAGE=${EPISODIC_DIR}/node_modules/types-package @@ -121,6 +126,7 @@ node ${DIR}/binary.test.js || TESTOK=1 node ${DIR}/header.test.js || TESTOK=1 node ${DIR}/int64.test.js || TESTOK=1 node ${DIR}/deep-constructor.test.js || TESTOK=1 +node ${DIR}/include.test.mjs || TESTOK=1 # integration tests @@ -130,11 +136,11 @@ do do for transport in buffered framed do - for ecma_version in es5 es6 + for gen_variant in es5 es6 esm do - testServer $ecma_version $type $protocol $transport || TESTOK=1 - testServer $ecma_version $type $protocol $transport --ssl || TESTOK=1 - testServer $ecma_version $type $protocol $transport --callback || TESTOK=1 + testServer $gen_variant $type $protocol $transport || TESTOK=1 + testServer $gen_variant $type $protocol $transport --ssl || TESTOK=1 + testServer $gen_variant $type $protocol $transport --callback || TESTOK=1 done done done diff --git a/lib/nodejs/test/test_driver.js b/lib/nodejs/test/test_driver.mjs similarity index 96% rename from lib/nodejs/test/test_driver.js rename to lib/nodejs/test/test_driver.mjs index 0593aeab671..eca56ba773c 100644 --- a/lib/nodejs/test/test_driver.js +++ b/lib/nodejs/test/test_driver.mjs @@ -26,15 +26,20 @@ // supports an optional callback function which is called with // a status message when the test is complete. -const test = require("tape"); +import test from "tape"; -const helpers = require("./helpers"); -const ttypes = require(`./${helpers.genPath}/ThriftTest_types`); -const TException = require("thrift").Thrift.TException; -const Int64 = require("node-int64"); -const testCases = require("./test-cases"); +import helpers from "./helpers.js"; +import thrift from "thrift"; +import Int64 from "node-int64"; +import * as testCases from "./test-cases.mjs"; -exports.ThriftTestDriver = function (client, callback) { +const ttypes = await import( + `./${helpers.genPath}/ThriftTest_types.${helpers.moduleExt}` +); + +const TException = thrift.Thrift.TException; + +export const ThriftTestDriver = function (client, callback) { test( "NodeJS Style Callback Client Tests", { skip: helpers.ecmaMode === "es6" }, @@ -162,7 +167,7 @@ exports.ThriftTestDriver = function (client, callback) { } }; -exports.ThriftTestDriverPromise = function (client, callback) { +export const ThriftTestDriverPromise = function (client, callback) { test("Promise Client Tests", function (assert) { const checkRecursively = makeRecursiveCheck(assert); diff --git a/lib/nodejs/test/test_handler.js b/lib/nodejs/test/test_handler.mjs similarity index 95% rename from lib/nodejs/test/test_handler.js rename to lib/nodejs/test/test_handler.mjs index a6a6fc2e327..a378fe16e72 100644 --- a/lib/nodejs/test/test_handler.js +++ b/lib/nodejs/test/test_handler.mjs @@ -19,9 +19,11 @@ //This is the server side Node test handler for the standard // Apache Thrift test service. -const helpers = require("./helpers"); -const ttypes = require(`./${helpers.genPath}/ThriftTest_types`); -const TException = require("thrift").Thrift.TException; +import helpers from "./helpers.js"; +import thrift from "thrift"; + +const ttypes = await helpers.importTypes(`ThriftTest_types`); +const TException = thrift.Thrift.TException; function makeSyncHandler() { return function (thing) { @@ -217,4 +219,4 @@ identityHandlers.forEach(function (label) { asyncHandlers[label] = makeAsyncHandler(label); }); -exports.ThriftTestHandler = asyncHandlers; +export { asyncHandlers as ThriftTestHandler }; From 3494e1cd087f1d89848275445d92274a8734dbbf Mon Sep 17 00:00:00 2001 From: Alexandre Detiste Date: Wed, 19 Feb 2025 21:53:40 +0100 Subject: [PATCH 222/430] replace "utf8" alias by canonical "utf-8" locale code + remove the second Python2 vs Py3 compat.py Client: py Patch: Alexandre Detiste This closes #3105 --- lib/py/src/compat.py | 29 ----------------- lib/py/src/protocol/TBinaryProtocol.py | 6 ++-- lib/py/src/protocol/TCompactProtocol.py | 6 ++-- lib/py/src/protocol/TJSONProtocol.py | 6 ++-- lib/py/src/protocol/TProtocol.py | 9 +++--- lib/py/src/transport/THeaderTransport.py | 31 +++++++++--------- lib/py/src/transport/TTransport.py | 40 ++++++++++++------------ lib/py/src/transport/TZlibTransport.py | 17 +++++----- lib/py/test/thrift_json.py | 1 - 9 files changed, 55 insertions(+), 90 deletions(-) delete mode 100644 lib/py/src/compat.py diff --git a/lib/py/src/compat.py b/lib/py/src/compat.py deleted file mode 100644 index 3b3d57f56e5..00000000000 --- a/lib/py/src/compat.py +++ /dev/null @@ -1,29 +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. -# - -from io import BytesIO as BufferIO # noqa - -def binary_to_str(bin_val): - return bin_val.decode('utf8') - -def str_to_binary(str_val): - return bytes(str_val, 'utf8') - -def byte_index(bytes_val, i): - return bytes_val[i] diff --git a/lib/py/src/protocol/TBinaryProtocol.py b/lib/py/src/protocol/TBinaryProtocol.py index e59e0dcbdb6..af64ec10356 100644 --- a/lib/py/src/protocol/TBinaryProtocol.py +++ b/lib/py/src/protocol/TBinaryProtocol.py @@ -17,10 +17,10 @@ # under the License. # -from .TProtocol import TType, TProtocolBase, TProtocolException, TProtocolFactory -from ..compat import binary_to_str from struct import pack, unpack +from .TProtocol import TType, TProtocolBase, TProtocolException, TProtocolFactory + class TBinaryProtocol(TProtocolBase): """Binary implementation of the Thrift protocol driver.""" @@ -146,7 +146,7 @@ def readMessageBegin(self): if self.strictRead: raise TProtocolException(type=TProtocolException.BAD_VERSION, message='No protocol version header') - name = binary_to_str(self.trans.readAll(sz)) + name = self.trans.readAll(sz).decode('utf-8') type = self.readByte() seqid = self.readI32() return (name, type, seqid) diff --git a/lib/py/src/protocol/TCompactProtocol.py b/lib/py/src/protocol/TCompactProtocol.py index 700e792f79b..a3527cd47a3 100644 --- a/lib/py/src/protocol/TCompactProtocol.py +++ b/lib/py/src/protocol/TCompactProtocol.py @@ -20,8 +20,6 @@ from .TProtocol import TType, TProtocolBase, TProtocolException, TProtocolFactory, checkIntegerLimits from struct import pack, unpack -from ..compat import binary_to_str, str_to_binary - __all__ = ['TCompactProtocol', 'TCompactProtocolFactory'] CLEAR = 0 @@ -165,7 +163,7 @@ def writeMessageBegin(self, name, type, seqid): if tseqid < 0: tseqid = 2147483648 + (2147483648 + tseqid) self.__writeVarint(tseqid) - self.__writeBinary(str_to_binary(name)) + self.__writeBinary(bytes(name, 'utf-8')) self.state = VALUE_WRITE def writeMessageEnd(self): @@ -346,7 +344,7 @@ def readMessageBegin(self): # however the sequence is actually signed... if seqid > 2147483647: seqid = -2147483648 - (2147483648 - seqid) - name = binary_to_str(self.__readBinary()) + name = self.__readBinary().decode('utf-8') return (name, type, seqid) def readMessageEnd(self): diff --git a/lib/py/src/protocol/TJSONProtocol.py b/lib/py/src/protocol/TJSONProtocol.py index fef0cc9422b..a42aaa6315d 100644 --- a/lib/py/src/protocol/TJSONProtocol.py +++ b/lib/py/src/protocol/TJSONProtocol.py @@ -23,8 +23,6 @@ import math import sys -from ..compat import str_to_binary - __all__ = ['TJSONProtocol', 'TJSONProtocolFactory', @@ -213,7 +211,7 @@ def writeJSONString(self, string): escaped = ESCAPE_CHAR_VALS.get(s, s) json_str.append(escaped) json_str.append('"') - self.trans.write(str_to_binary(''.join(json_str))) + self.trans.write(bytes(''.join(json_str), 'utf-8')) def writeJSONNumber(self, number, formatter='{0}'): self.context.write() @@ -313,7 +311,7 @@ def readJSONString(self, skipContext): utf8_bytes = bytearray([ord(character)]) while ord(self.reader.peek()) >= 0x80: utf8_bytes.append(ord(self.reader.read())) - character = utf8_bytes.decode('utf8') + character = utf8_bytes.decode('utf-8') string.append(character) if highSurrogate: diff --git a/lib/py/src/protocol/TProtocol.py b/lib/py/src/protocol/TProtocol.py index ec71ab3aa72..a7336c5b096 100644 --- a/lib/py/src/protocol/TProtocol.py +++ b/lib/py/src/protocol/TProtocol.py @@ -19,7 +19,6 @@ from thrift.Thrift import TException, TType, TFrozenDict from thrift.transport.TTransport import TTransportException -from ..compat import binary_to_str, str_to_binary import sys from itertools import islice @@ -117,13 +116,13 @@ def writeDouble(self, dub): pass def writeString(self, str_val): - self.writeBinary(str_to_binary(str_val)) + self.writeBinary(bytes(str_val, 'utf-8')) def writeBinary(self, str_val): pass def writeUtf8(self, str_val): - self.writeString(str_val.encode('utf8')) + self.writeString(str_val.encode('utf-8')) def readMessageBegin(self): pass @@ -180,13 +179,13 @@ def readDouble(self): pass def readString(self): - return binary_to_str(self.readBinary()) + return self.readBinary().decode('utf-8') def readBinary(self): pass def readUtf8(self): - return self.readString().decode('utf8') + return self.readString().decode('utf-8') def skip(self, ttype): if ttype == TType.BOOL: diff --git a/lib/py/src/transport/THeaderTransport.py b/lib/py/src/transport/THeaderTransport.py index 7c9827ba3a9..4fb20343020 100644 --- a/lib/py/src/transport/THeaderTransport.py +++ b/lib/py/src/transport/THeaderTransport.py @@ -19,8 +19,8 @@ import struct import zlib +from io import BytesIO -from thrift.compat import BufferIO, byte_index from thrift.protocol.TBinaryProtocol import TBinaryProtocol from thrift.protocol.TCompactProtocol import TCompactProtocol, readVarint, writeVarint from thrift.Thrift import TApplicationException @@ -31,7 +31,6 @@ TTransportException, ) - U16 = struct.Struct("!H") I32 = struct.Struct("!i") HEADER_MAGIC = 0x0FFF @@ -92,10 +91,10 @@ def __init__(self, transport, allowed_client_types, default_protocol=THeaderSubp self._client_type = THeaderClientType.HEADERS self._allowed_client_types = allowed_client_types - self._read_buffer = BufferIO(b"") + self._read_buffer = BytesIO(b"") self._read_headers = {} - self._write_buffer = BufferIO() + self._write_buffer = BytesIO() self._write_headers = {} self._write_transforms = [] @@ -184,8 +183,8 @@ def readFrame(self, req_sz): if frame_size & TBinaryProtocol.VERSION_MASK == TBinaryProtocol.VERSION_1: self._set_client_type(THeaderClientType.UNFRAMED_BINARY) is_unframed = True - elif (byte_index(first_word, 0) == TCompactProtocol.PROTOCOL_ID and - byte_index(first_word, 1) & TCompactProtocol.VERSION_MASK == TCompactProtocol.VERSION): + elif (first_word[0] == TCompactProtocol.PROTOCOL_ID and + first_word[1] & TCompactProtocol.VERSION_MASK == TCompactProtocol.VERSION): self._set_client_type(THeaderClientType.UNFRAMED_COMPACT) is_unframed = True @@ -195,7 +194,7 @@ def readFrame(self, req_sz): rest = self._transport.read(bytes_left_to_read) else: rest = b"" - self._read_buffer = BufferIO(first_word + rest) + self._read_buffer = BytesIO(first_word + rest) return # ok, we're still here so we're framed. @@ -204,7 +203,7 @@ def readFrame(self, req_sz): TTransportException.SIZE_LIMIT, "Frame was too large.", ) - read_buffer = BufferIO(self._transport.readAll(frame_size)) + read_buffer = BytesIO(self._transport.readAll(frame_size)) # the next word is either going to be the version field of a # binary/compact protocol message or the magic value + flags of a @@ -218,8 +217,8 @@ def readFrame(self, req_sz): elif version & TBinaryProtocol.VERSION_MASK == TBinaryProtocol.VERSION_1: self._set_client_type(THeaderClientType.FRAMED_BINARY) self._read_buffer = read_buffer - elif (byte_index(second_word, 0) == TCompactProtocol.PROTOCOL_ID and - byte_index(second_word, 1) & TCompactProtocol.VERSION_MASK == TCompactProtocol.VERSION): + elif (second_word[0] == TCompactProtocol.PROTOCOL_ID and + second_word[1] & TCompactProtocol.VERSION_MASK == TCompactProtocol.VERSION): self._set_client_type(THeaderClientType.FRAMED_COMPACT) self._read_buffer = read_buffer else: @@ -229,7 +228,7 @@ def readFrame(self, req_sz): ) def _parse_header_format(self, buffer): - # make BufferIO look like TTransport for varint helpers + # make BytesIO look like TTransport for varint helpers buffer_transport = TMemoryBuffer() buffer_transport._buffer = buffer @@ -279,22 +278,22 @@ def _parse_header_format(self, buffer): for transform_id in transforms: transform_fn = READ_TRANSFORMS_BY_ID[transform_id] payload = transform_fn(payload) - return BufferIO(payload) + return BytesIO(payload) def write(self, buf): self._write_buffer.write(buf) def flush(self): payload = self._write_buffer.getvalue() - self._write_buffer = BufferIO() + self._write_buffer = BytesIO() - buffer = BufferIO() + buffer = BytesIO() if self._client_type == THeaderClientType.HEADERS: for transform_id in self._write_transforms: transform_fn = WRITE_TRANSFORMS_BY_ID[transform_id] payload = transform_fn(payload) - headers = BufferIO() + headers = BytesIO() writeVarint(headers, self._protocol_id) writeVarint(headers, len(self._write_transforms)) for transform_id in self._write_transforms: @@ -348,5 +347,5 @@ def cstringio_refill(self, partialread, reqlen): result = bytearray(partialread) while len(result) < reqlen: result += self.read(reqlen - len(result)) - self._read_buffer = BufferIO(result) + self._read_buffer = BytesIO(result) return self._read_buffer diff --git a/lib/py/src/transport/TTransport.py b/lib/py/src/transport/TTransport.py index a686b1231c6..4f6b67fe123 100644 --- a/lib/py/src/transport/TTransport.py +++ b/lib/py/src/transport/TTransport.py @@ -17,9 +17,9 @@ # under the License. # -from io import BytesIO as BufferIO - +from io import BytesIO from struct import pack, unpack + from thrift.Thrift import TException @@ -144,9 +144,9 @@ class TBufferedTransport(TTransportBase, CReadableTransport): def __init__(self, trans, rbuf_size=DEFAULT_BUFFER): self.__trans = trans - self.__wbuf = BufferIO() + self.__wbuf = BytesIO() # Pass string argument to initialize read buffer as cStringIO.InputType - self.__rbuf = BufferIO(b'') + self.__rbuf = BytesIO(b'') self.__rbuf_size = rbuf_size def isOpen(self): @@ -162,7 +162,7 @@ def read(self, sz): ret = self.__rbuf.read(sz) if len(ret) != 0: return ret - self.__rbuf = BufferIO(self.__trans.read(max(sz, self.__rbuf_size))) + self.__rbuf = BytesIO(self.__trans.read(max(sz, self.__rbuf_size))) return self.__rbuf.read(sz) def write(self, buf): @@ -170,13 +170,13 @@ def write(self, buf): self.__wbuf.write(buf) except Exception as e: # on exception reset wbuf so it doesn't contain a partial function call - self.__wbuf = BufferIO() + self.__wbuf = BytesIO() raise e def flush(self): out = self.__wbuf.getvalue() # reset wbuf before write/flush to preserve state on underlying failure - self.__wbuf = BufferIO() + self.__wbuf = BytesIO() self.__trans.write(out) self.__trans.flush() @@ -195,7 +195,7 @@ def cstringio_refill(self, partialread, reqlen): if len(retstring) < reqlen: retstring += self.__trans.readAll(reqlen - len(retstring)) - self.__rbuf = BufferIO(retstring) + self.__rbuf = BytesIO(retstring) return self.__rbuf @@ -214,9 +214,9 @@ def __init__(self, value=None, offset=0): If value is set, this will be a transport for reading, otherwise, it is for writing""" if value is not None: - self._buffer = BufferIO(value) + self._buffer = BytesIO(value) else: - self._buffer = BufferIO() + self._buffer = BytesIO() if offset: self._buffer.seek(offset) @@ -264,8 +264,8 @@ class TFramedTransport(TTransportBase, CReadableTransport): def __init__(self, trans,): self.__trans = trans - self.__rbuf = BufferIO(b'') - self.__wbuf = BufferIO() + self.__rbuf = BytesIO(b'') + self.__wbuf = BytesIO() def isOpen(self): return self.__trans.isOpen() @@ -287,7 +287,7 @@ def read(self, sz): def readFrame(self): buff = self.__trans.readAll(4) sz, = unpack('!i', buff) - self.__rbuf = BufferIO(self.__trans.readAll(sz)) + self.__rbuf = BytesIO(self.__trans.readAll(sz)) def write(self, buf): self.__wbuf.write(buf) @@ -296,7 +296,7 @@ def flush(self): wout = self.__wbuf.getvalue() wsz = len(wout) # reset wbuf before write/flush to preserve state on underlying failure - self.__wbuf = BufferIO() + self.__wbuf = BytesIO() # N.B.: Doing this string concatenation is WAY cheaper than making # two separate calls to the underlying socket object. Socket writes in # Python turn out to be REALLY expensive, but it seems to do a pretty @@ -317,7 +317,7 @@ def cstringio_refill(self, prefix, reqlen): while len(prefix) < reqlen: self.readFrame() prefix += self.__rbuf.getvalue() - self.__rbuf = BufferIO(prefix) + self.__rbuf = BytesIO(prefix) return self.__rbuf @@ -371,8 +371,8 @@ def __init__(self, transport, host, service, mechanism='GSSAPI', self.transport = transport self.sasl = SASLClient(host, service, mechanism, **sasl_kwargs) - self.__wbuf = BufferIO() - self.__rbuf = BufferIO(b'') + self.__wbuf = BytesIO() + self.__rbuf = BytesIO(b'') def open(self): if not self.transport.isOpen(): @@ -424,7 +424,7 @@ def flush(self): encoded = self.sasl.wrap(data) self.transport.write(pack("!i", len(encoded)) + encoded) self.transport.flush() - self.__wbuf = BufferIO() + self.__wbuf = BytesIO() def read(self, sz): ret = self.__rbuf.read(sz) @@ -438,7 +438,7 @@ def _read_frame(self): header = self.transport.readAll(4) length, = unpack('!i', header) encoded = self.transport.readAll(length) - self.__rbuf = BufferIO(self.sasl.unwrap(encoded)) + self.__rbuf = BytesIO(self.sasl.unwrap(encoded)) def close(self): self.sasl.dispose() @@ -456,5 +456,5 @@ def cstringio_refill(self, prefix, reqlen): while len(prefix) < reqlen: self._read_frame() prefix += self.__rbuf.getvalue() - self.__rbuf = BufferIO(prefix) + self.__rbuf = BytesIO(prefix) return self.__rbuf diff --git a/lib/py/src/transport/TZlibTransport.py b/lib/py/src/transport/TZlibTransport.py index 8b08297645d..a476d2a0aae 100644 --- a/lib/py/src/transport/TZlibTransport.py +++ b/lib/py/src/transport/TZlibTransport.py @@ -23,8 +23,9 @@ """ import zlib +from io import BytesIO + from .TTransport import TTransportBase, CReadableTransport -from ..compat import BufferIO class TZlibTransportFactory: @@ -87,8 +88,8 @@ def __init__(self, trans, compresslevel=9): """ self.__trans = trans self.compresslevel = compresslevel - self.__rbuf = BufferIO() - self.__wbuf = BufferIO() + self.__rbuf = BytesIO() + self.__wbuf = BytesIO() self._init_zlib() self._init_stats() @@ -96,8 +97,8 @@ def _reinit_buffers(self): """Internal method to initialize/reset the internal StringIO objects for read and write buffers. """ - self.__rbuf = BufferIO() - self.__wbuf = BufferIO() + self.__rbuf = BytesIO() + self.__wbuf = BytesIO() def _init_stats(self): """Internal method to reset the internal statistics counters @@ -202,7 +203,7 @@ def readComp(self, sz): self.bytes_in += len(zbuf) self.bytes_in_comp += len(buf) old = self.__rbuf.read() - self.__rbuf = BufferIO(old + buf) + self.__rbuf = BytesIO(old + buf) if len(old) + len(buf) == 0: return False return True @@ -227,7 +228,7 @@ def flush(self): ztail = self._zcomp_write.flush(zlib.Z_SYNC_FLUSH) self.bytes_out_comp += len(ztail) if (len(zbuf) + len(ztail)) > 0: - self.__wbuf = BufferIO() + self.__wbuf = BytesIO() self.__trans.write(zbuf + ztail) self.__trans.flush() @@ -243,5 +244,5 @@ def cstringio_refill(self, partialread, reqlen): retstring += self.read(self.DEFAULT_BUFFSIZE) while len(retstring) < reqlen: retstring += self.read(reqlen - len(retstring)) - self.__rbuf = BufferIO(retstring) + self.__rbuf = BytesIO(retstring) return self.__rbuf diff --git a/lib/py/test/thrift_json.py b/lib/py/test/thrift_json.py index 5a491e2c495..bf2b8086170 100644 --- a/lib/py/test/thrift_json.py +++ b/lib/py/test/thrift_json.py @@ -17,7 +17,6 @@ # under the License. # -import sys import unittest import _import_local_thrift # noqa From 72c8111bb199be6047049318da2525d1d26b640b Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Mon, 10 Mar 2025 21:46:20 +0100 Subject: [PATCH 223/430] THRIFT-5856 Client should validate HTTP status Client: Delphi Patch: Jens Geyer --- lib/delphi/src/Thrift.Transport.MsxmlHTTP.pas | 17 +++++++++++++++++ lib/delphi/src/Thrift.Transport.WinHTTP.pas | 14 ++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/lib/delphi/src/Thrift.Transport.MsxmlHTTP.pas b/lib/delphi/src/Thrift.Transport.MsxmlHTTP.pas index 2cc3bfeaf9d..e3886a56bd0 100644 --- a/lib/delphi/src/Thrift.Transport.MsxmlHTTP.pas +++ b/lib/delphi/src/Thrift.Transport.MsxmlHTTP.pas @@ -53,6 +53,8 @@ TMsxmlHTTPClientImpl = class( TEndpointTransportBase, IHTTPClient) FCustomHeaders : IThriftDictionary; function CreateRequest: IXMLHTTPRequest; + class procedure EnsureSuccessHttpStatus( const aRequest : IXMLHTTPRequest); + strict protected function GetIsOpen: Boolean; override; procedure Open(); override; @@ -255,6 +257,7 @@ procedure TMsxmlHTTPClientImpl.SendRequest; ms.Position := 0; xmlhttp.send( IUnknown( TStreamAdapter.Create( ms, soReference ))); FInputStream := nil; + EnsureSuccessHttpStatus(xmlhttp); // throws if not FInputStream := TThriftStreamAdapterCOM.Create( IUnknown( xmlhttp.responseStream) as IStream); ResetMessageSizeAndConsumedBytes; UpdateKnownMessageSize( FInputStream.Size); @@ -271,6 +274,20 @@ procedure TMsxmlHTTPClientImpl.Write( const pBuf : Pointer; off, len : Integer); end; +class procedure TMsxmlHTTPClientImpl.EnsureSuccessHttpStatus( const aRequest : IXMLHTTPRequest); +var iStatus : Integer; + sText : string; +begin + if aRequest = nil + then raise TTransportExceptionNotOpen.Create('Invalid HTTP request data'); + + iStatus := aRequest.status; + sText := aRequest.statusText; + + if (200 > iStatus) or (iStatus > 299) + then raise TTransportExceptionEndOfFile.Create('HTTP '+IntToStr(iStatus)+' '+sText); +end; + end. diff --git a/lib/delphi/src/Thrift.Transport.WinHTTP.pas b/lib/delphi/src/Thrift.Transport.WinHTTP.pas index 9deda4acd5b..2d18ca1683a 100644 --- a/lib/delphi/src/Thrift.Transport.WinHTTP.pas +++ b/lib/delphi/src/Thrift.Transport.WinHTTP.pas @@ -51,6 +51,7 @@ TWinHTTPClientImpl = class( TEndpointTransportBase, IHTTPClient) function CreateRequest: IWinHTTPRequest; function SecureProtocolsAsWinHTTPFlags : Cardinal; + class procedure EnsureSuccessHttpStatus( const aRequest : IWinHTTPRequest); strict private type @@ -335,6 +336,7 @@ procedure TWinHTTPClientImpl.SendRequest; // we're about to receive a new message, so reset everyting ResetMessageSizeAndConsumedBytes(-1); + EnsureSuccessHttpStatus(http); // throws if not FInputStream := THTTPResponseStream.Create( http); if http.QueryTotalResponseSize( dwSize) // FALSE indicates "no info available" then UpdateKnownMessageSize( dwSize); @@ -349,6 +351,18 @@ procedure TWinHTTPClientImpl.Write( const pBuf : Pointer; off, len : Integer); end; +class procedure TWinHTTPClientImpl.EnsureSuccessHttpStatus( const aRequest : IWinHTTPRequest); +var dwStatus : Cardinal; + sText : string; +begin + if (aRequest <> nil) + then aRequest.QueryHttpStatus( dwStatus, sText) + else raise TTransportExceptionNotOpen.Create('Invalid HTTP request data'); + + if (200 > dwStatus) or (dwStatus > 299) + then raise TTransportExceptionEndOfFile.Create('HTTP '+UIntToStr(dwStatus)+' '+sText); +end; + { TWinHTTPClientImpl.THTTPResponseStream } constructor TWinHTTPClientImpl.THTTPResponseStream.Create( const aRequest : IWinHTTPRequest); From 6cb35b284578db4187023b8037291a1f5364025d Mon Sep 17 00:00:00 2001 From: Florian Mt Date: Mon, 10 Mar 2025 22:26:19 +0100 Subject: [PATCH 224/430] Remove extra Remove the textual going around in this page: https://thrift.apache.org/docs/Languages.html [skip ci] --- LANGUAGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LANGUAGES.md b/LANGUAGES.md index eca3dfba3f8..f7108a7aaa8 100644 --- a/LANGUAGES.md +++ b/LANGUAGES.md @@ -364,7 +364,7 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr autoconfcmake MinMax Uuid -Domain File Memory Pipe Socket TLS  +Domain File Memory Pipe Socket TLS  FramedHeader http  zlib  BinaryCompact JSON Multiplex ForkingNonblockingSimpleThreadedThreadPool From 09ced04f42a227aeef16675235e0fa3a5adabc40 Mon Sep 17 00:00:00 2001 From: Asjad Syed Date: Mon, 10 Mar 2025 18:24:53 -0400 Subject: [PATCH 225/430] THRIFT-5024: Replace removed @gen.engine with @gen.coroutine Client: py Patch: Asjad Syed This closes #3111 --- compiler/cpp/src/thrift/generate/t_py_generator.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/cpp/src/thrift/generate/t_py_generator.cc b/compiler/cpp/src/thrift/generate/t_py_generator.cc index 893d6355cec..c34bb43bcbd 100644 --- a/compiler/cpp/src/thrift/generate/t_py_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_py_generator.cc @@ -1460,7 +1460,7 @@ void t_py_generator::generate_service_client(t_service* tservice) { if (gen_tornado_ && extends.empty()) { f_service_ << '\n' << - indent() << "@gen.engine" << '\n' << + indent() << "@gen.coroutine" << '\n' << indent() << "def _start_receiving(self):" << '\n'; indent_up(); indent(f_service_) << "while True:" << '\n'; From 7c943358472dc11aa89d353b390f91d9564ff06d Mon Sep 17 00:00:00 2001 From: Maximilian Bandle Date: Fri, 7 Feb 2025 10:58:32 +0100 Subject: [PATCH 226/430] THRIFT-5853: Remove oldstyle casts from TBufferTransports and TCompactProtocol Client: cpp Removes all oldstyle casts from the library parts needed to parse with TCompactProtocol in memory, like when using thrift for parquet. Thus, it is now possible to compile it with -Wno-old-style-casts --- .../src/thrift/protocol/TCompactProtocol.h | 4 +- .../src/thrift/protocol/TCompactProtocol.tcc | 58 +++++++++---------- lib/cpp/src/thrift/protocol/TProtocol.h | 12 ++-- .../thrift/transport/TBufferTransports.cpp | 6 +- .../src/thrift/transport/TBufferTransports.h | 8 +-- 5 files changed, 44 insertions(+), 44 deletions(-) diff --git a/lib/cpp/src/thrift/protocol/TCompactProtocol.h b/lib/cpp/src/thrift/protocol/TCompactProtocol.h index 792a2d89e3b..81db1f67bd3 100644 --- a/lib/cpp/src/thrift/protocol/TCompactProtocol.h +++ b/lib/cpp/src/thrift/protocol/TCompactProtocol.h @@ -35,12 +35,12 @@ namespace protocol { template class TCompactProtocolT : public TVirtualProtocol > { public: - static const int8_t PROTOCOL_ID = (int8_t)0x82u; + static const int8_t PROTOCOL_ID = static_cast(0x82u); static const int8_t VERSION_N = 1; static const int8_t VERSION_MASK = 0x1f; // 0001 1111 protected: - static const int8_t TYPE_MASK = (int8_t)0xE0u; // 1110 0000 + static const int8_t TYPE_MASK = static_cast(0xE0u); // 1110 0000 static const int8_t TYPE_BITS = 0x07; // 0000 0111 static const int32_t TYPE_SHIFT_AMOUNT = 5; diff --git a/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc b/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc index 5db93706660..a872c23db89 100644 --- a/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc +++ b/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc @@ -93,7 +93,7 @@ uint32_t TCompactProtocolT::writeMessageBegin( const int32_t seqid) { uint32_t wsize = 0; wsize += writeByte(PROTOCOL_ID); - wsize += writeByte((VERSION_N & VERSION_MASK) | (((int32_t)messageType << TYPE_SHIFT_AMOUNT) & TYPE_MASK)); + wsize += writeByte((VERSION_N & VERSION_MASK) | ((static_cast(messageType) << TYPE_SHIFT_AMOUNT) & TYPE_MASK)); wsize += writeVarint32(seqid); wsize += writeString(name); return wsize; @@ -221,7 +221,7 @@ uint32_t TCompactProtocolT::writeBool(const bool value) { template uint32_t TCompactProtocolT::writeByte(const int8_t byte) { - trans_->write((uint8_t*)&byte, 1); + trans_->write(reinterpret_cast(&byte), 1); return 1; } @@ -259,7 +259,7 @@ uint32_t TCompactProtocolT::writeDouble(const double dub) { auto bits = bitwise_cast(dub); bits = THRIFT_htolell(bits); - trans_->write((uint8_t*)&bits, 8); + trans_->write(reinterpret_cast(&bits), 8); return 8; } @@ -282,7 +282,7 @@ uint32_t TCompactProtocolT::writeBinary(const std::string& str) { if(ssize > (std::numeric_limits::max)() - wsize) throw TProtocolException(TProtocolException::SIZE_LIMIT); wsize += ssize; - trans_->write((uint8_t*)str.data(), ssize); + trans_->write(reinterpret_cast(str.data()), ssize); return wsize; } @@ -350,10 +350,10 @@ uint32_t TCompactProtocolT::writeVarint32(uint32_t n) { while (true) { if ((n & ~0x7F) == 0) { - buf[wsize++] = (int8_t)n; + buf[wsize++] = static_cast(n); break; } else { - buf[wsize++] = (int8_t)((n & 0x7F) | 0x80); + buf[wsize++] = static_cast((n & 0x7F) | 0x80); n >>= 7; } } @@ -371,10 +371,10 @@ uint32_t TCompactProtocolT::writeVarint64(uint64_t n) { while (true) { if ((n & ~0x7FL) == 0) { - buf[wsize++] = (int8_t)n; + buf[wsize++] = static_cast(n); break; } else { - buf[wsize++] = (int8_t)((n & 0x7F) | 0x80); + buf[wsize++] = static_cast((n & 0x7F) | 0x80); n >>= 7; } } @@ -431,12 +431,12 @@ uint32_t TCompactProtocolT::readMessageBegin( } rsize += readByte(versionAndType); - version = (int8_t)(versionAndType & VERSION_MASK); + version = static_cast(versionAndType & VERSION_MASK); if (version != VERSION_N) { throw TProtocolException(TProtocolException::BAD_VERSION, "Bad protocol version"); } - messageType = (TMessageType)((versionAndType >> TYPE_SHIFT_AMOUNT) & TYPE_BITS); + messageType = static_cast((versionAndType >> TYPE_SHIFT_AMOUNT) & TYPE_BITS); rsize += readVarint32(seqid); rsize += readString(name); @@ -489,12 +489,12 @@ uint32_t TCompactProtocolT::readFieldBegin(std::string& name, } // mask off the 4 MSB of the type header. it could contain a field id delta. - auto modifier = (int16_t)(((uint8_t)byte & 0xf0) >> 4); + auto modifier = static_cast(static_cast(byte & 0xf0) >> 4); if (modifier == 0) { // not a delta, look ahead for the zigzag varint field id. rsize += readI16(fieldId); } else { - fieldId = (int16_t)(lastFieldId_ + modifier); + fieldId = static_cast(lastFieldId_ + modifier); } fieldType = getTType(type); @@ -535,9 +535,9 @@ uint32_t TCompactProtocolT::readMapBegin(TType& keyType, throw TProtocolException(TProtocolException::SIZE_LIMIT); } - keyType = getTType((int8_t)((uint8_t)kvType >> 4)); - valType = getTType((int8_t)((uint8_t)kvType & 0xf)); - size = (uint32_t)msize; + keyType = getTType(static_cast(static_cast(kvType) >> 4)); + valType = getTType(static_cast(static_cast(kvType) & 0xf)); + size = static_cast(msize); TMap map(keyType, valType, size); checkReadBytesAvailable(map); @@ -560,7 +560,7 @@ uint32_t TCompactProtocolT::readListBegin(TType& elemType, rsize += readByte(size_and_type); - lsize = ((uint8_t)size_and_type >> 4) & 0x0f; + lsize = (static_cast(size_and_type) >> 4) & 0x0f; if (lsize == 15) { rsize += readVarint32(lsize); } @@ -571,8 +571,8 @@ uint32_t TCompactProtocolT::readListBegin(TType& elemType, throw TProtocolException(TProtocolException::SIZE_LIMIT); } - elemType = getTType((int8_t)(size_and_type & 0x0f)); - size = (uint32_t)lsize; + elemType = getTType(static_cast(size_and_type & 0x0f)); + size = static_cast(lsize); TList list(elemType, size); checkReadBytesAvailable(list); @@ -618,7 +618,7 @@ template uint32_t TCompactProtocolT::readByte(int8_t& byte) { uint8_t b[1]; trans_->readAll(b, 1); - byte = *(int8_t*)b; + byte = static_cast(b[0]); return 1; } @@ -629,7 +629,7 @@ template uint32_t TCompactProtocolT::readI16(int16_t& i16) { int32_t value; uint32_t rsize = readVarint32(value); - i16 = (int16_t)zigzagToI32(value); + i16 = static_cast(zigzagToI32(value)); return rsize; } @@ -702,21 +702,21 @@ uint32_t TCompactProtocolT::readBinary(std::string& str) { } // Check against MaxMessageSize before alloc - trans_->checkReadBytesAvailable((uint32_t)size); + trans_->checkReadBytesAvailable(static_cast(size)); // Use the heap here to prevent stack overflow for v. large strings if (size > string_buf_size_ || string_buf_ == nullptr) { - void* new_string_buf = std::realloc(string_buf_, (uint32_t)size); + void* new_string_buf = std::realloc(string_buf_, static_cast(size)); if (new_string_buf == nullptr) { throw std::bad_alloc(); } - string_buf_ = (uint8_t*)new_string_buf; + string_buf_ = static_cast(new_string_buf); string_buf_size_ = size; } trans_->readAll(string_buf_, size); - str.assign((char*)string_buf_, size); + str.assign(reinterpret_cast(string_buf_), size); - return rsize + (uint32_t)size; + return rsize + static_cast(size); } /** @@ -727,7 +727,7 @@ template uint32_t TCompactProtocolT::readVarint32(int32_t& i32) { int64_t val; uint32_t rsize = readVarint64(val); - i32 = (int32_t)val; + i32 = static_cast(val); return rsize; } @@ -749,7 +749,7 @@ uint32_t TCompactProtocolT::readVarint64(int64_t& i64) { while (true) { uint8_t byte = borrowed[rsize]; rsize++; - val |= (uint64_t)(byte & 0x7f) << shift; + val |= static_cast(byte & 0x7f) << shift; shift += 7; if (!(byte & 0x80)) { i64 = val; @@ -768,7 +768,7 @@ uint32_t TCompactProtocolT::readVarint64(int64_t& i64) { while (true) { uint8_t byte; rsize += trans_->readAll(&byte, 1); - val |= (uint64_t)(byte & 0x7f) << shift; + val |= static_cast(byte & 0x7f) << shift; shift += 7; if (!(byte & 0x80)) { i64 = val; @@ -827,7 +827,7 @@ TType TCompactProtocolT::getTType(int8_t type) { case detail::compact::CT_STRUCT: return T_STRUCT; default: - throw TException(std::string("don't know what type: ") + (char)type); + throw TException(std::string("don't know what type: ") + static_cast(type)); } } diff --git a/lib/cpp/src/thrift/protocol/TProtocol.h b/lib/cpp/src/thrift/protocol/TProtocol.h index 035b7454d0c..37b0db71199 100644 --- a/lib/cpp/src/thrift/protocol/TProtocol.h +++ b/lib/cpp/src/thrift/protocol/TProtocol.h @@ -170,8 +170,8 @@ static inline To bitwise_cast(From from) { | (((n) & 0x0000ff00ul) << 8) \ | (((n) & 0x000000fful) << 24) ) # define bswap_16(n) \ - ( (((n) & ((unsigned short)0xff00ul)) >> 8) \ - | (((n) & ((unsigned short)0x00fful)) << 8) ) + ( (((n) & (static_cast(0xff00ul)) >> 8) \ + | (((n) & (static_cast(0x00fful)) << 8) ) # define THRIFT_htolell(n) bswap_64(n) # define THRIFT_letohll(n) bswap_64(n) # define THRIFT_htolel(n) bswap_32(n) @@ -191,11 +191,11 @@ static inline To bitwise_cast(From from) { # define THRIFT_ntohll(n) bswap_64(n) # define THRIFT_htonll(n) bswap_64(n) # elif defined(_MSC_VER) /* Microsoft Visual C++ */ -# define THRIFT_ntohll(n) ( _byteswap_uint64((uint64_t)n) ) -# define THRIFT_htonll(n) ( _byteswap_uint64((uint64_t)n) ) +# define THRIFT_ntohll(n) ( _byteswap_uint64(static_cast(n)) ) +# define THRIFT_htonll(n) ( _byteswap_uint64(static_cast(n)) ) # elif !defined(THRIFT_ntohll) /* Not GNUC/GLIBC or MSVC */ -# define THRIFT_ntohll(n) ( (((uint64_t)ntohl((uint32_t)n)) << 32) + ntohl((uint32_t)(n >> 32)) ) -# define THRIFT_htonll(n) ( (((uint64_t)htonl((uint32_t)n)) << 32) + htonl((uint32_t)(n >> 32)) ) +# define THRIFT_ntohll(n) ( (static_cast(ntohl(static_cast(n))) << 32) + ntohl(static_cast(n >> 32)) ) +# define THRIFT_htonll(n) ( (static_cast(htonl(static_cast(n))) << 32) + htonl(static_cast(n >> 32)) ) # endif /* GNUC/GLIBC or MSVC or something else */ #else /* __THRIFT_BYTE_ORDER */ # error "Can't define THRIFT_htonll or THRIFT_ntohll!" diff --git a/lib/cpp/src/thrift/transport/TBufferTransports.cpp b/lib/cpp/src/thrift/transport/TBufferTransports.cpp index f7cf8f03932..2d67aff57aa 100644 --- a/lib/cpp/src/thrift/transport/TBufferTransports.cpp +++ b/lib/cpp/src/thrift/transport/TBufferTransports.cpp @@ -256,8 +256,8 @@ void TFramedTransport::flush() { // Slip the frame size into the start of the buffer. sz_hbo = static_cast(wBase_ - (wBuf_.get() + sizeof(sz_nbo))); - sz_nbo = (int32_t)htonl((uint32_t)(sz_hbo)); - memcpy(wBuf_.get(), (uint8_t*)&sz_nbo, sizeof(sz_nbo)); + sz_nbo = static_cast(htonl(static_cast(sz_hbo))); + memcpy(wBuf_.get(), reinterpret_cast(&sz_nbo), sizeof(sz_nbo)); if (sz_hbo > 0) { // Note that we reset wBase_ (with a pad for the frame size) @@ -347,7 +347,7 @@ uint32_t TMemoryBuffer::readAppendToString(std::string& str, uint32_t len) { computeRead(len, &start, &give); // Append to the provided string. - str.append((char*)start, give); + str.append(reinterpret_cast(start), give); return give; } diff --git a/lib/cpp/src/thrift/transport/TBufferTransports.h b/lib/cpp/src/thrift/transport/TBufferTransports.h index 8518800a44f..40e2e6b6162 100644 --- a/lib/cpp/src/thrift/transport/TBufferTransports.h +++ b/lib/cpp/src/thrift/transport/TBufferTransports.h @@ -419,7 +419,7 @@ class TFramedTransport : public TVirtualTransport // Pad the buffer so we can insert the size later. int32_t pad = 0; - this->write((uint8_t*)&pad, sizeof(pad)); + this->write(reinterpret_cast(&pad), sizeof(pad)); } std::shared_ptr transport_; @@ -468,7 +468,7 @@ class TMemoryBuffer : public TVirtualTransport { if (buf == nullptr && size != 0) { assert(owner); - buf = (uint8_t*)std::malloc(size); + buf = static_cast(std::malloc(size)); if (buf == nullptr) { throw std::bad_alloc(); } @@ -593,7 +593,7 @@ class TMemoryBuffer : public TVirtualTransport { uint8_t* buf; uint32_t sz; getBuffer(&buf, &sz); - return std::string((char*)buf, (std::string::size_type)sz); + return {reinterpret_cast(buf), static_cast(sz)}; } void appendBufferToString(std::string& str) { @@ -603,7 +603,7 @@ class TMemoryBuffer : public TVirtualTransport { uint8_t* buf; uint32_t sz; getBuffer(&buf, &sz); - str.append((char*)buf, sz); + str.append(reinterpret_cast(buf), sz); } void resetBuffer() { From 7cfd0187e658d83379ddbc3639c8f8a9a34081ce Mon Sep 17 00:00:00 2001 From: dengzh Date: Mon, 24 Mar 2025 00:50:16 +0800 Subject: [PATCH 227/430] Log the exception when TThreadPoolServer breaks the work loop (#3113) Co-authored-by: dengzhihua --- .../java/org/apache/thrift/server/TThreadPoolServer.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/java/src/main/java/org/apache/thrift/server/TThreadPoolServer.java b/lib/java/src/main/java/org/apache/thrift/server/TThreadPoolServer.java index 06fdeec9ca1..5409034a918 100644 --- a/lib/java/src/main/java/org/apache/thrift/server/TThreadPoolServer.java +++ b/lib/java/src/main/java/org/apache/thrift/server/TThreadPoolServer.java @@ -277,7 +277,7 @@ public void run() { private void logException(Exception x) { // We'll usually receive RuntimeException types here // Need to unwrap to ascertain real causing exception before we choose to ignore - // Ignoring err-logging all transport-level/type exceptions and SocketExceptions + LOGGER.debug("Error processing request", x); TTransportException tTransportException = null; if (x instanceof TTransportException) { @@ -292,8 +292,7 @@ private void logException(Exception x) { case TTransportException.TIMED_OUT: return; // don't log these } - if (tTransportException.getCause() != null - && (tTransportException.getCause() instanceof SocketException)) { + if (tTransportException.getCause() instanceof SocketException) { LOGGER.warn( "SocketException occurred during processing of message.", tTransportException.getCause()); From cd0dabbed7ed0517d97e0a4e1b373306f61b71a8 Mon Sep 17 00:00:00 2001 From: "youming.whl" Date: Wed, 12 Mar 2025 13:14:25 +0800 Subject: [PATCH 228/430] Exclude binary dir in cmake when BUILD_COMPILER is OFF THRIFT_BIN_DIR doesn't exist when BUILD_COMPILER is OFF, so exclude it from ThriftConfig.cmake in this case to avoid build error. --- build/cmake/ThriftConfig.cmake.in | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/build/cmake/ThriftConfig.cmake.in b/build/cmake/ThriftConfig.cmake.in index 7c12c3f52bd..f52480104ce 100644 --- a/build/cmake/ThriftConfig.cmake.in +++ b/build/cmake/ThriftConfig.cmake.in @@ -24,9 +24,12 @@ set(THRIFT_VERSION @thrift_VERSION@) set_and_check(THRIFT_CMAKE_DIR "${CMAKE_CURRENT_LIST_DIR}") set_and_check(THRIFT_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@/thrift") -set_and_check(THRIFT_BIN_DIR "@PACKAGE_BIN_INSTALL_DIR@") -if(NOT DEFINED THRIFT_COMPILER) - set(THRIFT_COMPILER "${THRIFT_BIN_DIR}/thrift@CMAKE_EXECUTABLE_SUFFIX@") + +if(@BUILD_COMPILER@) + set_and_check(THRIFT_BIN_DIR "@PACKAGE_BIN_INSTALL_DIR@") + if(NOT DEFINED THRIFT_COMPILER) + set(THRIFT_COMPILER "${THRIFT_BIN_DIR}/thrift@CMAKE_EXECUTABLE_SUFFIX@") + endif() endif() if (NOT TARGET thrift::thrift) From b28a4c48cd03d3e637a409f7f980d372a3251907 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Wed, 26 Mar 2025 12:02:12 -0700 Subject: [PATCH 229/430] THRIFT-5859: Generate a values iterator for enum types for go Client: go The generated code looks like this: type Foo int64 const ( Foo_One Foo = 1 Foo_Two Foo = 2 ) var knownFooValues = []Foo{ Foo_One, Foo_Two, } func FooValues() iter.Seq[Foo] { return func(yield func(Foo) bool) { for _, v := range knownFooValues { if !yield(v) { return } } } } --- .../cpp/src/thrift/generate/t_go_generator.cc | 34 ++++++++++++-- lib/go/test/tests/enum_values_test.go | 44 +++++++++++++++++++ 2 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 lib/go/test/tests/enum_values_test.go diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc index 9e1865f95e8..8d0589231cd 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc @@ -706,6 +706,7 @@ string t_go_generator::go_imports_begin(bool consts) { } system_packages.push_back("errors"); system_packages.push_back("fmt"); + system_packages.push_back("iter"); system_packages.push_back("log/slog"); system_packages.push_back("time"); // For the thrift import, always do rename import to make sure it's called thrift. @@ -731,6 +732,7 @@ string t_go_generator::go_imports_end() { "var _ = context.Background\n" "var _ = errors.New\n" "var _ = fmt.Printf\n" + "var _ = iter.Pull[int]\n" "var _ = slog.Log\n" "var _ = time.Now\n" "var _ = thrift.ZERO\n" @@ -784,11 +786,13 @@ void t_go_generator::generate_typedef(t_typedef* ttypedef) { * @param tenum The enumeration */ void t_go_generator::generate_enum(t_enum* tenum) { - std::ostringstream to_string_mapping, from_string_mapping; + std::ostringstream to_string_mapping, from_string_mapping, known_values_mapping; std::string tenum_name(publicize(tenum->get_name())); generate_go_docstring(f_types_, tenum); generate_deprecation_comment(f_types_, tenum->annotations_); - f_types_ << "type " << tenum_name << " int64" << '\n' << "const (" << '\n'; + f_types_ << "type " << tenum_name << " int64" << '\n' << '\n' << "const (" << '\n'; + + known_values_mapping << indent() << "var known" << tenum_name << "Values" << " = []" << tenum_name << "{" << '\n'; to_string_mapping << indent() << "func (p " << tenum_name << ") String() string {" << '\n'; indent_up(); @@ -815,6 +819,7 @@ void t_go_generator::generate_enum(t_enum* tenum) { generate_deprecation_comment(f_types_, (*c_iter)->annotations_); f_types_ << indent() << tenum_name << "_" << iter_name << ' ' << tenum_name << " = " << value << '\n'; + known_values_mapping << indent() << tenum_name << "_" << iter_name << "," << '\n'; // Dictionaries to/from string names of enums to_string_mapping << indent() << "case " << tenum_name << "_" << iter_name << ": return \"" << iter_std_name << "\"" << '\n'; @@ -840,8 +845,29 @@ void t_go_generator::generate_enum(t_enum* tenum) { indent_down(); from_string_mapping << indent() << "}" << '\n'; - f_types_ << ")" << '\n' << '\n' << to_string_mapping.str() << '\n' << from_string_mapping.str() - << '\n' << '\n'; + known_values_mapping << indent() << "}" << '\n' << '\n'; + known_values_mapping << indent() << "func " << tenum_name << "Values() iter.Seq[" << tenum_name << "] {" << '\n'; + indent_up(); + known_values_mapping << indent() << "return func(yield func(" << tenum_name << ") bool) {" << '\n'; + indent_up(); + known_values_mapping << indent() << "for _, v := range known" << tenum_name << "Values {" << '\n'; + indent_up(); + known_values_mapping << indent() << "if !yield(v) {" << '\n'; + indent_up(); + known_values_mapping << indent() << "return" << '\n'; + indent_down(); + known_values_mapping << indent() << "}" << '\n'; + indent_down(); + known_values_mapping << indent() << "}" << '\n'; + indent_down(); + known_values_mapping << indent() << "}" << '\n'; + indent_down(); + known_values_mapping << indent() << "}" << '\n'; + + f_types_ << ")" << '\n' << '\n' + << known_values_mapping.str() << '\n' + << to_string_mapping.str() << '\n' + << from_string_mapping.str() << '\n' << '\n'; // Generate a convenience function that converts an instance of an enum // (which may be a constant) into a pointer to an instance of that enum diff --git a/lib/go/test/tests/enum_values_test.go b/lib/go/test/tests/enum_values_test.go new file mode 100644 index 00000000000..84bd2657663 --- /dev/null +++ b/lib/go/test/tests/enum_values_test.go @@ -0,0 +1,44 @@ +/* + * 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. + */ + +package tests + +import ( + "slices" + "testing" + + "github.com/apache/thrift/lib/go/test/gopath/src/constoptionalfielda" +) + +func TestEnumValues(t *testing.T) { + want := []constoptionalfielda.Foo{ + constoptionalfielda.Foo_One, + constoptionalfielda.Foo_Two, + } + got := slices.Collect(constoptionalfielda.FooValues()) + t.Logf("FooValues = %#v", got) + if len(got) != len(want) { + t.Fatalf("Want %d values in FooValues(), got %+v", len(want), got) + } + for i, v := range want { + if got[i] != v { + t.Errorf("FooValues()[%d] got %v(%d) want %v(%d)", i, got[i], got[i], v, v) + } + } +} From 135b79e3f8cc058642a6c3ec05262dda79fd5392 Mon Sep 17 00:00:00 2001 From: Asjad Syed Date: Thu, 13 Mar 2025 00:38:06 -0400 Subject: [PATCH 230/430] THRIFT-5857: Remove deprecated Tornado io_loop usage Client: py Patch: Asjad Syed This closes #3117 --- lib/py/src/TTornado.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/py/src/TTornado.py b/lib/py/src/TTornado.py index c409e09eb4c..0f741c5a4c2 100644 --- a/lib/py/src/TTornado.py +++ b/lib/py/src/TTornado.py @@ -20,6 +20,7 @@ import logging import socket import struct +import warnings from .transport.TTransport import TTransportException, TTransportBase, TMemoryBuffer @@ -66,9 +67,19 @@ def _lock_context(self): class TTornadoStreamTransport(TTransportBase): """a framed, buffered transport over a Tornado stream""" def __init__(self, host, port, stream=None, io_loop=None): + if io_loop is not None: + warnings.warn( + "The `io_loop` parameter is deprecated and unused. Passing " + "`io_loop` is unnecessary because Tornado now automatically " + "provides the current I/O loop via `IOLoop.current()`. " + "Remove the `io_loop` parameter to ensure compatibility - it " + "will be removed in a future release.", + DeprecationWarning, + stacklevel=2, + ) self.host = host self.port = port - self.io_loop = io_loop or ioloop.IOLoop.current() + self.io_loop = ioloop.IOLoop.current() self.__wbuf = BytesIO() self._read_lock = _Lock() @@ -76,7 +87,7 @@ def __init__(self, host, port, stream=None, io_loop=None): self.stream = stream def with_timeout(self, timeout, future): - return gen.with_timeout(timeout, future, self.io_loop) + return gen.with_timeout(timeout, future) @gen.coroutine def open(self, timeout=None): @@ -164,8 +175,7 @@ def __init__(self, processor, iprot_factory, oprot_factory=None, @gen.coroutine def handle_stream(self, stream, address): host, port = address[:2] - trans = TTornadoStreamTransport(host=host, port=port, stream=stream, - io_loop=self.io_loop) + trans = TTornadoStreamTransport(host=host, port=port, stream=stream) oprot = self._oprot_factory.getProtocol(trans) try: From e0d469248a5c8e408c10ab16638ee4944d4f25a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 06:52:08 +0000 Subject: [PATCH 231/430] Bump jvm from 2.1.10 to 2.1.20 in /lib/kotlin Bumps [jvm](https://github.com/JetBrains/kotlin) from 2.1.10 to 2.1.20. - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.1.10...v2.1.20) --- updated-dependencies: - dependency-name: jvm dependency-version: 2.1.20 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lib/kotlin/settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/kotlin/settings.gradle.kts b/lib/kotlin/settings.gradle.kts index 77672a55512..2311a730883 100644 --- a/lib/kotlin/settings.gradle.kts +++ b/lib/kotlin/settings.gradle.kts @@ -18,7 +18,7 @@ */ pluginManagement { plugins { - kotlin("jvm") version "2.1.10" + kotlin("jvm") version "2.1.20" id("com.ncorti.ktfmt.gradle") version "0.20.1" } } From 4c219f3f64ae9dd8df82b1fbd58f96e76524ae52 Mon Sep 17 00:00:00 2001 From: Gabe Jones Date: Wed, 2 Apr 2025 12:03:55 -0500 Subject: [PATCH 232/430] Change SSL_get_verify_result() return value from int to long --- lib/cpp/src/thrift/transport/TSSLSocket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cpp/src/thrift/transport/TSSLSocket.cpp b/lib/cpp/src/thrift/transport/TSSLSocket.cpp index aaedf901af1..3dc6585588e 100644 --- a/lib/cpp/src/thrift/transport/TSSLSocket.cpp +++ b/lib/cpp/src/thrift/transport/TSSLSocket.cpp @@ -705,7 +705,7 @@ void TSSLSocket::initializeHandshake() { } void TSSLSocket::authorize() { - int rc = SSL_get_verify_result(ssl_); + long rc = SSL_get_verify_result(ssl_); if (rc != X509_V_OK) { // verify authentication result throw TSSLException(string("SSL_get_verify_result(), ") + X509_verify_cert_error_string(rc)); } From 32ce699a5ccfdb7125e9ac69959859233cfa629e Mon Sep 17 00:00:00 2001 From: dengzhihua Date: Fri, 21 Mar 2025 19:16:17 +0800 Subject: [PATCH 233/430] THRIFT-5858: Introduce new type MESSAGE_SIZE_LIMIT in TTransportException --- .../apache/thrift/transport/TEndpointTransport.java | 12 +++++++++--- .../apache/thrift/transport/TTransportException.java | 1 + .../org/apache/thrift/protocol/ProtocolTestBase.java | 8 ++++---- .../org/apache/thrift/transport/TestTByteBuffer.java | 2 +- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/java/src/main/java/org/apache/thrift/transport/TEndpointTransport.java b/lib/java/src/main/java/org/apache/thrift/transport/TEndpointTransport.java index 72bf9539180..6026390413c 100644 --- a/lib/java/src/main/java/org/apache/thrift/transport/TEndpointTransport.java +++ b/lib/java/src/main/java/org/apache/thrift/transport/TEndpointTransport.java @@ -65,7 +65,9 @@ protected void resetConsumedMessageSize(long newSize) throws TTransportException // update only: message size can shrink, but not grow if (newSize > knownMessageSize) - throw new TTransportException(TTransportException.END_OF_FILE, "MaxMessageSize reached"); + throw new TTransportException( + TTransportException.MESSAGE_SIZE_LIMIT, + "Message size exceeds limit: " + getMaxMessageSize()); knownMessageSize = newSize; remainingMessageSize = newSize; @@ -91,7 +93,9 @@ public void updateKnownMessageSize(long size) throws TTransportException { */ public void checkReadBytesAvailable(long numBytes) throws TTransportException { if (remainingMessageSize < numBytes) - throw new TTransportException(TTransportException.END_OF_FILE, "MaxMessageSize reached"); + throw new TTransportException( + TTransportException.MESSAGE_SIZE_LIMIT, + "Message size exceeds limit: " + getMaxMessageSize()); } /** @@ -104,7 +108,9 @@ protected void countConsumedMessageBytes(long numBytes) throws TTransportExcepti remainingMessageSize -= numBytes; } else { remainingMessageSize = 0; - throw new TTransportException(TTransportException.END_OF_FILE, "MaxMessageSize reached"); + throw new TTransportException( + TTransportException.MESSAGE_SIZE_LIMIT, + "Message size exceeds limit: " + getMaxMessageSize()); } } } diff --git a/lib/java/src/main/java/org/apache/thrift/transport/TTransportException.java b/lib/java/src/main/java/org/apache/thrift/transport/TTransportException.java index cc7532f2ad1..a7ebed6e32d 100644 --- a/lib/java/src/main/java/org/apache/thrift/transport/TTransportException.java +++ b/lib/java/src/main/java/org/apache/thrift/transport/TTransportException.java @@ -32,6 +32,7 @@ public class TTransportException extends TException { public static final int TIMED_OUT = 3; public static final int END_OF_FILE = 4; public static final int CORRUPTED_DATA = 5; + public static final int MESSAGE_SIZE_LIMIT = 6; protected int type_ = UNKNOWN; diff --git a/lib/java/src/test/java/org/apache/thrift/protocol/ProtocolTestBase.java b/lib/java/src/test/java/org/apache/thrift/protocol/ProtocolTestBase.java index 455f9e87277..45d3db2173b 100644 --- a/lib/java/src/test/java/org/apache/thrift/protocol/ProtocolTestBase.java +++ b/lib/java/src/test/java/org/apache/thrift/protocol/ProtocolTestBase.java @@ -554,7 +554,7 @@ public void testReadCheckMaxMessageRequestForString() throws TException { String result = testClient.recv_testString(); System.out.println("----result: " + result); } catch (TException e) { - assertEquals("MaxMessageSize reached", e.getMessage()); + assertEquals(TTransportException.MESSAGE_SIZE_LIMIT, ((TTransportException) e).getType()); } } @@ -573,7 +573,7 @@ public void testReadCheckMaxMessageRequestForList() throws TException { testClient.recv_testList(); }, "Limitations not achieved as expected"); - assertEquals("MaxMessageSize reached", e.getMessage()); + assertEquals(TTransportException.MESSAGE_SIZE_LIMIT, e.getType()); } @Test @@ -595,7 +595,7 @@ public void testReadCheckMaxMessageRequestForMap() throws TException { }, "Limitations not achieved as expected"); - assertEquals("MaxMessageSize reached", e.getMessage()); + assertEquals(TTransportException.MESSAGE_SIZE_LIMIT, e.getType()); } @Test @@ -614,6 +614,6 @@ public void testReadCheckMaxMessageRequestForSet() throws TException { testClient.recv_testSet(); }, "Limitations not achieved as expected"); - assertEquals("MaxMessageSize reached", e.getMessage()); + assertEquals(TTransportException.MESSAGE_SIZE_LIMIT, e.getType()); } } diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTByteBuffer.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTByteBuffer.java index 26ffc5d58f3..163186a601a 100644 --- a/lib/java/src/test/java/org/apache/thrift/transport/TestTByteBuffer.java +++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTByteBuffer.java @@ -52,7 +52,7 @@ public void testSmallTConfiguration() throws Exception { assertThrows( TTransportException.class, () -> new TByteBuffer(configSmall, ByteBuffer.allocate(100))); - assertEquals("MaxMessageSize reached", e.getMessage()); + assertEquals(TTransportException.MESSAGE_SIZE_LIMIT, e.getType()); } @Test From c5c0e6effed33b076b558f42c52ec5fcb26a208e Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Fri, 4 Apr 2025 10:38:57 +0300 Subject: [PATCH 234/430] Minor Erlang generator improvements Changes: * Comment unions with 'union' in Erlang * Add string type definition strategy * Add support for new sets implementation * Respect new string and set strategy in constant and default values --- .../src/thrift/generate/t_erl_generator.cc | 96 +++++++++++++++++-- 1 file changed, 90 insertions(+), 6 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_erl_generator.cc b/compiler/cpp/src/thrift/generate/t_erl_generator.cc index f28c7fd81d5..7dbe9f1f3b1 100644 --- a/compiler/cpp/src/thrift/generate/t_erl_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_erl_generator.cc @@ -39,6 +39,16 @@ using std::string; using std::stringstream; using std::vector; +/** + * Helper enum for string mapping + */ +enum class StringTo {String, Binary, Both}; + +/** + * Helper enum for sets mapping + */ +enum class SetsTo {V1, V2}; + /** * Erlang code generator. * @@ -58,6 +68,8 @@ class t_erl_generator : public t_generator { maps_ = false; export_lines_first_ = true; export_types_lines_first_ = true; + string_to_ = StringTo::Both; + sets_to_ = SetsTo::V1; for( iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) { if( iter->first.compare("legacynames") == 0) { @@ -68,6 +80,26 @@ class t_erl_generator : public t_generator { delimiter_ = iter->second; } else if( iter->first.compare("app_prefix") == 0) { app_prefix_ = iter->second; + } else if( iter->first.compare("string") == 0) { + auto string_to_value = iter->second; + if( string_to_value.compare("string") == 0) { + string_to_ = StringTo::String; + } else if( string_to_value.compare("binary") == 0) { + string_to_ = StringTo::Binary; + } else if( string_to_value.compare("both") == 0) { + string_to_ = StringTo::Both; + } else { + throw "unknown string option value:" + string_to_value; + } + } else if( iter->first.compare("set") == 0) { + auto set_to_value = iter->second; + if( set_to_value.compare("v1") == 0) { + sets_to_ = SetsTo::V1; + } else if( set_to_value.compare("v2") == 0) { + sets_to_ = SetsTo::V2; + } else { + throw "unknown set option value:" + set_to_value; + } } else { throw "unknown option erl:" + iter->first; } @@ -100,11 +132,13 @@ class t_erl_generator : public t_generator { std::string render_member_type(t_field* field); std::string render_member_value(t_field* field); std::string render_member_requiredness(t_field* field); + std::string render_string_type(); // std::string render_default_value(t_type* type); std::string render_default_value(t_field* field); std::string render_const_value(t_type* type, t_const_value* value); std::string render_type_term(t_type* ttype, bool expand_structs, bool extended_info = false); + std::string render_default_sets_value(); /** * Struct generation code @@ -140,6 +174,7 @@ class t_erl_generator : public t_generator { std::string render_includes(); std::string type_name(t_type* ttype); std::string render_const_list_values(t_type* type, t_const_value* value); + std::string render_const_string_value(t_const_value* value); std::string function_signature(t_function* tfunction, std::string prefix = ""); @@ -188,6 +223,12 @@ class t_erl_generator : public t_generator { /* used to avoid module name clashes for different applications */ std::string app_prefix_; + /* string type definition strategy */ + StringTo string_to_; + + /* sets type definition strategy */ + SetsTo sets_to_; + /** * add function to export list */ @@ -593,7 +634,7 @@ string t_erl_generator::render_const_value(t_type* type, t_const_value* value) { t_base_type::t_base tbase = ((t_base_type*)type)->get_base(); switch (tbase) { case t_base_type::TYPE_STRING: - out << '"' << get_escaped_string(value) << '"'; + out << render_const_string_value(value); break; case t_base_type::TYPE_BOOL: out << (value->get_integer() > 0 ? "true" : "false"); @@ -676,7 +717,11 @@ string t_erl_generator::render_const_value(t_type* type, t_const_value* value) { out << ","; } } - out << "])"; + out << "]"; + if (sets_to_ == SetsTo::V2) { + out << ", [{version, 2}]"; + } + out << ")"; } else if (type->is_list()) { out << "[" << render_const_list_values(type, value) << "]"; } else { @@ -703,6 +748,13 @@ string t_erl_generator::render_const_list_values(t_type* type, t_const_value* va return out.str(); } +string t_erl_generator::render_const_string_value(t_const_value* constval) { + if (string_to_ == StringTo::Binary) { + return "<<\"" + get_escaped_string(constval) + "\">>"; + } + return '"' + get_escaped_string(constval) + '"'; +} + string t_erl_generator::render_default_value(t_field* field) { t_type* type = field->get_type(); @@ -715,7 +767,7 @@ string t_erl_generator::render_default_value(t_field* field) { return "dict:new()"; } } else if (type->is_set()) { - return "sets:new()"; + return render_default_sets_value(); } else if (type->is_list()) { return "[]"; } else { @@ -723,13 +775,24 @@ string t_erl_generator::render_default_value(t_field* field) { } } +string t_erl_generator::render_default_sets_value() { + switch (sets_to_) { + case SetsTo::V1: + return "sets:new()"; + case SetsTo::V2: + return "sets:new([{version,2}])"; + default: + throw "compiler error: unsupported set type"; + } +} + string t_erl_generator::render_member_type(t_field* field) { t_type* type = get_true_type(field->get_type()); if (type->is_base_type()) { t_base_type::t_base tbase = ((t_base_type*)type)->get_base(); switch (tbase) { case t_base_type::TYPE_STRING: - return "string() | binary()"; + return render_string_type(); case t_base_type::TYPE_BOOL: return "boolean()"; case t_base_type::TYPE_I8: @@ -761,6 +824,19 @@ string t_erl_generator::render_member_type(t_field* field) { } } +string t_erl_generator::render_string_type() { + switch (string_to_) { + case StringTo::String: + return "string()"; + case StringTo::Binary: + return "binary()"; + case StringTo::Both: + return "string() | binary()"; + default: + throw "compiler error: unsupported string type"; + } +} + string t_erl_generator::render_member_requiredness(t_field* field) { switch (field->get_req()) { case t_field::T_REQUIRED: @@ -807,7 +883,13 @@ void t_erl_generator::generate_erl_struct(t_struct* tstruct, bool is_exception) * @param tstruct The struct definition */ void t_erl_generator::generate_erl_struct_definition(ostream& out, t_struct* tstruct) { - indent(out) << "%% struct " << type_name(tstruct) << '\n' << '\n'; + indent(out) << "%% "; + if (tstruct->is_union()) { + out << "union "; + } else { + out << "struct "; + } + out << type_name(tstruct) << '\n' << '\n'; std::stringstream buf; buf << indent() << "-record(" << type_name(tstruct) << ", {"; @@ -1290,4 +1372,6 @@ THRIFT_REGISTER_GENERATOR( " legacynames: Output files retain naming conventions of Thrift 0.9.1 and earlier.\n" " delimiter= Delimiter between namespace prefix and record name. Default is '.'.\n" " app_prefix= Application prefix for generated Erlang files.\n" - " maps: Generate maps instead of dicts.\n") + " maps: Generate maps instead of dicts.\n" + " string= Define string as 'string', 'binary' or 'both'. Default is 'both'.\n" + " set= Define sets implementation, supported 'v1' and 'v2'. Default is 'v1'.\n") From 0414755b6080e53c9de087912bafce264c07da9a Mon Sep 17 00:00:00 2001 From: Asjad Syed Date: Tue, 8 Apr 2025 14:51:30 -0400 Subject: [PATCH 235/430] THRIFT-5861: Add isOpen method to TTornadoStreamTransport --- lib/py/src/TTornado.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/py/src/TTornado.py b/lib/py/src/TTornado.py index 0f741c5a4c2..c7218301afd 100644 --- a/lib/py/src/TTornado.py +++ b/lib/py/src/TTornado.py @@ -89,6 +89,11 @@ def __init__(self, host, port, stream=None, io_loop=None): def with_timeout(self, timeout, future): return gen.with_timeout(timeout, future) + def isOpen(self): + if self.stream is None: + return False + return not self.stream.closed() + @gen.coroutine def open(self, timeout=None): logger.debug('socket connecting') From 7e45f58ad7b6553ecd64c7472d392c31a6e0e2ac Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Thu, 17 Apr 2025 08:41:21 -0700 Subject: [PATCH 236/430] Remove ubuntu-20.04 from github actions This is fully unsupported [1], and prevents further tests from running. [1]: https://github.com/actions/runner-images/issues/11101 --- .github/workflows/build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 57730c076fd..98ff15c5383 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,7 +41,9 @@ jobs: compiler: strategy: matrix: - os: [ubuntu-20.04, ubuntu-22.04, ubuntu-24.04] + os: + - ubuntu-22.04 + - ubuntu-24.04 fail-fast: false runs-on: ${{ matrix.os }} steps: From 4bacc1a8df30b2c4fd55bbca0d2fa07c749b0d0a Mon Sep 17 00:00:00 2001 From: Vlad Date: Thu, 17 Apr 2025 16:32:06 +0000 Subject: [PATCH 237/430] remove unused writeUtf8 and readUtf8 from TProtocol.py (#3123) cleanup after https://github.com/apache/thrift/pull/3105 --- lib/py/src/protocol/TProtocol.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/py/src/protocol/TProtocol.py b/lib/py/src/protocol/TProtocol.py index a7336c5b096..5b4f4d85d81 100644 --- a/lib/py/src/protocol/TProtocol.py +++ b/lib/py/src/protocol/TProtocol.py @@ -121,9 +121,6 @@ def writeString(self, str_val): def writeBinary(self, str_val): pass - def writeUtf8(self, str_val): - self.writeString(str_val.encode('utf-8')) - def readMessageBegin(self): pass @@ -184,9 +181,6 @@ def readString(self): def readBinary(self): pass - def readUtf8(self): - return self.readString().decode('utf-8') - def skip(self, ttype): if ttype == TType.BOOL: self.readBool() From 0481fcdf93a5bac9a28355429672885fd105c10e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Dura-Kov=C3=A1cs?= Date: Sun, 9 Mar 2025 23:57:56 +0100 Subject: [PATCH 238/430] =?UTF-8?q?THRIFT-1482=20Allow=20unix=20domain=20s?= =?UTF-8?q?ockets=20in=20TSocket=20Client:=20php=20Patch:=20Bal=C3=A1zs=20?= =?UTF-8?q?Dura-Kov=C3=A1cs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This closes #3109 --- lib/php/lib/Transport/TSocket.php | 2 +- .../test/Unit/Lib/Transport/TSocketTest.php | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/php/lib/Transport/TSocket.php b/lib/php/lib/Transport/TSocket.php index fb74fdbf6aa..c220a8b066b 100644 --- a/lib/php/lib/Transport/TSocket.php +++ b/lib/php/lib/Transport/TSocket.php @@ -218,7 +218,7 @@ public function open() throw new TTransportException('Cannot open null host', TTransportException::NOT_OPEN); } - if ($this->port_ <= 0) { + if ($this->port_ <= 0 && strpos($this->host_, 'unix://') !== 0) { throw new TTransportException('Cannot open without port', TTransportException::NOT_OPEN); } diff --git a/lib/php/test/Unit/Lib/Transport/TSocketTest.php b/lib/php/test/Unit/Lib/Transport/TSocketTest.php index 6bab297ea2d..3a6a5ebfab1 100644 --- a/lib/php/test/Unit/Lib/Transport/TSocketTest.php +++ b/lib/php/test/Unit/Lib/Transport/TSocketTest.php @@ -246,6 +246,33 @@ public function testOpenPersist() $this->assertTrue($transport->isOpen()); } + public function testOpenUnixSocket() + { + $host = 'unix:///tmp/ipc.sock'; + $port = -1; + $persist = false; + $debugHandler = null; + + $this->getFunctionMock('Thrift\Transport', 'fsockopen') + ->expects($this->once()) + ->with( + $host, + $port, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything() #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + ); + + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + + $transport->open(); + } + /** * @dataProvider open_THRIFT_5132_DataProvider */ From 1834bfc9573be8d8e246c60b520507bd8cec820f Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 18 Apr 2025 11:13:32 +0200 Subject: [PATCH 239/430] added -y switch to prevent hang during CI run --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 98ff15c5383..5ff30cf7515 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -317,7 +317,7 @@ jobs: # caveat: net9 is (currently?) NOT installed, so manually again - name: Set up .NET SDK run: | - sudo add-apt-repository ppa:dotnet/backports + sudo add-apt-repository -y ppa:dotnet/backports sudo apt-get install -y --no-install-recommends dotnet-sdk-9.0 # end From 58d68c6bdb8dcbf655e79d9a26c521400f038e3e Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 18 Apr 2025 11:28:00 +0200 Subject: [PATCH 240/430] Revert "THRIFT-1482 Allow unix domain sockets in TSocket" This reverts commit 0481fcdf93a5bac9a28355429672885fd105c10e. --- lib/php/lib/Transport/TSocket.php | 2 +- .../test/Unit/Lib/Transport/TSocketTest.php | 27 ------------------- 2 files changed, 1 insertion(+), 28 deletions(-) diff --git a/lib/php/lib/Transport/TSocket.php b/lib/php/lib/Transport/TSocket.php index c220a8b066b..fb74fdbf6aa 100644 --- a/lib/php/lib/Transport/TSocket.php +++ b/lib/php/lib/Transport/TSocket.php @@ -218,7 +218,7 @@ public function open() throw new TTransportException('Cannot open null host', TTransportException::NOT_OPEN); } - if ($this->port_ <= 0 && strpos($this->host_, 'unix://') !== 0) { + if ($this->port_ <= 0) { throw new TTransportException('Cannot open without port', TTransportException::NOT_OPEN); } diff --git a/lib/php/test/Unit/Lib/Transport/TSocketTest.php b/lib/php/test/Unit/Lib/Transport/TSocketTest.php index 3a6a5ebfab1..6bab297ea2d 100644 --- a/lib/php/test/Unit/Lib/Transport/TSocketTest.php +++ b/lib/php/test/Unit/Lib/Transport/TSocketTest.php @@ -246,33 +246,6 @@ public function testOpenPersist() $this->assertTrue($transport->isOpen()); } - public function testOpenUnixSocket() - { - $host = 'unix:///tmp/ipc.sock'; - $port = -1; - $persist = false; - $debugHandler = null; - - $this->getFunctionMock('Thrift\Transport', 'fsockopen') - ->expects($this->once()) - ->with( - $host, - $port, - $this->anything(), #$errno, - $this->anything(), #$errstr, - $this->anything() #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), - ); - - $transport = new TSocket( - $host, - $port, - $persist, - $debugHandler - ); - - $transport->open(); - } - /** * @dataProvider open_THRIFT_5132_DataProvider */ From b4d2d919ad1d4c2e6611917e4c529673a49c6628 Mon Sep 17 00:00:00 2001 From: Will Milton Date: Mon, 21 Apr 2025 14:52:45 -0500 Subject: [PATCH 241/430] Fix field stop read in duplicate_protocol.go (#3125) When generated code reads a struct, it runs a `for` loop calling `ReadFieldBegin` at the top, but breaks if the field type ID is `thrift.STOP`. With TDuplicateToProtocol naively writing everything read, this results in extra writes, which breaks just about any protocol in the `DuplicateTo` struct field. The proposed fix is to simply add special handling for `thrift.STOP` to `ReadFieldBegin`. I'm no thrift expert, so I have no idea how other libraries handle this concern. Ideally, it seems like each protocol should understand and enforce the invariant that an attempt to call `WriteFieldBegin` with type ID 0 either isn't valid or is a misguided attempt to call `WriteFieldStop`. Co-authored-by: Yuxuan 'fishy' Wang --- lib/go/thrift/duplicate_protocol.go | 4 ++ lib/go/thrift/duplicate_protocol_test.go | 52 ++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 lib/go/thrift/duplicate_protocol_test.go diff --git a/lib/go/thrift/duplicate_protocol.go b/lib/go/thrift/duplicate_protocol.go index 6413909d482..a9eb7eb24e1 100644 --- a/lib/go/thrift/duplicate_protocol.go +++ b/lib/go/thrift/duplicate_protocol.go @@ -198,6 +198,10 @@ func (tdtp *TDuplicateToProtocol) ReadStructEnd(ctx context.Context) (err error) func (tdtp *TDuplicateToProtocol) ReadFieldBegin(ctx context.Context) (name string, typeId TType, id int16, err error) { name, typeId, id, err = tdtp.Delegate.ReadFieldBegin(ctx) + if typeId == STOP { + tdtp.DuplicateTo.WriteFieldStop(ctx) + return + } tdtp.DuplicateTo.WriteFieldBegin(ctx, name, typeId, id) return } diff --git a/lib/go/thrift/duplicate_protocol_test.go b/lib/go/thrift/duplicate_protocol_test.go new file mode 100644 index 00000000000..6674f0442c5 --- /dev/null +++ b/lib/go/thrift/duplicate_protocol_test.go @@ -0,0 +1,52 @@ +package thrift + +import ( + "bytes" + "context" + "encoding/json" + "testing" +) + +func TestDuplicateToJSONReadMakesEqualJSON(t *testing.T) { + delegateBuf := NewTMemoryBuffer() + iprot := NewTJSONProtocolFactory().GetProtocol(delegateBuf) + + s := NewMyTestStruct() + ctx := context.Background() + s.Write(ctx, iprot) + + iprot.Flush(ctx) + jsonBytesWritten := delegateBuf.Bytes() + + if err := json.Unmarshal(jsonBytesWritten, NewMyTestStruct()); err != nil { + t.Errorf("error unmarshaling written bytes: %s", err) + } + + duplicateBuf := NewTMemoryBuffer() + dupProto := NewTJSONProtocolFactory().GetProtocol(duplicateBuf) + proto := &TDuplicateToProtocol{ + Delegate: NewTJSONProtocolFactory().GetProtocol(delegateBuf), + DuplicateTo: dupProto, + } + + if err := s.Read(ctx, proto); err != nil { + t.Errorf("error reading struct from DuplicateTo: %s", err) + } + dupProto.Flush(ctx) + + jsonBytesRead := duplicateBuf.Bytes() + + if !bytes.Equal(jsonBytesWritten, jsonBytesRead) { + t.Errorf(`bytes read into duplicate do not equal bytes written + read: + %s + written: + %s + `, jsonBytesRead, jsonBytesWritten) + } + + dup := NewMyTestStruct() + if err := dup.Read(ctx, dupProto); err != nil { + t.Errorf("error reading struct from duplicated protocol: %s", err) + } +} From 5e6d1b747a4de9ba0ff7b2b8746bce5fb2b0dfc5 Mon Sep 17 00:00:00 2001 From: dengzh Date: Fri, 25 Apr 2025 13:00:24 +0800 Subject: [PATCH 242/430] TestTServletServer doesn't accept the request --- .../java/org/apache/thrift/test/TestTServletServer.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/java/src/crossTest/java/org/apache/thrift/test/TestTServletServer.java b/lib/java/src/crossTest/java/org/apache/thrift/test/TestTServletServer.java index 574cae64a44..6318c09b752 100644 --- a/lib/java/src/crossTest/java/org/apache/thrift/test/TestTServletServer.java +++ b/lib/java/src/crossTest/java/org/apache/thrift/test/TestTServletServer.java @@ -19,6 +19,7 @@ package org.apache.thrift.test; +import org.apache.catalina.connector.Connector; import org.apache.catalina.core.StandardContext; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.Tomcat.FixContextListener; @@ -30,8 +31,11 @@ public class TestTServletServer { public static void main(String[] args) throws Exception { Tomcat tomcat = new Tomcat(); - tomcat.setPort(port); tomcat.setBaseDir(System.getProperty("user.dir") + "\\build"); + // Add a connector for the tomcat so that it can accept the request + Connector connector = new Connector(); + connector.setPort(port); + tomcat.getService().addConnector(connector); tomcat.getHost().setAutoDeploy(false); String contextPath = "/test"; From b3fc4b224258e4bf154bf774746f0d2554edb90c Mon Sep 17 00:00:00 2001 From: Vyas Ramasubramani Date: Sun, 20 Apr 2025 13:57:06 -0700 Subject: [PATCH 243/430] Update minimum required CMake version for CMake 4.0 compatibility --- CMakeLists.txt | 2 +- compiler/cpp/CMakeLists.txt | 2 +- compiler/cpp/tests/CMakeLists.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b76d7035b22..1f74e75c5f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ # under the License. # -cmake_minimum_required(VERSION 3.4) +cmake_minimum_required(VERSION 3.16) if(POLICY CMP0048) cmake_policy(SET CMP0048 NEW) # package version behavior added in cmake 3.0 diff --git a/compiler/cpp/CMakeLists.txt b/compiler/cpp/CMakeLists.txt index b0f123555d8..4c1c2c56a55 100644 --- a/compiler/cpp/CMakeLists.txt +++ b/compiler/cpp/CMakeLists.txt @@ -17,7 +17,7 @@ # under the License. # -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.16) project("thrift-compiler" VERSION ${PACKAGE_VERSION}) # version.h now handled via veralign.sh diff --git a/compiler/cpp/tests/CMakeLists.txt b/compiler/cpp/tests/CMakeLists.txt index d9c5209134c..6a078ec6304 100644 --- a/compiler/cpp/tests/CMakeLists.txt +++ b/compiler/cpp/tests/CMakeLists.txt @@ -16,7 +16,7 @@ # specific language governing permissions and limitations # under the License. # -cmake_minimum_required(VERSION 2.8.12) +cmake_minimum_required(VERSION 3.16) project(thrift_compiler_tests) From 74ee8b006a0da8c9145240ddcbdcba7fbef2b0b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Dura-Kov=C3=A1cs?= Date: Sun, 9 Mar 2025 23:57:56 +0100 Subject: [PATCH 244/430] =?UTF-8?q?THRIFT-1482:=20Unix=20domain=20socket?= =?UTF-8?q?=20support=20under=20PHP=20Client:=20php=20Patch:=20Bal=C3=A1zs?= =?UTF-8?q?=20Dura-Kov=C3=A1cs,=20Volodymyr=20Panivko?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This closes #3109 This closes #3130 --- lib/php/lib/Transport/TSocket.php | 2 +- .../test/Unit/Lib/Transport/TSocketTest.php | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/lib/php/lib/Transport/TSocket.php b/lib/php/lib/Transport/TSocket.php index fb74fdbf6aa..c220a8b066b 100644 --- a/lib/php/lib/Transport/TSocket.php +++ b/lib/php/lib/Transport/TSocket.php @@ -218,7 +218,7 @@ public function open() throw new TTransportException('Cannot open null host', TTransportException::NOT_OPEN); } - if ($this->port_ <= 0) { + if ($this->port_ <= 0 && strpos($this->host_, 'unix://') !== 0) { throw new TTransportException('Cannot open without port', TTransportException::NOT_OPEN); } diff --git a/lib/php/test/Unit/Lib/Transport/TSocketTest.php b/lib/php/test/Unit/Lib/Transport/TSocketTest.php index 6bab297ea2d..a0817a8a587 100644 --- a/lib/php/test/Unit/Lib/Transport/TSocketTest.php +++ b/lib/php/test/Unit/Lib/Transport/TSocketTest.php @@ -246,6 +246,50 @@ public function testOpenPersist() $this->assertTrue($transport->isOpen()); } + public function testOpenUnixSocket() + { + $host = 'unix:///tmp/ipc.sock'; + $port = -1; + $persist = false; + $debugHandler = null; + $handle = fopen('php://memory', 'r+'); + + $this->getFunctionMock('Thrift\Transport', 'fsockopen') + ->expects($this->once()) + ->with( + $host, + $port, + $this->anything(), #$errno, + $this->anything(), #$errstr, + $this->anything() #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + ) + ->willReturn($handle); + + $this->getFunctionMock('Thrift\Transport', 'socket_import_stream') + ->expects($this->once()) + ->with($handle) + ->willReturn(true); + + $this->getFunctionMock('Thrift\Transport', 'socket_set_option') + ->expects($this->once()) + ->with( + $this->anything(), #$socket, + SOL_TCP, #$level + TCP_NODELAY, #$option + 1 #$value + ) + ->willReturn(true); + + $transport = new TSocket( + $host, + $port, + $persist, + $debugHandler + ); + + $transport->open(); + } + /** * @dataProvider open_THRIFT_5132_DataProvider */ From 47d0fbb1fae1040f8d83f8cfa72f243dbc132dca Mon Sep 17 00:00:00 2001 From: Andy Best Date: Thu, 17 Nov 2022 17:00:19 +0000 Subject: [PATCH 245/430] Add Package.swift to root of repo Client: Swift This allows the Swift client library to be used as a Swift Package Manager dependency. [skip ci] --- Package.swift | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 Package.swift diff --git a/Package.swift b/Package.swift new file mode 100644 index 00000000000..773ea0569cc --- /dev/null +++ b/Package.swift @@ -0,0 +1,32 @@ +// swift-tools-version:5.1 +/* + * 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. + */ + +import PackageDescription + +let package = Package( + name: "Thrift", + products: [ + .library(name: "Thrift", targets: ["Thrift"]) + ], + targets: [ + .target(name: "Thrift", path: "lib/swift/Sources"), + .testTarget(name: "ThriftTests", dependencies: ["Thrift"], path: "lib/swift/Tests/ThriftTests") + ] +) From 29d8773e7c1099133e88e0c37be7a5b228904be5 Mon Sep 17 00:00:00 2001 From: Kino Roy Date: Mon, 20 Feb 2023 22:32:43 -0800 Subject: [PATCH 246/430] THRIFT-4838: Add unix socket support for Swift Client: Swift Patch: Kino Roy --- .github/workflows/build.yml | 3 + LANGUAGES.md | 2 +- lib/swift/Sources/LinuxHelper.swift | 2 +- lib/swift/Sources/TSocketServer.swift | 44 +++++++++ lib/swift/Sources/TSocketTransport.swift | 9 ++ lib/swift/Sources/UnixSocket.swift | 92 +++++++++++++++++++ .../CrossTests/Sources/TestClient/main.swift | 7 +- .../CrossTests/Sources/TestServer/main.swift | 22 ++++- test/tests.json | 4 +- 9 files changed, 175 insertions(+), 10 deletions(-) create mode 100644 lib/swift/Sources/UnixSocket.swift diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5ff30cf7515..188bdf855a2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -624,6 +624,9 @@ jobs: test/rs/bin/* \ test/go/bin/* + - name: Create tmp domain socket folder + run: mkdir /tmp/v0.16 + - name: Run cross test env: THRIFT_CROSSTEST_CONCURRENCY: 4 diff --git a/LANGUAGES.md b/LANGUAGES.md index f7108a7aaa8..27877ba8d3d 100644 --- a/LANGUAGES.md +++ b/LANGUAGES.md @@ -350,7 +350,7 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr Yes 5.7 Yes -YesYesYesYes +YesYesYesYesYes YesYes YesYesYes Yes diff --git a/lib/swift/Sources/LinuxHelper.swift b/lib/swift/Sources/LinuxHelper.swift index 83603f87996..7ab0b3e7964 100644 --- a/lib/swift/Sources/LinuxHelper.swift +++ b/lib/swift/Sources/LinuxHelper.swift @@ -27,7 +27,7 @@ import CoreFoundation extension UInt { public static func &(lhs: UInt, rhs: Int) -> UInt { - let cast = unsafeBitCast(rhs, to: UInt.self) + let cast = UInt(bitPattern: rhs) return lhs & cast } } diff --git a/lib/swift/Sources/TSocketServer.swift b/lib/swift/Sources/TSocketServer.swift index 6cd9adfe41c..27b4b5521f1 100644 --- a/lib/swift/Sources/TSocketServer.swift +++ b/lib/swift/Sources/TSocketServer.swift @@ -102,6 +102,49 @@ open class TSocketServer Int32 { + let socketAddressCasted = withUnsafePointer(to: &socketAddress) { + $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { + return $0 + } + } + return Sys.connect(fd, socketAddressCasted, socklen_t(MemoryLayout.size(ofValue: socketAddress))) + } + public func bind() -> Int32 { + let socketAddressCasted = withUnsafePointer(to: &socketAddress) { + $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { + return $0 + } + } + return Sys.bind(fd, socketAddressCasted, socklen_t(MemoryLayout.size(ofValue: socketAddress))) + } +} diff --git a/test/swift/CrossTests/Sources/TestClient/main.swift b/test/swift/CrossTests/Sources/TestClient/main.swift index 6817981266c..d6274086942 100644 --- a/test/swift/CrossTests/Sources/TestClient/main.swift +++ b/test/swift/CrossTests/Sources/TestClient/main.swift @@ -40,7 +40,12 @@ class TestClient { } static func getTransport(parameters: TestClientParameters) throws -> TTransport { - let socketTransport = try TSocketTransport(hostname: parameters.host!, port: parameters.port!) + let socketTransport: TTransport = try { () throws -> TTransport in + if let domainSocket = parameters.domainSocket { + return try TSocketTransport(path: domainSocket) + } + return try TSocketTransport(hostname: parameters.host!, port: parameters.port!) + }() if parameters.transport == .framed { return TFramedTransport(transport: socketTransport) } diff --git a/test/swift/CrossTests/Sources/TestServer/main.swift b/test/swift/CrossTests/Sources/TestServer/main.swift index 15564d3e6ff..433bde7021e 100644 --- a/test/swift/CrossTests/Sources/TestServer/main.swift +++ b/test/swift/CrossTests/Sources/TestServer/main.swift @@ -34,19 +34,31 @@ class TestServer { let processor = ThriftTestProcessor(service: service) - switch (parameters.proto, parameters.transport) { - case (.binary, .buffered): + switch (parameters.proto, parameters.transport, parameters.domainSocket) { + case (.binary, .buffered, .none): let proto = TBinaryProtocol.self server = try TSocketServer(port: parameters.port!, inProtocol: proto, outProtocol: proto, processor: processor) - case (.binary, .framed): + case (.binary, .framed, .none): let proto = TBinaryProtocol.self server = try TFramedSocketServer(port: parameters.port!, inProtocol: proto, outProtocol: proto, processor: processor) - case (.compact, .buffered): + case (.compact, .buffered, .none): let proto = TCompactProtocol.self server = try TSocketServer(port: parameters.port!, inProtocol: proto, outProtocol: proto, processor: processor) - case (.compact, .framed): + case (.compact, .framed, .none): let proto = TCompactProtocol.self server = try TFramedSocketServer(port: parameters.port!, inProtocol: proto, outProtocol: proto, processor: processor) + case (.binary, .buffered, .some(let domainSocket)): + let proto = TBinaryProtocol.self + server = try TSocketServer(path: domainSocket, inProtocol: proto, outProtocol: proto, processor: processor) + case (.binary, .framed, .some(let domainSocket)): + let proto = TBinaryProtocol.self + server = try TFramedSocketServer(path: domainSocket, inProtocol: proto, outProtocol: proto, processor: processor) + case (.compact, .buffered, .some(let domainSocket)): + let proto = TCompactProtocol.self + server = try TSocketServer(path: domainSocket, inProtocol: proto, outProtocol: proto, processor: processor) + case (.compact, .framed, .some(let domainSocket)): + let proto = TCompactProtocol.self + server = try TFramedSocketServer(path: domainSocket, inProtocol: proto, outProtocol: proto, processor: processor) default: throw ParserError.unsupportedOption } diff --git a/test/tests.json b/test/tests.json index 015a559ee3a..c9bd0682006 100644 --- a/test/tests.json +++ b/test/tests.json @@ -797,14 +797,14 @@ "workdir": "swift/CrossTests/.build/x86_64-unknown-linux-gnu/debug", "protocols": ["binary", "compact"], "transports": ["buffered", "framed"], - "sockets": ["ip"] + "sockets": ["ip", "domain"] }, "client": { "command": ["TestClient"], "workdir": "swift/CrossTests/.build/x86_64-unknown-linux-gnu/debug", "protocols": ["binary", "compact"], "transports": ["buffered", "framed"], - "sockets": ["ip"] + "sockets": ["ip", "domain"] } } ] From 9e7be1d4f1fc0f44aeb5ff4be757ae9225ca3258 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 06:14:07 +0000 Subject: [PATCH 247/430] Bump org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 in /lib/kotlin Bumps [org.jetbrains.kotlinx:kotlinx-coroutines-jdk8](https://github.com/Kotlin/kotlinx.coroutines) from 1.10.1 to 1.10.2. - [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases) - [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md) - [Commits](https://github.com/Kotlin/kotlinx.coroutines/compare/1.10.1...1.10.2) --- updated-dependencies: - dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 dependency-version: 1.10.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lib/kotlin/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/kotlin/build.gradle.kts b/lib/kotlin/build.gradle.kts index c96a661bd07..cf2880bada5 100644 --- a/lib/kotlin/build.gradle.kts +++ b/lib/kotlin/build.gradle.kts @@ -31,7 +31,7 @@ repositories { dependencies { implementation(platform("org.jetbrains.kotlin:kotlin-bom")) implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.1") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2") implementation("org.apache.thrift:libthrift:INCLUDED") testImplementation(kotlin("test")) } From df626d768a87fe07fef215b4dde831185e6929d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 06:31:02 +0000 Subject: [PATCH 248/430] Bump com.diffplug.spotless from 7.0.2 to 7.0.3 in /lib/java Bumps com.diffplug.spotless from 7.0.2 to 7.0.3. --- updated-dependencies: - dependency-name: com.diffplug.spotless dependency-version: 7.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lib/java/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/java/build.gradle b/lib/java/build.gradle index 6ee454a026a..d6be4a7d260 100644 --- a/lib/java/build.gradle +++ b/lib/java/build.gradle @@ -42,7 +42,7 @@ plugins { id 'pmd' id 'com.github.johnrengelman.shadow' version '8.1.1' id "com.github.spotbugs" version "5.2.5" - id "com.diffplug.spotless" version "7.0.2" + id "com.diffplug.spotless" version "7.0.3" } description = 'Apache Thrift Java Library' From 1e843418baa3e89d16e9f99dc3ba1f5cabde9d65 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Wed, 13 Oct 2021 12:36:28 +0200 Subject: [PATCH 249/430] [ruby] Fix shorten-64-to-32 errors on macOS Since the extconf.rb pass `-Werror`, the gem won't compile. --- lib/rb/ext/binary_protocol_accelerated.c | 10 +++++----- lib/rb/ext/compact_protocol.c | 18 +++++++++--------- lib/rb/ext/memory_buffer.c | 2 +- lib/rb/ext/struct.c | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/rb/ext/binary_protocol_accelerated.c b/lib/rb/ext/binary_protocol_accelerated.c index 65cbe5ffecd..c9ae4d299bb 100644 --- a/lib/rb/ext/binary_protocol_accelerated.c +++ b/lib/rb/ext/binary_protocol_accelerated.c @@ -82,7 +82,7 @@ static void write_string_direct(VALUE trans, VALUE str) { rb_raise(rb_eStandardError, "Value should be a string"); } str = convert_to_utf8_byte_buffer(str); - write_i32_direct(trans, RSTRING_LEN(str)); + write_i32_direct(trans, (int32_t)RSTRING_LEN(str)); rb_funcall(trans, write_method_id, 1, str); } @@ -223,7 +223,7 @@ VALUE rb_thrift_binary_proto_write_binary(VALUE self, VALUE buf) { CHECK_NIL(buf); VALUE trans = GET_TRANSPORT(self); buf = force_binary_encoding(buf); - write_i32_direct(trans, RSTRING_LEN(buf)); + write_i32_direct(trans, (int32_t)RSTRING_LEN(buf)); rb_funcall(trans, write_method_id, 1, buf); return Qnil; } @@ -403,9 +403,9 @@ VALUE rb_thrift_binary_proto_read_binary(VALUE self) { void Init_binary_protocol_accelerated() { VALUE thrift_binary_protocol_class = rb_const_get(thrift_module, rb_intern("BinaryProtocol")); - VERSION_1 = rb_num2ll(rb_const_get(thrift_binary_protocol_class, rb_intern("VERSION_1"))); - VERSION_MASK = rb_num2ll(rb_const_get(thrift_binary_protocol_class, rb_intern("VERSION_MASK"))); - TYPE_MASK = rb_num2ll(rb_const_get(thrift_binary_protocol_class, rb_intern("TYPE_MASK"))); + VERSION_1 = (int)rb_num2ll(rb_const_get(thrift_binary_protocol_class, rb_intern("VERSION_1"))); + VERSION_MASK = (int)rb_num2ll(rb_const_get(thrift_binary_protocol_class, rb_intern("VERSION_MASK"))); + TYPE_MASK = (int)rb_num2ll(rb_const_get(thrift_binary_protocol_class, rb_intern("TYPE_MASK"))); VALUE bpa_class = rb_define_class_under(thrift_module, "BinaryProtocolAccelerated", thrift_binary_protocol_class); diff --git a/lib/rb/ext/compact_protocol.c b/lib/rb/ext/compact_protocol.c index fab2170a215..c98c09eb491 100644 --- a/lib/rb/ext/compact_protocol.c +++ b/lib/rb/ext/compact_protocol.c @@ -315,7 +315,7 @@ VALUE rb_thrift_compact_proto_write_string(VALUE self, VALUE str) { VALUE rb_thrift_compact_proto_write_binary(VALUE self, VALUE buf) { buf = force_binary_encoding(buf); VALUE transport = GET_TRANSPORT(self); - write_varint32(transport, RSTRING_LEN(buf)); + write_varint32(transport, (uint32_t)RSTRING_LEN(buf)); WRITE(transport, StringValuePtr(buf), RSTRING_LEN(buf)); return Qnil; } @@ -452,7 +452,7 @@ VALUE rb_thrift_compact_proto_read_message_begin(VALUE self) { } int8_t type = (version_and_type >> TYPE_SHIFT_AMOUNT) & TYPE_BITS; - int32_t seqid = read_varint64(self); + int32_t seqid = (int32_t)read_varint64(self); VALUE messageName = rb_thrift_compact_proto_read_string(self); return rb_ary_new3(3, messageName, INT2FIX(type), INT2NUM(seqid)); } @@ -490,7 +490,7 @@ VALUE rb_thrift_compact_proto_read_field_begin(VALUE self) { } VALUE rb_thrift_compact_proto_read_map_begin(VALUE self) { - int32_t size = read_varint64(self); + int32_t size = (int32_t)read_varint64(self); uint8_t key_and_value_type = size == 0 ? 0 : read_byte_direct(self); return rb_ary_new3(3, INT2FIX(get_ttype(key_and_value_type >> 4)), INT2FIX(get_ttype(key_and_value_type & 0xf)), INT2FIX(size)); } @@ -499,7 +499,7 @@ VALUE rb_thrift_compact_proto_read_list_begin(VALUE self) { uint8_t size_and_type = read_byte_direct(self); int32_t size = (size_and_type >> 4) & 0x0f; if (size == 15) { - size = read_varint64(self); + size = (int32_t)read_varint64(self); } uint8_t type = get_ttype(size_and_type & 0x0f); return rb_ary_new3(2, INT2FIX(type), INT2FIX(size)); @@ -528,7 +528,7 @@ VALUE rb_thrift_compact_proto_read_i16(VALUE self) { } VALUE rb_thrift_compact_proto_read_i32(VALUE self) { - return INT2NUM(zig_zag_to_int(read_varint64(self))); + return INT2NUM(zig_zag_to_int((int32_t)read_varint64(self))); } VALUE rb_thrift_compact_proto_read_i64(VALUE self) { @@ -569,10 +569,10 @@ static void Init_constants() { thrift_compact_protocol_class = rb_const_get(thrift_module, rb_intern("CompactProtocol")); rb_global_variable(&thrift_compact_protocol_class); - VERSION = rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("VERSION"))); - VERSION_MASK = rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("VERSION_MASK"))); - TYPE_MASK = rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("TYPE_MASK"))); - TYPE_BITS = rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("TYPE_BITS"))); + VERSION = (int32_t)rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("VERSION"))); + VERSION_MASK = (int32_t)rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("VERSION_MASK"))); + TYPE_MASK = (int32_t)rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("TYPE_MASK"))); + TYPE_BITS = (int32_t)rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("TYPE_BITS"))); TYPE_SHIFT_AMOUNT = FIX2INT(rb_const_get(thrift_compact_protocol_class, rb_intern("TYPE_SHIFT_AMOUNT"))); PROTOCOL_ID = FIX2INT(rb_const_get(thrift_compact_protocol_class, rb_intern("PROTOCOL_ID"))); diff --git a/lib/rb/ext/memory_buffer.c b/lib/rb/ext/memory_buffer.c index 8b52c4a3e0e..96604af8639 100644 --- a/lib/rb/ext/memory_buffer.c +++ b/lib/rb/ext/memory_buffer.c @@ -54,7 +54,7 @@ VALUE rb_thrift_memory_buffer_read(VALUE self, VALUE length_value) { index += length; if (index > RSTRING_LEN(buf)) { - index = RSTRING_LEN(buf); + index = (int)RSTRING_LEN(buf); } if (index >= GARBAGE_BUFFER_SIZE) { rb_ivar_set(self, buf_ivar_id, rb_funcall(buf, slice_method_id, 2, INT2FIX(index), INT2FIX(RSTRING_LEN(buf) - 1))); diff --git a/lib/rb/ext/struct.c b/lib/rb/ext/struct.c index 79cbabee7b9..e8255a9cbbf 100644 --- a/lib/rb/ext/struct.c +++ b/lib/rb/ext/struct.c @@ -225,7 +225,7 @@ VALUE get_field_value(VALUE obj, VALUE field_name) { } static void write_container(int ttype, VALUE field_info, VALUE value, VALUE protocol) { - int sz, i; + long sz, i; if (ttype == TTYPE_MAP) { VALUE keys; From e402bb05e45145db0e78f459e07bde446662b04c Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 14 May 2025 21:41:22 +0200 Subject: [PATCH 250/430] Added "resolved" to searches for unresolved tickets --- doc/ReleaseManagement.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/ReleaseManagement.md b/doc/ReleaseManagement.md index 7b6f0083a6d..4077d61667a 100644 --- a/doc/ReleaseManagement.md +++ b/doc/ReleaseManagement.md @@ -70,9 +70,9 @@ All Apache Thrift releases go through a 72-hour final release candidate voting p 1. [Open Issues with a Fix Version](https://issues.apache.org/jira/issues/?filter=-1&jql=project%20%3D%20THRIFT%20and%20status%20in%20(OPEN%2C%20%27IN%20PROGRESS%27%2C%20REOPENED)%20and%20fixVersion%20is%20not%20empty) - these will be issues that someone placed a fixVersion on in Jira, but have not been resolved or closed yet. They are likely stale somehow. Resolutions for these issues include resolving or closing the issue in Jira, or simply removing the fixVersion if the issue hasn't been fixed. - 1. [Open Blocking Issues](https://issues.apache.org/jira/issues/?filter=-1&jql=project%20%3D%20THRIFT%20and%20priority%20in%20(blocker)%20and%20status%20not%20in%20(closed)%20order%20by%20component%20ASC) - blocking issues should block a release. Scrub the list to see if they are really blocking the release, and if not change their priority. + 1. [Open Blocking Issues](https://issues.apache.org/jira/issues/?filter=-1&jql=project%20%3D%20THRIFT%20and%20priority%20in%20(blocker)%20and%20status%20not%20in%20(closed,resolved)%20order%20by%20component%20ASC) - blocking issues should block a release. Scrub the list to see if they are really blocking the release, and if not change their priority. - 1. [Open Critical Issues](https://issues.apache.org/jira/issues/?filter=-1&jql=project%20%3D%20THRIFT%20and%20priority%20in%20(critical)%20and%20status%20not%20in%20(closed)%20and%20type%20not%20in%20(%22wish%22)%20order%20by%20component%20ASC) - this list will end up in the known critical issues list in the changes file. Scrub it to make sure everything is actually critical. + 1. [Open Critical Issues](https://issues.apache.org/jira/issues/?filter=-1&jql=project%20%3D%20THRIFT%20and%20priority%20in%20(critical)%20and%20status%20not%20in%20(closed,resolved)%20and%20type%20not%20in%20(%22wish%22)%20order%20by%20component%20ASC) - this list will end up in the known critical issues list in the changes file. Scrub it to make sure everything is actually critical. It is healthy to scrub these periodically, whether or not you are making a new release. From c79d1cc179e5cc0792d012961e32d5acebc6eb5b Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 14 May 2025 22:08:35 +0200 Subject: [PATCH 251/430] Branch 0.22.0 created --- ApacheThrift.nuspec | 8 ++++---- CMakeLists.txt | 2 +- Thrift.podspec | 4 ++-- appveyor.yml | 2 +- bower.json | 2 +- compiler/cpp/src/thrift/version.h | 2 +- configure.ac | 2 +- contrib/Rebus/Properties/AssemblyInfo.cs | 4 ++-- contrib/thrift-maven-plugin/pom.xml | 2 +- contrib/thrift.spec | 2 +- contrib/zeromq/csharp/AssemblyInfo.cs | 2 +- debian/changelog | 6 ++++++ doap.rdf | 5 +++++ doc/specs/idl.md | 2 +- lib/d/src/thrift/base.d | 2 +- lib/dart/pubspec.yaml | 2 +- lib/delphi/src/Thrift.pas | 2 +- lib/erl/src/thrift.app.src | 2 +- lib/haxe/haxelib.json | 2 +- lib/java/gradle.properties | 2 +- lib/js/package-lock.json | 4 ++-- lib/js/package.json | 2 +- lib/js/src/thrift.js | 2 +- lib/lua/Thrift.lua | 2 +- .../Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj | 2 +- .../Thrift.Compile.net8/Thrift.Compile.net8.csproj | 2 +- .../Thrift.Compile.net9/Thrift.Compile.net9.csproj | 2 +- .../Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj | 2 +- .../Thrift.IntegrationTests.csproj | 2 +- lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj | 2 +- lib/netstd/Thrift/Properties/AssemblyInfo.cs | 4 ++-- lib/netstd/Thrift/Thrift.csproj | 6 +++--- lib/ocaml/_oasis | 2 +- lib/perl/lib/Thrift.pm | 2 +- lib/py/setup.py | 2 +- lib/rb/thrift.gemspec | 2 +- lib/rs/Cargo.toml | 2 +- lib/st/package.xml | 2 +- lib/swift/Sources/Thrift.swift | 2 +- lib/swift/Tests/ThriftTests/ThriftTests.swift | 2 +- lib/ts/package-lock.json | 4 ++-- lib/ts/package.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- sonar-project.properties | 6 +++--- test/dart/test_client/pubspec.yaml | 2 +- test/erl/src/thrift_test.app.src | 2 +- test/netstd/Client/Client.csproj | 2 +- test/netstd/Server/Server.csproj | 2 +- tutorial/dart/client/pubspec.yaml | 2 +- tutorial/dart/console_client/pubspec.yaml | 2 +- tutorial/dart/server/pubspec.yaml | 2 +- tutorial/delphi/DelphiClient/DelphiClient.dproj | 4 ++-- tutorial/delphi/DelphiServer/DelphiServer.dproj | 4 ++-- tutorial/netstd/Client/Client.csproj | 2 +- tutorial/netstd/Interfaces/Interfaces.csproj | 2 +- tutorial/netstd/Server/Server.csproj | 2 +- tutorial/ocaml/_oasis | 2 +- 58 files changed, 82 insertions(+), 71 deletions(-) diff --git a/ApacheThrift.nuspec b/ApacheThrift.nuspec index 5a20f6286f7..d0c6501aecf 100644 --- a/ApacheThrift.nuspec +++ b/ApacheThrift.nuspec @@ -19,14 +19,14 @@ the "Thrift" project. 2. nuget setApiKey 3. nuget pack ApacheThrift.nuspec -Symbols -SymbolPackageFormat snupkg - 4. nuget push ApacheThrift.0.22.0.nupkg -Source https://api.nuget.org/v3/index.json + 4. nuget push ApacheThrift.0.23.0.nupkg -Source https://api.nuget.org/v3/index.json --> ApacheThrift - 0.22.0 - Apache Thrift 0.22.0 + 0.23.0 + Apache Thrift 0.23.0 Apache Thrift Developers Apache Software Foundation Apache-2.0 @@ -36,7 +36,7 @@ Contains runtime libraries from lib/netstd for netstandard2.0 framework development. - + Apache Thrift RPC diff --git a/CMakeLists.txt b/CMakeLists.txt index 1f74e75c5f8..50a697bc2b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,7 @@ endif() # PACKAGE_VERSION is used by cpack scripts currently # Both thrift_VERSION and PACKAGE_VERSION should be the same for now -set(thrift_VERSION "0.22.0") +set(thrift_VERSION "0.23.0") set(PACKAGE_VERSION ${thrift_VERSION}) project("thrift" VERSION ${PACKAGE_VERSION}) diff --git a/Thrift.podspec b/Thrift.podspec index 08ed58c7e46..76ae462b008 100644 --- a/Thrift.podspec +++ b/Thrift.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Thrift' - s.version = '0.22.0' + s.version = '0.23.0' s.summary = "Apache Thrift is a lightweight, language-independent software stack with an associated code generation mechanism for RPC." s.description = <<-DESC The Apache Thrift scalable cross-language software framework for networked services development combines a software stack with a code generation engine to build services that work efficiently and seamlessly between many programming languages. @@ -10,6 +10,6 @@ The Apache Thrift scalable cross-language software framework for networked servi s.author = { 'Apache Thrift Developers' => 'dev@thrift.apache.org' } s.ios.deployment_target = '9.0' s.osx.deployment_target = '10.10' - s.source = { :git => 'https://github.com/apache/thrift.git', :tag => 'v0.22.0' } + s.source = { :git => 'https://github.com/apache/thrift.git', :tag => 'v0.23.0' } s.source_files = 'lib/swift/Sources/*.swift' end diff --git a/appveyor.yml b/appveyor.yml index 8efc5222d05..ff35d520e94 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,7 +19,7 @@ # build Apache Thrift on AppVeyor - https://ci.appveyor.com -version: '0.22.0.{build}' +version: '0.23.0.{build}' shallow_clone: true diff --git a/bower.json b/bower.json index 871ab420de5..62af06a4590 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "thrift", - "version": "0.22.0", + "version": "0.23.0", "homepage": "https://github.com/apache/thrift.git", "authors": [ "Apache Thrift " diff --git a/compiler/cpp/src/thrift/version.h b/compiler/cpp/src/thrift/version.h index f7419838e8b..47d3a13f994 100644 --- a/compiler/cpp/src/thrift/version.h +++ b/compiler/cpp/src/thrift/version.h @@ -24,6 +24,6 @@ #pragma once #endif // _MSC_VER -#define THRIFT_VERSION "0.22.0" +#define THRIFT_VERSION "0.23.0" #endif // _THRIFT_VERSION_H_ diff --git a/configure.ac b/configure.ac index f0d073810c5..20be01edf4e 100644 --- a/configure.ac +++ b/configure.ac @@ -20,7 +20,7 @@ AC_PREREQ(2.65) AC_CONFIG_MACRO_DIR([./aclocal]) -AC_INIT([thrift], [0.22.0]) +AC_INIT([thrift], [0.23.0]) AC_CONFIG_AUX_DIR([.]) diff --git a/contrib/Rebus/Properties/AssemblyInfo.cs b/contrib/Rebus/Properties/AssemblyInfo.cs index 25739150526..d45a88cdfe8 100644 --- a/contrib/Rebus/Properties/AssemblyInfo.cs +++ b/contrib/Rebus/Properties/AssemblyInfo.cs @@ -34,5 +34,5 @@ [assembly: Guid("0af10984-40d3-453d-b1e5-421529e8c7e2")] -[assembly: AssemblyVersion("0.22.0.0")] -[assembly: AssemblyFileVersion("0.22.0.0")] +[assembly: AssemblyVersion("0.23.0.0")] +[assembly: AssemblyFileVersion("0.23.0.0")] diff --git a/contrib/thrift-maven-plugin/pom.xml b/contrib/thrift-maven-plugin/pom.xml index b314527ae99..1a9b1f425eb 100644 --- a/contrib/thrift-maven-plugin/pom.xml +++ b/contrib/thrift-maven-plugin/pom.xml @@ -29,7 +29,7 @@ thrift-maven-plugin maven-plugin thrift-maven-plugin - 0.22.0 + 0.23.0 1.8 diff --git a/contrib/thrift.spec b/contrib/thrift.spec index 15e1c5b75a5..74b4ad89b57 100644 --- a/contrib/thrift.spec +++ b/contrib/thrift.spec @@ -28,7 +28,7 @@ Name: thrift License: Apache License v2.0 Group: Development Summary: RPC and serialization framework -Version: 0.22.0 +Version: 0.23.0 Release: 0 URL: http://thrift.apache.org Packager: Thrift Developers diff --git a/contrib/zeromq/csharp/AssemblyInfo.cs b/contrib/zeromq/csharp/AssemblyInfo.cs index 27378f30cbf..631dc757e73 100644 --- a/contrib/zeromq/csharp/AssemblyInfo.cs +++ b/contrib/zeromq/csharp/AssemblyInfo.cs @@ -36,7 +36,7 @@ // The form "{Major}.{Minor}.*" will automatically update the build and revision, // and "{Major}.{Minor}.{Build}.*" will update just the revision. -[assembly: AssemblyVersion("0.22.0.0")] +[assembly: AssemblyVersion("0.23.0.0")] // The following attributes are used to specify the signing key for the assembly, // if desired. See the Mono documentation for more information about signing. diff --git a/debian/changelog b/debian/changelog index df7e6931f3d..8826c9a361d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +thrift (0.22.0) stable; urgency=low + + * update to 0.22.0 + + -- Apache Thrift Developers Mon, 02 Sep 2024 23:30:00 +0100 + thrift (0.21.0) stable; urgency=low * update to 0.21.0 diff --git a/doap.rdf b/doap.rdf index f36508ef0f1..88f445d7b9f 100644 --- a/doap.rdf +++ b/doap.rdf @@ -55,6 +55,11 @@ + + Apache Thrift + 2025-05-14 + 0.22.0 + Apache Thrift 2024-09-02 diff --git a/doc/specs/idl.md b/doc/specs/idl.md index 9777af4e0c9..d2b59db8b7f 100644 --- a/doc/specs/idl.md +++ b/doc/specs/idl.md @@ -1,6 +1,6 @@ ## Thrift interface description language -For Thrift version 0.22.0. +For Thrift version 0.23.0. The Thrift interface definition language (IDL) allows for the definition of [Thrift Types](/docs/types). A Thrift IDL file is processed by the Thrift code generator to produce code for the various target languages to support the defined structs and services in the IDL file. diff --git a/lib/d/src/thrift/base.d b/lib/d/src/thrift/base.d index b5cb075bf8d..040f0fa91ea 100644 --- a/lib/d/src/thrift/base.d +++ b/lib/d/src/thrift/base.d @@ -50,7 +50,7 @@ class TCompoundOperationException : TException { /// The Thrift version string, used for informative purposes. // Note: This is currently hardcoded, but will likely be filled in by the build // system in future versions. -enum VERSION = "0.22.0"; +enum VERSION = "0.23.0"; /** * Functions used for logging inside Thrift. diff --git a/lib/dart/pubspec.yaml b/lib/dart/pubspec.yaml index db7b8a6bd54..732e5530fa7 100644 --- a/lib/dart/pubspec.yaml +++ b/lib/dart/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: thrift -version: 0.22.0 +version: 0.23.0 description: > A Dart library for Apache Thrift author: Apache Thrift Developers diff --git a/lib/delphi/src/Thrift.pas b/lib/delphi/src/Thrift.pas index b06d38fbdb8..4210615b0af 100644 --- a/lib/delphi/src/Thrift.pas +++ b/lib/delphi/src/Thrift.pas @@ -28,7 +28,7 @@ interface Thrift.Protocol; const - Version = '0.22.0'; + Version = '0.23.0'; type TException = Thrift.Exception.TException; // compatibility alias diff --git a/lib/erl/src/thrift.app.src b/lib/erl/src/thrift.app.src index c0d4bab9b60..a99f8477d1f 100644 --- a/lib/erl/src/thrift.app.src +++ b/lib/erl/src/thrift.app.src @@ -22,7 +22,7 @@ {description, "Thrift bindings"}, % The version of the applicaton - {vsn, "0.22.0"}, + {vsn, "0.23.0"}, % All modules used by the application. {modules, []}, diff --git a/lib/haxe/haxelib.json b/lib/haxe/haxelib.json index 5eabff5f682..87af3424249 100644 --- a/lib/haxe/haxelib.json +++ b/lib/haxe/haxelib.json @@ -10,7 +10,7 @@ "framework" ], "description": "Haxe bindings for the Apache Thrift RPC and serialization framework", - "version": "0.22.0", + "version": "0.23.0", "releasenote": "Licensed under Apache License, Version 2.0. The Apache Thrift compiler needs to be installed separately.", "contributors": ["ApacheThrift"], "dependencies": { diff --git a/lib/java/gradle.properties b/lib/java/gradle.properties index 5aca7544131..b5375bda7c8 100644 --- a/lib/java/gradle.properties +++ b/lib/java/gradle.properties @@ -1,7 +1,7 @@ # This file is shared currently between this Gradle build and the # Ant builds for fd303 and JavaScript. Keep the dotted notation for # the properties to minimize the changes in the dependencies. -thrift.version=0.22.0 +thrift.version=0.23.0 thrift.groupid=org.apache.thrift release=false diff --git a/lib/js/package-lock.json b/lib/js/package-lock.json index cb202ca75e2..80ebce27e0a 100644 --- a/lib/js/package-lock.json +++ b/lib/js/package-lock.json @@ -1,12 +1,12 @@ { "name": "thrift", - "version": "0.22.0", + "version": "0.23.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "thrift", - "version": "0.22.0", + "version": "0.23.0", "license": "Apache-2.0", "devDependencies": { "browserify": "~16.5", diff --git a/lib/js/package.json b/lib/js/package.json index 73a8cb450bc..377d976453e 100644 --- a/lib/js/package.json +++ b/lib/js/package.json @@ -1,6 +1,6 @@ { "name": "thrift", - "version": "0.22.0", + "version": "0.23.0", "description": "Thrift is a software framework for scalable cross-language services development.", "main": "./src/thrift", "author": { diff --git a/lib/js/src/thrift.js b/lib/js/src/thrift.js index 7a23eac4d2b..0c4eb266c85 100644 --- a/lib/js/src/thrift.js +++ b/lib/js/src/thrift.js @@ -46,7 +46,7 @@ var Thrift = { * @const {string} Version * @memberof Thrift */ - Version: '0.22.0', + Version: '0.23.0', /** * Thrift IDL type string to Id mapping. diff --git a/lib/lua/Thrift.lua b/lib/lua/Thrift.lua index b6e3628ae47..2863644aa14 100644 --- a/lib/lua/Thrift.lua +++ b/lib/lua/Thrift.lua @@ -51,7 +51,7 @@ function ttable_size(t) return count end -version = '0.22.0' +version = '0.23.0' TType = { STOP = 0, diff --git a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj index 9d25c7271c6..5b46f6c3319 100644 --- a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj +++ b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj @@ -21,7 +21,7 @@ Exe net9.0 - 0.22.0 + 0.23.0 latestMajor false true diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj index 6398a41e4e0..c0f8c343dc4 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj @@ -19,7 +19,7 @@ --> - 0.22.0 + 0.23.0 Thrift version $(ThriftVersion) net8.0 latestMajor diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj index ac1a62a388b..8ad887bb0ee 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net9/Thrift.Compile.net9.csproj @@ -19,7 +19,7 @@ --> - 0.22.0 + 0.23.0 Thrift version $(ThriftVersion) net9.0 latestMajor diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj index 1e180617e52..29bc635a02d 100644 --- a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj +++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj @@ -19,7 +19,7 @@ --> - 0.22.0 + 0.23.0 Thrift version $(ThriftVersion) netstandard2.0 latestMajor diff --git a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj index ff8da43e09a..c6d3e3f1be4 100644 --- a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj +++ b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj @@ -23,7 +23,7 @@ latestMajor Thrift.IntegrationTests Thrift.IntegrationTests - 0.22.0.0 + 0.23.0.0 Exe false false diff --git a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj index 762fd68c4c1..820eac3ba61 100644 --- a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj +++ b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj @@ -21,7 +21,7 @@ net9.0 latestMajor - 0.22.0.0 + 0.23.0.0 enable diff --git a/lib/netstd/Thrift/Properties/AssemblyInfo.cs b/lib/netstd/Thrift/Properties/AssemblyInfo.cs index 84be9807563..6a066dd79b1 100644 --- a/lib/netstd/Thrift/Properties/AssemblyInfo.cs +++ b/lib/netstd/Thrift/Properties/AssemblyInfo.cs @@ -52,5 +52,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.22.0.0")] -[assembly: AssemblyFileVersion("0.22.0.0")] +[assembly: AssemblyVersion("0.23.0.0")] +[assembly: AssemblyFileVersion("0.23.0.0")] diff --git a/lib/netstd/Thrift/Thrift.csproj b/lib/netstd/Thrift/Thrift.csproj index 760c5d7b94d..aca676f8358 100644 --- a/lib/netstd/Thrift/Thrift.csproj +++ b/lib/netstd/Thrift/Thrift.csproj @@ -40,8 +40,8 @@ true thrift.snk false - Apache Thrift 0.22.0 - 0.22.0.0 + Apache Thrift 0.23.0 + 0.23.0.0 false http://thrift.apache.org/ Apache Thrift Developers @@ -50,7 +50,7 @@ C# .NET Core bindings for the Apache Thrift RPC system Apache Thrift RPC - https://github.com/apache/thrift/blob/0.22.0/CHANGES.md + https://github.com/apache/thrift/blob/0.23.0/CHANGES.md https://thrift.apache.org/ https://github.com/apache/thrift git diff --git a/lib/ocaml/_oasis b/lib/ocaml/_oasis index bc01addfe3c..8ea14737099 100644 --- a/lib/ocaml/_oasis +++ b/lib/ocaml/_oasis @@ -1,5 +1,5 @@ Name: libthrift-ocaml -Version: 0.22.0 +Version: 0.23.0 OASISFormat: 0.3 Synopsis: OCaml bindings for the Apache Thrift RPC system Authors: Apache Thrift Developers diff --git a/lib/perl/lib/Thrift.pm b/lib/perl/lib/Thrift.pm index 995131eccd8..a450b1a09e8 100644 --- a/lib/perl/lib/Thrift.pm +++ b/lib/perl/lib/Thrift.pm @@ -31,6 +31,6 @@ use warnings; # package Thrift; -use version 0.77; our $VERSION = version->declare("v0.22.0"); +use version 0.77; our $VERSION = version->declare("v0.23.0"); 1; diff --git a/lib/py/setup.py b/lib/py/setup.py index 2a170a411cc..a02cc4ff1f1 100644 --- a/lib/py/setup.py +++ b/lib/py/setup.py @@ -103,7 +103,7 @@ def run_setup(with_binary): twisted_deps = ['twisted'] setup(name='thrift', - version='0.22.0', + version='0.23.0', description='Python bindings for the Apache Thrift RPC system', long_description=read_file("README.md"), long_description_content_type="text/markdown", diff --git a/lib/rb/thrift.gemspec b/lib/rb/thrift.gemspec index 625c6a458b3..68bb4e19b23 100644 --- a/lib/rb/thrift.gemspec +++ b/lib/rb/thrift.gemspec @@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| s.name = 'thrift' - s.version = '0.22.0' + s.version = '0.23.0' s.authors = ['Apache Thrift Developers'] s.email = ['dev@thrift.apache.org'] s.homepage = 'http://thrift.apache.org' diff --git a/lib/rs/Cargo.toml b/lib/rs/Cargo.toml index 263b9d972fc..670d3abc10b 100644 --- a/lib/rs/Cargo.toml +++ b/lib/rs/Cargo.toml @@ -2,7 +2,7 @@ name = "thrift" description = "Rust bindings for the Apache Thrift RPC system" edition = "2021" -version = "0.22.0" +version = "0.23.0" license = "Apache-2.0" authors = ["Apache Thrift Developers "] homepage = "http://thrift.apache.org" diff --git a/lib/st/package.xml b/lib/st/package.xml index 5f92da86515..18749e23151 100644 --- a/lib/st/package.xml +++ b/lib/st/package.xml @@ -17,7 +17,7 @@ specific language governing permissions and limitations under the License. --> - + libthrift-st thrift.st diff --git a/lib/swift/Sources/Thrift.swift b/lib/swift/Sources/Thrift.swift index ad15d8abbe3..92d4e85628e 100644 --- a/lib/swift/Sources/Thrift.swift +++ b/lib/swift/Sources/Thrift.swift @@ -1,3 +1,3 @@ class Thrift { - let version = "0.22.0" + let version = "0.23.0" } diff --git a/lib/swift/Tests/ThriftTests/ThriftTests.swift b/lib/swift/Tests/ThriftTests/ThriftTests.swift index 2632cc3e3bf..95527f3bf81 100644 --- a/lib/swift/Tests/ThriftTests/ThriftTests.swift +++ b/lib/swift/Tests/ThriftTests/ThriftTests.swift @@ -3,7 +3,7 @@ import XCTest class ThriftTests: XCTestCase { func testVersion() { - XCTAssertEqual(Thrift().version, "0.22.0") + XCTAssertEqual(Thrift().version, "0.23.0") } static var allTests : [(String, (ThriftTests) -> () throws -> Void)] { diff --git a/lib/ts/package-lock.json b/lib/ts/package-lock.json index 97400009484..386c3693ad7 100644 --- a/lib/ts/package-lock.json +++ b/lib/ts/package-lock.json @@ -1,12 +1,12 @@ { "name": "thrift", - "version": "0.22.0", + "version": "0.23.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "thrift", - "version": "0.22.0", + "version": "0.23.0", "license": "Apache-2.0", "dependencies": { "bufferutil": "^4.0.1", diff --git a/lib/ts/package.json b/lib/ts/package.json index 17988c6a4a0..de0ee8ef2d7 100644 --- a/lib/ts/package.json +++ b/lib/ts/package.json @@ -1,6 +1,6 @@ { "name": "thrift", - "version": "0.22.0", + "version": "0.23.0", "description": "Thrift is a software framework for scalable cross-language services development.", "author": { "name": "Apache Thrift Developers", diff --git a/package-lock.json b/package-lock.json index 701dd076b71..3601b6da696 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "thrift", - "version": "0.22.0", + "version": "0.23.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "thrift", - "version": "0.22.0", + "version": "0.23.0", "license": "Apache-2.0", "dependencies": { "browser-or-node": "^1.2.1", diff --git a/package.json b/package.json index c86c155689e..59bc8207957 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "type": "git", "url": "https://github.com/apache/thrift.git" }, - "version": "0.22.0", + "version": "0.23.0", "author": { "name": "Apache Thrift Developers", "email": "dev@thrift.apache.org", diff --git a/sonar-project.properties b/sonar-project.properties index f88d43505cc..921c9cc6fa1 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -16,7 +16,7 @@ development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between all major languages. # Apache Thrift Version -sonar.projectVersion=0.22.0 +sonar.projectVersion=0.23.0 # use this to set another version string # $ sonar-runner -D sonar.projectVersion=`git rev-parse HEAD` # set projectDate in combination with projectVersion for imports of old releases @@ -54,7 +54,7 @@ module1.sonar.projectName=Apache Thrift - Java Library module1.sonar.projectBaseDir=lib/java module1.sonar.sources=src module1.sonar.tests=test -module1.sonar.binaries=build/libs/libthrift-0.22.0.jar +module1.sonar.binaries=build/libs/libthrift-0.23.0.jar module1.sonar.libraries=build/deps/*.jar module1.sonar.language=java @@ -62,7 +62,7 @@ module2.sonar.projectName=Apache Thrift - Java Tutorial module2.sonar.projectBaseDir=. module2.sonar.sources=tutorial/java/src, tutorial/java/gen-java module2.sonar.binaries=tutorial/java/tutorial.jar -module2.sonar.libraries=lib/java/build/deps/*.jar,lib/java/build/libs/libthrift-0.22.0.jar +module2.sonar.libraries=lib/java/build/deps/*.jar,lib/java/build/libs/libthrift-0.23.0.jar module2.sonar.language=java module3.sonar.projectName=Apache Thrift - JavaScript Library diff --git a/test/dart/test_client/pubspec.yaml b/test/dart/test_client/pubspec.yaml index 0df6caea19f..e48da9fc9ab 100644 --- a/test/dart/test_client/pubspec.yaml +++ b/test/dart/test_client/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: thrift_test_client -version: 0.22.0 +version: 0.23.0 description: A client integration test for the Dart Thrift library author: Apache Thrift Developers homepage: http://thrift.apache.org diff --git a/test/erl/src/thrift_test.app.src b/test/erl/src/thrift_test.app.src index fa95d3c1e71..0a8441dd341 100644 --- a/test/erl/src/thrift_test.app.src +++ b/test/erl/src/thrift_test.app.src @@ -22,7 +22,7 @@ {description, "Thrift cross language test"}, % The version of the applicaton - {vsn, "0.22.0"}, + {vsn, "0.23.0"}, % All modules used by the application. {modules, [ diff --git a/test/netstd/Client/Client.csproj b/test/netstd/Client/Client.csproj index d9f61f8eee4..970e52c456a 100644 --- a/test/netstd/Client/Client.csproj +++ b/test/netstd/Client/Client.csproj @@ -24,7 +24,7 @@ Client Client Exe - 0.22.0.0 + 0.23.0.0 false false false diff --git a/test/netstd/Server/Server.csproj b/test/netstd/Server/Server.csproj index 130b466f99d..69f943f7771 100644 --- a/test/netstd/Server/Server.csproj +++ b/test/netstd/Server/Server.csproj @@ -24,7 +24,7 @@ Server Server Exe - 0.22.0.0 + 0.23.0.0 false false false diff --git a/tutorial/dart/client/pubspec.yaml b/tutorial/dart/client/pubspec.yaml index 71b580c1630..a8c148dfcca 100644 --- a/tutorial/dart/client/pubspec.yaml +++ b/tutorial/dart/client/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: tutorial_client -version: 0.22.0 +version: 0.23.0 description: A Dart client implementation of the Apache Thrift tutorial author: Apache Thrift Developers homepage: http://thrift.apache.org diff --git a/tutorial/dart/console_client/pubspec.yaml b/tutorial/dart/console_client/pubspec.yaml index b7e2e5090e4..0e2389bfefc 100644 --- a/tutorial/dart/console_client/pubspec.yaml +++ b/tutorial/dart/console_client/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: tutorial_console_client -version: 0.22.0 +version: 0.23.0 description: > A Dart console client to implementation of the Apache Thrift tutorial author: Apache Thrift Developers diff --git a/tutorial/dart/server/pubspec.yaml b/tutorial/dart/server/pubspec.yaml index f694118b389..3cca54ef088 100644 --- a/tutorial/dart/server/pubspec.yaml +++ b/tutorial/dart/server/pubspec.yaml @@ -16,7 +16,7 @@ # under the License. name: tutorial_server -version: 0.22.0 +version: 0.23.0 description: A Dart server to support the Apache Thrift tutorial author: Apache Thrift Developers homepage: http://thrift.apache.org diff --git a/tutorial/delphi/DelphiClient/DelphiClient.dproj b/tutorial/delphi/DelphiClient/DelphiClient.dproj index 785de16ab31..424f11fbadb 100644 --- a/tutorial/delphi/DelphiClient/DelphiClient.dproj +++ b/tutorial/delphi/DelphiClient/DelphiClient.dproj @@ -124,13 +124,13 @@ popd]]> Thrift Tutorial - 0.22.0.0 + 0.23.0.0 DelphiClient Copyright © 2012 The Apache Software Foundation DelphiClient.exe Thrift - 0.22.0.0 + 0.23.0.0 diff --git a/tutorial/delphi/DelphiServer/DelphiServer.dproj b/tutorial/delphi/DelphiServer/DelphiServer.dproj index 43c963afd05..e8f945c8fdb 100644 --- a/tutorial/delphi/DelphiServer/DelphiServer.dproj +++ b/tutorial/delphi/DelphiServer/DelphiServer.dproj @@ -121,13 +121,13 @@ popd]]> Thrift Tutorial - 0.22.0.0 + 0.23.0.0 DelphiServer Copyright © 2012 The Apache Software Foundation DelphiServer.exe Thrift - 0.22.0.0 + 0.23.0.0 diff --git a/tutorial/netstd/Client/Client.csproj b/tutorial/netstd/Client/Client.csproj index df3f6c929d5..18ee5650917 100644 --- a/tutorial/netstd/Client/Client.csproj +++ b/tutorial/netstd/Client/Client.csproj @@ -24,7 +24,7 @@ Client Client Exe - 0.22.0.0 + 0.23.0.0 enable false false diff --git a/tutorial/netstd/Interfaces/Interfaces.csproj b/tutorial/netstd/Interfaces/Interfaces.csproj index 9a243ea2ed8..bc8a179c25c 100644 --- a/tutorial/netstd/Interfaces/Interfaces.csproj +++ b/tutorial/netstd/Interfaces/Interfaces.csproj @@ -22,7 +22,7 @@ net9.0 Interfaces Interfaces - 0.22.0.0 + 0.23.0.0 enable false false diff --git a/tutorial/netstd/Server/Server.csproj b/tutorial/netstd/Server/Server.csproj index b50b69c04e5..940b931efee 100644 --- a/tutorial/netstd/Server/Server.csproj +++ b/tutorial/netstd/Server/Server.csproj @@ -24,7 +24,7 @@ Server Server Exe - 0.22.0.0 + 0.23.0.0 enable false false diff --git a/tutorial/ocaml/_oasis b/tutorial/ocaml/_oasis index 12ec7f9edbf..a90ed71b2bf 100644 --- a/tutorial/ocaml/_oasis +++ b/tutorial/ocaml/_oasis @@ -1,5 +1,5 @@ Name: tutorial -Version: 0.22.0 +Version: 0.23.0 OASISFormat: 0.3 Synopsis: OCaml Tutorial example Authors: Apache Thrift Developers From 32cd806217ac8fbf2ef689eb5f5cec49f5d51f2e Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 14 May 2025 22:27:02 +0200 Subject: [PATCH 252/430] updated CHANGES.md --- CHANGES.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 26f474e7b6b..8616e92a502 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,83 @@ # Apache Thrift Changelog +## 0.22.0 + +### Build Process + +- [THRIFT-5836](https://issues.apache.org/jira/browse/THRIFT-5836) - 0.21.0 fails to build from sources at Arch Linux: No rule to make target 'Thrift5272.thrift', needed by 'gen-cpp/Thrift5272_types.h' +- [THRIFT-5860](https://issues.apache.org/jira/browse/THRIFT-5860) - cmake 3.5 as a minimum version does not work with cmake 4.0.0 + +### C glib + +- [THRIFT-5817](https://issues.apache.org/jira/browse/THRIFT-5817) - [C++] Avoid copy of TUuid + +### C++ + +- [THRIFT-5637](https://issues.apache.org/jira/browse/THRIFT-5637) - Thrift compiler should be able to output c++ Aggregate types +- [THRIFT-5667](https://issues.apache.org/jira/browse/THRIFT-5667) - Make ThriftConfig.cmake relocatable +- [THRIFT-5817](https://issues.apache.org/jira/browse/THRIFT-5817) - [C++] Avoid copy of TUuid +- [THRIFT-5821](https://issues.apache.org/jira/browse/THRIFT-5821) - Cannot compile against aws-lc libcrypto (openssl replacement from AWS) +- [THRIFT-5841](https://issues.apache.org/jira/browse/THRIFT-5841) - possible init/deinit conflict with manual initialization flag +- [THRIFT-5853](https://issues.apache.org/jira/browse/THRIFT-5853) - Remove oldstyle casts from TBufferTransports and TCompactProtocol +- [THRIFT-5854](https://issues.apache.org/jira/browse/THRIFT-5854) - TCompactProtocol readString checks maxMessageSize at wrong position and off by one + +### Compiler (General) + +- [THRIFT-5823](https://issues.apache.org/jira/browse/THRIFT-5823) - Fix illegal uses of exceptions as normal struct type +- [THRIFT-5835](https://issues.apache.org/jira/browse/THRIFT-5835) - Allow exceptions to be used as regular struct datatype + +# Delphi + +- [THRIFT-5822](https://issues.apache.org/jira/browse/THRIFT-5822) - Remove deprecated AnsiString functions from the library +- [THRIFT-5824](https://issues.apache.org/jira/browse/THRIFT-5824) - Migrate, refactor and improve Delphi code generation test script +- [THRIFT-5825](https://issues.apache.org/jira/browse/THRIFT-5825) - UUID constants lead to uncompileable Delphi code +- [THRIFT-5826](https://issues.apache.org/jira/browse/THRIFT-5826) - binary constants create uncompilable Delphi code +- [THRIFT-5827](https://issues.apache.org/jira/browse/THRIFT-5827) - enums in typedefs are not resolved in all cases +- [THRIFT-5837](https://issues.apache.org/jira/browse/THRIFT-5837) - Delphi implementation for THRIFT-5835 +- [THRIFT-5839](https://issues.apache.org/jira/browse/THRIFT-5839) - incorrect cast under Win64 +- [THRIFT-5850](https://issues.apache.org/jira/browse/THRIFT-5850) - Switch IThriftConfiguration interface from Cardinal to Integer +- [THRIFT-5851](https://issues.apache.org/jira/browse/THRIFT-5851) - Promote known total stream sizes for seekable stream transports properly +- [THRIFT-5856](https://issues.apache.org/jira/browse/THRIFT-5856) - Client should validate HTTP status + +### Go + +- [THRIFT-5833](https://issues.apache.org/jira/browse/THRIFT-5833) - go: Combine I/O and original error in compiler generated Process functions +- [THRIFT-5845](https://issues.apache.org/jira/browse/THRIFT-5845) - The write error for union fields should be TException +- [THRIFT-5859](https://issues.apache.org/jira/browse/THRIFT-5859) - go: Generate a map for know values of an enum type + +### Java + +- [THRIFT-5858](https://issues.apache.org/jira/browse/THRIFT-5858) - Introduce new type MESSAGE_SIZE_LIMIT in TTransportException + +### netstd + +- [THRIFT-5832](https://issues.apache.org/jira/browse/THRIFT-5832) - Drop net6 support and add net9 instead +- [THRIFT-5838](https://issues.apache.org/jira/browse/THRIFT-5838) - THttpTransport.FlushAsync does not include original exception +- [THRIFT-5852](https://issues.apache.org/jira/browse/THRIFT-5852) - Promote known total stream sizes for seekable stream transports + +### Node.js + +- [THRIFT-5811](https://issues.apache.org/jira/browse/THRIFT-5811) - Add ES module support to JS codegen +- [THRIFT-5848](https://issues.apache.org/jira/browse/THRIFT-5848) - Expose InputBufferUnderrunError in nodejs client +- [THRIFT-5849](https://issues.apache.org/jira/browse/THRIFT-5849) - Expose createClient in browser version of nodejs package + +### PHP + +- [THRIFT-1482](https://issues.apache.org/jira/browse/THRIFT-1482) - Unix domain socket support under PHP +- [THRIFT-5829](https://issues.apache.org/jira/browse/THRIFT-5829) - PHP lib Use of "static" in callables is deprecated notice + +### Python + +- [THRIFT-5024](https://issues.apache.org/jira/browse/THRIFT-5024) - tutorial\py.tornado\PythonServer.py failed under Tornado6 +- [THRIFT-5847](https://issues.apache.org/jira/browse/THRIFT-5847) - Python3.12 deprecation in THttpClient +- [THRIFT-5857](https://issues.apache.org/jira/browse/THRIFT-5857) - Remove deprecated Tornado io_loop usage +- [THRIFT-5861](https://issues.apache.org/jira/browse/THRIFT-5861) - Add isOpen method to TTornadoStreamTransport + +### Swift + +- [THRIFT-4838](https://issues.apache.org/jira/browse/THRIFT-4838) - add unix domain socket support to Swift TSocketTransport implementation + + ## 0.21.0 ### Build Process From 7fff2c63df632028808a905e8a4d980534b8cb82 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 14 May 2025 23:38:03 +0200 Subject: [PATCH 253/430] FIX: no rule to build eslintignore --- Makefile.am | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index df7490424fa..7b455e886c2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -139,7 +139,6 @@ EXTRA_DIST = \ .clang-format \ .dockerignore \ .editorconfig \ - .eslintignore \ .eslintrc.json \ .flake8 \ .gitattributes \ From de90963faa6f973af7c0be43d646fba38ea4976b Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 15 May 2025 00:31:21 +0200 Subject: [PATCH 254/430] FIX: no rule for .eslintrc.json FIX: outdated golang versions in Dockerfiles --- Makefile.am | 1 - build/docker/ubuntu-focal/Dockerfile | 4 ++-- build/docker/ubuntu-jammy/Dockerfile | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Makefile.am b/Makefile.am index 7b455e886c2..bbae44fa657 100644 --- a/Makefile.am +++ b/Makefile.am @@ -139,7 +139,6 @@ EXTRA_DIST = \ .clang-format \ .dockerignore \ .editorconfig \ - .eslintrc.json \ .flake8 \ .gitattributes \ .gitignore \ diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile index 831d07e95b2..50bb64c01e8 100644 --- a/build/docker/ubuntu-focal/Dockerfile +++ b/build/docker/ubuntu-focal/Dockerfile @@ -159,9 +159,9 @@ RUN apt-get install -y --no-install-recommends \ libglib2.0-dev # golang -ENV GOLANG_VERSION 1.21.7 +ENV GOLANG_VERSION 1.24.3 ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz -ENV GOLANG_DOWNLOAD_SHA256 13b76a9b2a26823e53062fa841b07087d48ae2ef2936445dc34c4ae03293702c +ENV GOLANG_DOWNLOAD_SHA256 3333f6ea53afa971e9078895eaa4ac7204a8c6b5c68c10e6bc9a33e8e391bdd8 RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \ echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - && \ tar -C /usr/local -xzf golang.tar.gz && \ diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile index f2001ffd714..220fa2b6bb7 100644 --- a/build/docker/ubuntu-jammy/Dockerfile +++ b/build/docker/ubuntu-jammy/Dockerfile @@ -159,9 +159,9 @@ RUN apt-get install -y --no-install-recommends \ libglib2.0-dev # golang -ENV GOLANG_VERSION 1.21.7 +ENV GOLANG_VERSION 1.24.3 ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz -ENV GOLANG_DOWNLOAD_SHA256 13b76a9b2a26823e53062fa841b07087d48ae2ef2936445dc34c4ae03293702c +ENV GOLANG_DOWNLOAD_SHA256 3333f6ea53afa971e9078895eaa4ac7204a8c6b5c68c10e6bc9a33e8e391bdd8 RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \ echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - && \ tar -C /usr/local -xzf golang.tar.gz && \ From 071e7cede47a2cb3c4fc681b27e1549e4ed8f1df Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 15 May 2025 01:18:54 +0200 Subject: [PATCH 255/430] FIX: misc EXTRA_DIST sections --- Makefile.am | 2 ++ lib/php/Makefile.am | 1 + lib/rs/Makefile.am | 2 ++ test/Makefile.am | 1 + 4 files changed, 6 insertions(+) diff --git a/Makefile.am b/Makefile.am index bbae44fa657..6ecd7778ad5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -163,6 +163,7 @@ EXTRA_DIST = \ doap.rdf \ doc \ dub.json \ + eslint.config.mjs \ go.mod \ jitpack.yml \ LANGUAGES.md \ @@ -170,6 +171,7 @@ EXTRA_DIST = \ NOTICE \ package.json \ package-lock.json \ + Package.swift \ phpcs.xml.dist \ README.md \ rust-toolchain \ diff --git a/lib/php/Makefile.am b/lib/php/Makefile.am index 3851294604e..ece8d244574 100644 --- a/lib/php/Makefile.am +++ b/lib/php/Makefile.am @@ -150,6 +150,7 @@ EXTRA_DIST = \ src/TStringUtils.php \ coding_standards.md \ thrift_protocol.ini \ + phpunit.xml \ README.apache.md \ README.md \ test diff --git a/lib/rs/Makefile.am b/lib/rs/Makefile.am index 3a134034d50..307f8422877 100644 --- a/lib/rs/Makefile.am +++ b/lib/rs/Makefile.am @@ -53,5 +53,7 @@ EXTRA_DIST = \ Cargo.toml \ README.md \ release.sh \ + NOTICE \ + LICENSE \ RELEASING.md diff --git a/test/Makefile.am b/test/Makefile.am index bc0cd633412..c53d3b19d7c 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -155,6 +155,7 @@ EXTRA_DIST = \ DoubleConstantsTest.thrift \ EnumContainersTest.thrift \ EnumTest.thrift \ + ExceptionStruct.thrift \ FullCamelTest.thrift \ Include.thrift \ Identifiers.thrift \ From 12f2bfaf86d5ca9879e515e4085963590de2d3a1 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 15 May 2025 01:59:54 +0200 Subject: [PATCH 256/430] FIX: missing EXTRA_DIST release_rust.yml --- Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.am b/Makefile.am index 6ecd7778ad5..735cd405929 100644 --- a/Makefile.am +++ b/Makefile.am @@ -148,6 +148,7 @@ EXTRA_DIST = \ .github/workflows/build.yml \ .github/workflows/cmake.yml \ .github/workflows/pypi.yml \ + .github/workflows/release_rust.yml \ .travis.yml \ ApacheThrift.nuspec \ appveyor.yml \ From a58d122b567f3bb5f4f415e08481ab5886e12589 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 14 May 2025 22:27:02 +0200 Subject: [PATCH 257/430] updated CHANGES.md --- CHANGES.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 26f474e7b6b..8616e92a502 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,83 @@ # Apache Thrift Changelog +## 0.22.0 + +### Build Process + +- [THRIFT-5836](https://issues.apache.org/jira/browse/THRIFT-5836) - 0.21.0 fails to build from sources at Arch Linux: No rule to make target 'Thrift5272.thrift', needed by 'gen-cpp/Thrift5272_types.h' +- [THRIFT-5860](https://issues.apache.org/jira/browse/THRIFT-5860) - cmake 3.5 as a minimum version does not work with cmake 4.0.0 + +### C glib + +- [THRIFT-5817](https://issues.apache.org/jira/browse/THRIFT-5817) - [C++] Avoid copy of TUuid + +### C++ + +- [THRIFT-5637](https://issues.apache.org/jira/browse/THRIFT-5637) - Thrift compiler should be able to output c++ Aggregate types +- [THRIFT-5667](https://issues.apache.org/jira/browse/THRIFT-5667) - Make ThriftConfig.cmake relocatable +- [THRIFT-5817](https://issues.apache.org/jira/browse/THRIFT-5817) - [C++] Avoid copy of TUuid +- [THRIFT-5821](https://issues.apache.org/jira/browse/THRIFT-5821) - Cannot compile against aws-lc libcrypto (openssl replacement from AWS) +- [THRIFT-5841](https://issues.apache.org/jira/browse/THRIFT-5841) - possible init/deinit conflict with manual initialization flag +- [THRIFT-5853](https://issues.apache.org/jira/browse/THRIFT-5853) - Remove oldstyle casts from TBufferTransports and TCompactProtocol +- [THRIFT-5854](https://issues.apache.org/jira/browse/THRIFT-5854) - TCompactProtocol readString checks maxMessageSize at wrong position and off by one + +### Compiler (General) + +- [THRIFT-5823](https://issues.apache.org/jira/browse/THRIFT-5823) - Fix illegal uses of exceptions as normal struct type +- [THRIFT-5835](https://issues.apache.org/jira/browse/THRIFT-5835) - Allow exceptions to be used as regular struct datatype + +# Delphi + +- [THRIFT-5822](https://issues.apache.org/jira/browse/THRIFT-5822) - Remove deprecated AnsiString functions from the library +- [THRIFT-5824](https://issues.apache.org/jira/browse/THRIFT-5824) - Migrate, refactor and improve Delphi code generation test script +- [THRIFT-5825](https://issues.apache.org/jira/browse/THRIFT-5825) - UUID constants lead to uncompileable Delphi code +- [THRIFT-5826](https://issues.apache.org/jira/browse/THRIFT-5826) - binary constants create uncompilable Delphi code +- [THRIFT-5827](https://issues.apache.org/jira/browse/THRIFT-5827) - enums in typedefs are not resolved in all cases +- [THRIFT-5837](https://issues.apache.org/jira/browse/THRIFT-5837) - Delphi implementation for THRIFT-5835 +- [THRIFT-5839](https://issues.apache.org/jira/browse/THRIFT-5839) - incorrect cast under Win64 +- [THRIFT-5850](https://issues.apache.org/jira/browse/THRIFT-5850) - Switch IThriftConfiguration interface from Cardinal to Integer +- [THRIFT-5851](https://issues.apache.org/jira/browse/THRIFT-5851) - Promote known total stream sizes for seekable stream transports properly +- [THRIFT-5856](https://issues.apache.org/jira/browse/THRIFT-5856) - Client should validate HTTP status + +### Go + +- [THRIFT-5833](https://issues.apache.org/jira/browse/THRIFT-5833) - go: Combine I/O and original error in compiler generated Process functions +- [THRIFT-5845](https://issues.apache.org/jira/browse/THRIFT-5845) - The write error for union fields should be TException +- [THRIFT-5859](https://issues.apache.org/jira/browse/THRIFT-5859) - go: Generate a map for know values of an enum type + +### Java + +- [THRIFT-5858](https://issues.apache.org/jira/browse/THRIFT-5858) - Introduce new type MESSAGE_SIZE_LIMIT in TTransportException + +### netstd + +- [THRIFT-5832](https://issues.apache.org/jira/browse/THRIFT-5832) - Drop net6 support and add net9 instead +- [THRIFT-5838](https://issues.apache.org/jira/browse/THRIFT-5838) - THttpTransport.FlushAsync does not include original exception +- [THRIFT-5852](https://issues.apache.org/jira/browse/THRIFT-5852) - Promote known total stream sizes for seekable stream transports + +### Node.js + +- [THRIFT-5811](https://issues.apache.org/jira/browse/THRIFT-5811) - Add ES module support to JS codegen +- [THRIFT-5848](https://issues.apache.org/jira/browse/THRIFT-5848) - Expose InputBufferUnderrunError in nodejs client +- [THRIFT-5849](https://issues.apache.org/jira/browse/THRIFT-5849) - Expose createClient in browser version of nodejs package + +### PHP + +- [THRIFT-1482](https://issues.apache.org/jira/browse/THRIFT-1482) - Unix domain socket support under PHP +- [THRIFT-5829](https://issues.apache.org/jira/browse/THRIFT-5829) - PHP lib Use of "static" in callables is deprecated notice + +### Python + +- [THRIFT-5024](https://issues.apache.org/jira/browse/THRIFT-5024) - tutorial\py.tornado\PythonServer.py failed under Tornado6 +- [THRIFT-5847](https://issues.apache.org/jira/browse/THRIFT-5847) - Python3.12 deprecation in THttpClient +- [THRIFT-5857](https://issues.apache.org/jira/browse/THRIFT-5857) - Remove deprecated Tornado io_loop usage +- [THRIFT-5861](https://issues.apache.org/jira/browse/THRIFT-5861) - Add isOpen method to TTornadoStreamTransport + +### Swift + +- [THRIFT-4838](https://issues.apache.org/jira/browse/THRIFT-4838) - add unix domain socket support to Swift TSocketTransport implementation + + ## 0.21.0 ### Build Process From ce696f331e5d93987ecf93b90c63c336edc87b9a Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 15 May 2025 09:52:02 +0200 Subject: [PATCH 258/430] FIX build does not install net 9 properly --- build/docker/ubuntu-focal/Dockerfile | 1 + build/docker/ubuntu-jammy/Dockerfile | 6 ------ 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile index 50bb64c01e8..e0244fcd6d1 100644 --- a/build/docker/ubuntu-focal/Dockerfile +++ b/build/docker/ubuntu-focal/Dockerfile @@ -137,6 +137,7 @@ RUN apt-get install -y --no-install-recommends \ dart=$DART_VERSION ENV PATH /usr/lib/dart/bin:$PATH +# Because Ubuntu 20.04 reaches end of life in April [actually May] 2025, Microsoft has decided not to support .NET 9 on Ubuntu 20.04. RUN apt-get install -y --no-install-recommends \ `# dotnet core dependencies` \ dotnet-sdk-8.0 \ diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile index 220fa2b6bb7..8f66a5646e7 100644 --- a/build/docker/ubuntu-jammy/Dockerfile +++ b/build/docker/ubuntu-jammy/Dockerfile @@ -51,12 +51,6 @@ RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - & curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \ /etc/apt/sources.list.d/dart_stable.list -# dotnet (netcore) -RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \ - wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/22.04/prod.list && \ - chown root:root /etc/apt/trusted.gpg.d/microsoft.gpg && \ - chown root:root /etc/apt/sources.list.d/microsoft-prod.list - # node.js RUN curl -sL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \ echo "deb https://deb.nodesource.com/node_16.x focal main" | tee /etc/apt/sources.list.d/nodesource.list From 4035ecca56960998dd18e14ddc4eeeb871c0bdaa Mon Sep 17 00:00:00 2001 From: Carel Combrink Date: Wed, 14 May 2025 08:39:55 +0200 Subject: [PATCH 259/430] THRIFT-5865: Fix TBinayProtocol with list Client: cpp Patch: Carel Combrink This closes #3136 --- .../src/thrift/protocol/TBinaryProtocol.tcc | 1 + lib/cpp/test/DebugProtoTest.cpp | 33 ++++++++++++++++++- lib/cpp/test/JSONProtoTest.cpp | 15 ++++++--- test/DebugProtoTest.thrift | 5 +-- 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc b/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc index 1bd7a1ae128..b227c330497 100644 --- a/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc +++ b/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc @@ -493,6 +493,7 @@ int TBinaryProtocolT::getMinSerializedSize(TType type) case T_MAP: return sizeof(int); // element count case T_SET: return sizeof(int); // element count case T_LIST: return sizeof(int); // element count + case T_UUID: return 16; // 16 bytes default: throw TProtocolException(TProtocolException::UNKNOWN, "unrecognized type code"); } } diff --git a/lib/cpp/test/DebugProtoTest.cpp b/lib/cpp/test/DebugProtoTest.cpp index 44eeef768d6..1a56e7edee2 100644 --- a/lib/cpp/test/DebugProtoTest.cpp +++ b/lib/cpp/test/DebugProtoTest.cpp @@ -78,6 +78,8 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_1) { " [raw] = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\",\n" " [enc] = \"00000000-0000-0000-0000-000000000000\"\n" " }\n" + " 16: rfc4122_uuid_list (list) = list[0] {\n" + " },\n" "}"); const std::string result(apache::thrift::ThriftDebugString(*ooe)); @@ -88,6 +90,8 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_1) { static ::std::shared_ptr n; void testCaseSetup_2() { + using apache::thrift::TUuid; + testCaseSetup_1(); n.reset(new Nesting); @@ -102,9 +106,14 @@ void testCaseSetup_2() { "\xb0\xcf\x81\xe2\x84\x8e\x20\xce\x91\x74\x74" "\xce\xb1\xe2\x85\xbd\xce\xba\xc7\x83\xe2\x80" "\xbc"; - n->my_ooe.rfc4122_uuid = apache::thrift::TUuid{"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"}; + n->my_ooe.rfc4122_uuid = TUuid{"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"}; n->my_bonk.type = 31337; n->my_bonk.message = "I am a bonk... xor!"; + + std::vector uuiid_list; + uuiid_list.push_back(TUuid{"{fa1af5ec-fdc2-4355-844a-9f0dbfd00e50}"}); + uuiid_list.push_back(TUuid{"{1beece83-34f4-4fa3-b757-1ad1ac157fe3}"}); + n->my_ooe.rfc4122_uuid_list = uuiid_list; } BOOST_AUTO_TEST_CASE(test_debug_proto_2) { @@ -150,6 +159,16 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_2) { " [raw] = \"^*\\xb1\\x88\\x17&Nu\\xa0O\\x1e\\xd9\\xa6\\xa8\\x9cL\",\n" " [enc] = \"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c\"\n" " }\n" + " 16: rfc4122_uuid_list (list) = list[2] {\n" + "{\n" + " [raw] = [0] = \"\\xfa\\x1a\\xf5\\xec\\xfd\\xc2CU\\x84J\\x9f\\r\\xbf\\xd0\\x0eP\",\n" + " [enc] = \"fa1af5ec-fdc2-4355-844a-9f0dbfd00e50\"\n" + " }\n" + "{\n" + " [raw] = [1] = \"\\x1b\\xee\\xce\\x834\\xf4O\\xa3\\xb7W\\x1a\\xd1\\xac\\x15\\x7f\\xe3\",\n" + " [enc] = \"1beece83-34f4-4fa3-b757-1ad1ac157fe3\"\n" + " }\n" + " },\n" " },\n" "}"); const std::string result(apache::thrift::ThriftDebugString(*n)); @@ -241,6 +260,8 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_3) { " [raw] = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\",\n" " [enc] = \"00000000-0000-0000-0000-000000000000\"\n" " }\n" + " 16: rfc4122_uuid_list (list) = list[0] {\n" + " },\n" " },\n" " [1] = OneOfEach {\n" " 01: im_true (bool) = true,\n" @@ -276,6 +297,16 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_3) { " [raw] = \"^*\\xb1\\x88\\x17&Nu\\xa0O\\x1e\\xd9\\xa6\\xa8\\x9cL\",\n" " [enc] = \"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c\"\n" " }\n" + " 16: rfc4122_uuid_list (list) = list[2] {\n" + "{\n" + " [raw] = [0] = \"\\xfa\\x1a\\xf5\\xec\\xfd\\xc2CU\\x84J\\x9f\\r\\xbf\\xd0\\x0eP\",\n" + " [enc] = \"fa1af5ec-fdc2-4355-844a-9f0dbfd00e50\"\n" + " }\n" + "{\n" + " [raw] = [1] = \"\\x1b\\xee\\xce\\x834\\xf4O\\xa3\\xb7W\\x1a\\xd1\\xac\\x15\\x7f\\xe3\",\n" + " [enc] = \"1beece83-34f4-4fa3-b757-1ad1ac157fe3\"\n" + " }\n" + " },\n" " },\n" " },\n" " 02: contain (set) = set[3] {\n" diff --git a/lib/cpp/test/JSONProtoTest.cpp b/lib/cpp/test/JSONProtoTest.cpp index b96638e7ad9..ef3938589ac 100644 --- a/lib/cpp/test/JSONProtoTest.cpp +++ b/lib/cpp/test/JSONProtoTest.cpp @@ -60,7 +60,8 @@ BOOST_AUTO_TEST_CASE(test_json_proto_1) { "535897931},\"8\":{\"str\":\"JSON THIS! \\\"\\u0001\"},\"9\":{\"str\":\"\xd7\\" "n\\u0007\\t\"},\"10\":{\"tf\":0},\"11\":{\"str\":\"AQIDrQ\"},\"12\":{\"lst\"" ":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16\",3,1,2,3]},\"14\":{\"lst\":[\"i64" - "\",3,1,2,3]},\"15\":{\"uid\":\"00000000-0000-0000-0000-000000000000\"}}"); + "\",3,1,2,3]},\"15\":{\"uid\":\"00000000-0000-0000-0000-000000000000\"},\"16\"" + ":{\"lst\":[\"uid\",0]}}"); const std::string result(apache::thrift::ThriftJSONString(*ooe)); @@ -86,6 +87,10 @@ void testCaseSetup_2() { "\xce\xb1\xe2\x85\xbd\xce\xba\xc7\x83\xe2\x80" "\xbc"; n->my_ooe.rfc4122_uuid = apache::thrift::TUuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}; + std::vector uuiid_list; + uuiid_list.push_back(apache::thrift::TUuid{"{fa1af5ec-fdc2-4355-844a-9f0dbfd00e50}"}); + uuiid_list.push_back(apache::thrift::TUuid{"{1beece83-34f4-4fa3-b757-1ad1ac157fe3}"}); + n->my_ooe.rfc4122_uuid_list = uuiid_list; n->my_bonk.type = 31337; n->my_bonk.message = "I am a bonk... xor!"; } @@ -101,7 +106,8 @@ BOOST_AUTO_TEST_CASE(test_json_proto_2) { "\"str\":\"ӀⅮΝ Нοⅿоɡгаρℎ Αttαⅽκǃ‼\"},\"10\":{\"tf\":0},\"11\":{\"str\":\"" "AQIDrQ\"},\"12\":{\"lst\":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16\",3,1,2" ",3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]},\"15\":{\"uid\":\"5e2ab188-1726-" - "4e75-a04f-1ed9a6a89c4c\"}}}}" + "4e75-a04f-1ed9a6a89c4c\"},\"16\":{\"lst\":[\"uid\",2,\"fa1af5ec-fdc2-4355-" + "844a-9f0dbfd00e50\",\"1beece83-34f4-4fa3-b757-1ad1ac157fe3\"]}}}}" ); const std::string result(apache::thrift::ThriftJSONString(*n)); @@ -166,13 +172,14 @@ BOOST_AUTO_TEST_CASE(test_json_proto_3) { "\"},\"9\":{\"str\":\"\xd7\\n\\u0007\\t\"},\"10\":{\"tf\":0},\"11\":{\"str\":" "\"AQIDrQ\"},\"12\":{\"lst\":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16\",3,1,2" ",3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]},\"15\":{\"uid\":\"00000000-0000-0000" - "-0000-000000000000\"}},{\"1\":{\"tf\":1},\"2\":{\"tf\":0}," + "-0000-000000000000\"},\"16\":{\"lst\":[\"uid\",0]}},{\"1\":{\"tf\":1},\"2\":{\"tf\":0}," "\"3\":{\"i8\":51},\"4\":{\"i16\":16},\"5\":{\"i32\":32},\"6\":{\"i64\":64}," "\"7\":{\"dbl\":1.6180339887498949},\"8\":{\"str\":\":R (me going \\\"rrrr\\\"" ")\"},\"9\":{\"str\":\"ӀⅮΝ Нοⅿоɡгаρℎ Αttαⅽκǃ‼\"},\"10\":{\"tf\":0},\"11\":{" "\"str\":\"AQIDrQ\"},\"12\":{\"lst\":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16" "\",3,1,2,3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]},\"15\":{\"uid\":\"5e2ab188-" - "1726-4e75-a04f-1ed9a6a89c4c\"}}]},\"2\":{\"set\":[\"lst\",3" + "1726-4e75-a04f-1ed9a6a89c4c\"},\"16\":{\"lst\":[\"uid\",2,\"fa1af5ec-fdc2-4355-" + "844a-9f0dbfd00e50\",\"1beece83-34f4-4fa3-b757-1ad1ac157fe3\"]}}]},\"2\":{\"set\":[\"lst\",3" ",[\"str\",0],[\"str\",2,\"and a one\",\"and a two\"],[\"str\",3,\"then a one" ", two\",\"three!\",\"FOUR!!\"]]},\"3\":{\"map\":[\"str\",\"lst\",3,{\"nothin" "g\":[\"rec\",0],\"poe\":[\"rec\",3,{\"1\":{\"i32\":3},\"2\":{\"str\":\"quoth" diff --git a/test/DebugProtoTest.thrift b/test/DebugProtoTest.thrift index 3750d8d9360..22bf095f333 100644 --- a/test/DebugProtoTest.thrift +++ b/test/DebugProtoTest.thrift @@ -47,8 +47,9 @@ struct OneOfEach { 11: binary base64, 12: list byte_list = [1, 2, 3], 13: list i16_list = [1,2,3], - 14: list i64_list = [1,2,3] - 15: uuid rfc4122_uuid + 14: list i64_list = [1,2,3], + 15: uuid rfc4122_uuid, + 16: list rfc4122_uuid_list, } struct Bonk { From 786764baa3bea26de4a124896a7d7f41f94fe075 Mon Sep 17 00:00:00 2001 From: Carel Combrink Date: Thu, 15 May 2025 12:22:37 +0000 Subject: [PATCH 260/430] THRIFT-5868: UUID Support for TCompactProtocol Client: cpp Patch: Carel Combrink This closes #3137 --- .../src/thrift/protocol/TCompactProtocol.h | 4 +++ .../src/thrift/protocol/TCompactProtocol.tcc | 27 +++++++++++++++++-- lib/cpp/test/AllProtocolTests.tcc | 4 +++ lib/cpp/test/GenericHelpers.h | 13 +++++++++ 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/lib/cpp/src/thrift/protocol/TCompactProtocol.h b/lib/cpp/src/thrift/protocol/TCompactProtocol.h index 81db1f67bd3..c7d81eea6e5 100644 --- a/lib/cpp/src/thrift/protocol/TCompactProtocol.h +++ b/lib/cpp/src/thrift/protocol/TCompactProtocol.h @@ -140,6 +140,8 @@ class TCompactProtocolT : public TVirtualProtocol uint32_t writeBinary(const std::string& str); + uint32_t writeUUID(const TUuid& str); + int getMinSerializedSize(TType type) override; void checkReadBytesAvailable(TSet& set) override @@ -213,6 +215,8 @@ class TCompactProtocolT : public TVirtualProtocol uint32_t readBinary(std::string& str); + uint32_t readUUID(TUuid& str); + /* *These methods are here for the struct to call, but don't have any wire * encoding. diff --git a/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc b/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc index a872c23db89..b57568f8dcb 100644 --- a/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc +++ b/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc @@ -61,10 +61,11 @@ enum Types { CT_LIST = 0x09, CT_SET = 0x0A, CT_MAP = 0x0B, - CT_STRUCT = 0x0C + CT_STRUCT = 0x0C, + CT_UUID = 0x0D }; -const int8_t TTypeToCType[16] = { +const int8_t TTypeToCType[17] = { CT_STOP, // T_STOP 0, // unused CT_BOOLEAN_TRUE, // T_BOOL @@ -81,6 +82,7 @@ const int8_t TTypeToCType[16] = { CT_MAP, // T_MAP CT_SET, // T_SET CT_LIST, // T_LIST + CT_UUID, // T_UUID }; }} // end detail::compact namespace @@ -286,6 +288,15 @@ uint32_t TCompactProtocolT::writeBinary(const std::string& str) { return wsize; } +/** + * Write a TUuid to the wire + */ +template +uint32_t TCompactProtocolT::writeUUID(const TUuid& uuid) { + trans_->write(uuid.data(), uuid.size()); + return uuid.size(); +} + // // Internal Writing methods // @@ -719,6 +730,15 @@ uint32_t TCompactProtocolT::readBinary(std::string& str) { return rsize + static_cast(size); } + +/** + * Read a TUuid from the wire. + */ +template +uint32_t TCompactProtocolT::readUUID(TUuid& uuid) { + return trans_->readAll(uuid.begin(), uuid.size()); +} + /** * Read an i32 from the wire as a varint. The MSB of each byte is set * if there is another byte to follow. This can read up to 5 bytes. @@ -826,6 +846,8 @@ TType TCompactProtocolT::getTType(int8_t type) { return T_MAP; case detail::compact::CT_STRUCT: return T_STRUCT; + case detail::compact::CT_UUID: + return T_UUID; default: throw TException(std::string("don't know what type: ") + static_cast(type)); } @@ -850,6 +872,7 @@ int TCompactProtocolT::getMinSerializedSize(TType type) case T_MAP: return sizeof(int8_t); // element count case T_SET: return sizeof(int8_t); // element count case T_LIST: return sizeof(int8_t); // element count + case T_UUID: return 16; // 16 bytes default: throw TProtocolException(TProtocolException::UNKNOWN, "unrecognized type code"); } } diff --git a/lib/cpp/test/AllProtocolTests.tcc b/lib/cpp/test/AllProtocolTests.tcc index 80a4ea097ab..cb98917d3ea 100644 --- a/lib/cpp/test/AllProtocolTests.tcc +++ b/lib/cpp/test/AllProtocolTests.tcc @@ -25,6 +25,7 @@ #include #include #include +#include #include "GenericHelpers.h" @@ -208,6 +209,9 @@ void testProtocol(const char* protoname) { testNaked("a bit longer than the smallest possible"); testNaked("\x1\x2\x3\x4\x5\x6\x7\x8\x9\xA"); // kinda binary test + testNaked(TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c")); + testField(TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c")); + testField(""); testField("short"); testField("borderlinetiny"); diff --git a/lib/cpp/test/GenericHelpers.h b/lib/cpp/test/GenericHelpers.h index bcef9f24252..1eed4e2b517 100644 --- a/lib/cpp/test/GenericHelpers.h +++ b/lib/cpp/test/GenericHelpers.h @@ -23,6 +23,7 @@ #include #include #include +#include /* ClassName Helper for cleaner exceptions */ class ClassNames { @@ -57,6 +58,10 @@ template <> const char* ClassNames::getName() { return "string"; } +template <> +const char* ClassNames::getName() { + return "uuid"; +} /* Generic Protocol I/O function for tests */ class GenericIO { @@ -87,6 +92,10 @@ class GenericIO { return proto->writeString(val); } + static uint32_t write(std::shared_ptr proto, const apache::thrift::TUuid& val) { + return proto->writeUUID(val); + } + /* Read functions */ static uint32_t read(std::shared_ptr proto, int8_t& val) { return proto->readByte(val); } @@ -102,6 +111,10 @@ class GenericIO { static uint32_t read(std::shared_ptr proto, std::string& val) { return proto->readString(val); } + + static uint32_t read(std::shared_ptr proto, apache::thrift::TUuid& val) { + return proto->readUUID(val); + } }; #endif From 63eeff97a23e8a0d0265787008bd2c01fe433994 Mon Sep 17 00:00:00 2001 From: Carel Combrink Date: Wed, 14 May 2025 08:39:55 +0200 Subject: [PATCH 261/430] THRIFT-5865: Fix TBinayProtocol with list Client: cpp Patch: Carel Combrink This closes #3136 --- .../src/thrift/protocol/TBinaryProtocol.tcc | 1 + lib/cpp/test/DebugProtoTest.cpp | 33 ++++++++++++++++++- lib/cpp/test/JSONProtoTest.cpp | 15 ++++++--- test/DebugProtoTest.thrift | 5 +-- 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc b/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc index 1bd7a1ae128..b227c330497 100644 --- a/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc +++ b/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc @@ -493,6 +493,7 @@ int TBinaryProtocolT::getMinSerializedSize(TType type) case T_MAP: return sizeof(int); // element count case T_SET: return sizeof(int); // element count case T_LIST: return sizeof(int); // element count + case T_UUID: return 16; // 16 bytes default: throw TProtocolException(TProtocolException::UNKNOWN, "unrecognized type code"); } } diff --git a/lib/cpp/test/DebugProtoTest.cpp b/lib/cpp/test/DebugProtoTest.cpp index 44eeef768d6..1a56e7edee2 100644 --- a/lib/cpp/test/DebugProtoTest.cpp +++ b/lib/cpp/test/DebugProtoTest.cpp @@ -78,6 +78,8 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_1) { " [raw] = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\",\n" " [enc] = \"00000000-0000-0000-0000-000000000000\"\n" " }\n" + " 16: rfc4122_uuid_list (list) = list[0] {\n" + " },\n" "}"); const std::string result(apache::thrift::ThriftDebugString(*ooe)); @@ -88,6 +90,8 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_1) { static ::std::shared_ptr n; void testCaseSetup_2() { + using apache::thrift::TUuid; + testCaseSetup_1(); n.reset(new Nesting); @@ -102,9 +106,14 @@ void testCaseSetup_2() { "\xb0\xcf\x81\xe2\x84\x8e\x20\xce\x91\x74\x74" "\xce\xb1\xe2\x85\xbd\xce\xba\xc7\x83\xe2\x80" "\xbc"; - n->my_ooe.rfc4122_uuid = apache::thrift::TUuid{"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"}; + n->my_ooe.rfc4122_uuid = TUuid{"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"}; n->my_bonk.type = 31337; n->my_bonk.message = "I am a bonk... xor!"; + + std::vector uuiid_list; + uuiid_list.push_back(TUuid{"{fa1af5ec-fdc2-4355-844a-9f0dbfd00e50}"}); + uuiid_list.push_back(TUuid{"{1beece83-34f4-4fa3-b757-1ad1ac157fe3}"}); + n->my_ooe.rfc4122_uuid_list = uuiid_list; } BOOST_AUTO_TEST_CASE(test_debug_proto_2) { @@ -150,6 +159,16 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_2) { " [raw] = \"^*\\xb1\\x88\\x17&Nu\\xa0O\\x1e\\xd9\\xa6\\xa8\\x9cL\",\n" " [enc] = \"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c\"\n" " }\n" + " 16: rfc4122_uuid_list (list) = list[2] {\n" + "{\n" + " [raw] = [0] = \"\\xfa\\x1a\\xf5\\xec\\xfd\\xc2CU\\x84J\\x9f\\r\\xbf\\xd0\\x0eP\",\n" + " [enc] = \"fa1af5ec-fdc2-4355-844a-9f0dbfd00e50\"\n" + " }\n" + "{\n" + " [raw] = [1] = \"\\x1b\\xee\\xce\\x834\\xf4O\\xa3\\xb7W\\x1a\\xd1\\xac\\x15\\x7f\\xe3\",\n" + " [enc] = \"1beece83-34f4-4fa3-b757-1ad1ac157fe3\"\n" + " }\n" + " },\n" " },\n" "}"); const std::string result(apache::thrift::ThriftDebugString(*n)); @@ -241,6 +260,8 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_3) { " [raw] = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\",\n" " [enc] = \"00000000-0000-0000-0000-000000000000\"\n" " }\n" + " 16: rfc4122_uuid_list (list) = list[0] {\n" + " },\n" " },\n" " [1] = OneOfEach {\n" " 01: im_true (bool) = true,\n" @@ -276,6 +297,16 @@ BOOST_AUTO_TEST_CASE(test_debug_proto_3) { " [raw] = \"^*\\xb1\\x88\\x17&Nu\\xa0O\\x1e\\xd9\\xa6\\xa8\\x9cL\",\n" " [enc] = \"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c\"\n" " }\n" + " 16: rfc4122_uuid_list (list) = list[2] {\n" + "{\n" + " [raw] = [0] = \"\\xfa\\x1a\\xf5\\xec\\xfd\\xc2CU\\x84J\\x9f\\r\\xbf\\xd0\\x0eP\",\n" + " [enc] = \"fa1af5ec-fdc2-4355-844a-9f0dbfd00e50\"\n" + " }\n" + "{\n" + " [raw] = [1] = \"\\x1b\\xee\\xce\\x834\\xf4O\\xa3\\xb7W\\x1a\\xd1\\xac\\x15\\x7f\\xe3\",\n" + " [enc] = \"1beece83-34f4-4fa3-b757-1ad1ac157fe3\"\n" + " }\n" + " },\n" " },\n" " },\n" " 02: contain (set) = set[3] {\n" diff --git a/lib/cpp/test/JSONProtoTest.cpp b/lib/cpp/test/JSONProtoTest.cpp index b96638e7ad9..ef3938589ac 100644 --- a/lib/cpp/test/JSONProtoTest.cpp +++ b/lib/cpp/test/JSONProtoTest.cpp @@ -60,7 +60,8 @@ BOOST_AUTO_TEST_CASE(test_json_proto_1) { "535897931},\"8\":{\"str\":\"JSON THIS! \\\"\\u0001\"},\"9\":{\"str\":\"\xd7\\" "n\\u0007\\t\"},\"10\":{\"tf\":0},\"11\":{\"str\":\"AQIDrQ\"},\"12\":{\"lst\"" ":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16\",3,1,2,3]},\"14\":{\"lst\":[\"i64" - "\",3,1,2,3]},\"15\":{\"uid\":\"00000000-0000-0000-0000-000000000000\"}}"); + "\",3,1,2,3]},\"15\":{\"uid\":\"00000000-0000-0000-0000-000000000000\"},\"16\"" + ":{\"lst\":[\"uid\",0]}}"); const std::string result(apache::thrift::ThriftJSONString(*ooe)); @@ -86,6 +87,10 @@ void testCaseSetup_2() { "\xce\xb1\xe2\x85\xbd\xce\xba\xc7\x83\xe2\x80" "\xbc"; n->my_ooe.rfc4122_uuid = apache::thrift::TUuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}; + std::vector uuiid_list; + uuiid_list.push_back(apache::thrift::TUuid{"{fa1af5ec-fdc2-4355-844a-9f0dbfd00e50}"}); + uuiid_list.push_back(apache::thrift::TUuid{"{1beece83-34f4-4fa3-b757-1ad1ac157fe3}"}); + n->my_ooe.rfc4122_uuid_list = uuiid_list; n->my_bonk.type = 31337; n->my_bonk.message = "I am a bonk... xor!"; } @@ -101,7 +106,8 @@ BOOST_AUTO_TEST_CASE(test_json_proto_2) { "\"str\":\"ӀⅮΝ Нοⅿоɡгаρℎ Αttαⅽκǃ‼\"},\"10\":{\"tf\":0},\"11\":{\"str\":\"" "AQIDrQ\"},\"12\":{\"lst\":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16\",3,1,2" ",3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]},\"15\":{\"uid\":\"5e2ab188-1726-" - "4e75-a04f-1ed9a6a89c4c\"}}}}" + "4e75-a04f-1ed9a6a89c4c\"},\"16\":{\"lst\":[\"uid\",2,\"fa1af5ec-fdc2-4355-" + "844a-9f0dbfd00e50\",\"1beece83-34f4-4fa3-b757-1ad1ac157fe3\"]}}}}" ); const std::string result(apache::thrift::ThriftJSONString(*n)); @@ -166,13 +172,14 @@ BOOST_AUTO_TEST_CASE(test_json_proto_3) { "\"},\"9\":{\"str\":\"\xd7\\n\\u0007\\t\"},\"10\":{\"tf\":0},\"11\":{\"str\":" "\"AQIDrQ\"},\"12\":{\"lst\":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16\",3,1,2" ",3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]},\"15\":{\"uid\":\"00000000-0000-0000" - "-0000-000000000000\"}},{\"1\":{\"tf\":1},\"2\":{\"tf\":0}," + "-0000-000000000000\"},\"16\":{\"lst\":[\"uid\",0]}},{\"1\":{\"tf\":1},\"2\":{\"tf\":0}," "\"3\":{\"i8\":51},\"4\":{\"i16\":16},\"5\":{\"i32\":32},\"6\":{\"i64\":64}," "\"7\":{\"dbl\":1.6180339887498949},\"8\":{\"str\":\":R (me going \\\"rrrr\\\"" ")\"},\"9\":{\"str\":\"ӀⅮΝ Нοⅿоɡгаρℎ Αttαⅽκǃ‼\"},\"10\":{\"tf\":0},\"11\":{" "\"str\":\"AQIDrQ\"},\"12\":{\"lst\":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16" "\",3,1,2,3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]},\"15\":{\"uid\":\"5e2ab188-" - "1726-4e75-a04f-1ed9a6a89c4c\"}}]},\"2\":{\"set\":[\"lst\",3" + "1726-4e75-a04f-1ed9a6a89c4c\"},\"16\":{\"lst\":[\"uid\",2,\"fa1af5ec-fdc2-4355-" + "844a-9f0dbfd00e50\",\"1beece83-34f4-4fa3-b757-1ad1ac157fe3\"]}}]},\"2\":{\"set\":[\"lst\",3" ",[\"str\",0],[\"str\",2,\"and a one\",\"and a two\"],[\"str\",3,\"then a one" ", two\",\"three!\",\"FOUR!!\"]]},\"3\":{\"map\":[\"str\",\"lst\",3,{\"nothin" "g\":[\"rec\",0],\"poe\":[\"rec\",3,{\"1\":{\"i32\":3},\"2\":{\"str\":\"quoth" diff --git a/test/DebugProtoTest.thrift b/test/DebugProtoTest.thrift index 3750d8d9360..22bf095f333 100644 --- a/test/DebugProtoTest.thrift +++ b/test/DebugProtoTest.thrift @@ -47,8 +47,9 @@ struct OneOfEach { 11: binary base64, 12: list byte_list = [1, 2, 3], 13: list i16_list = [1,2,3], - 14: list i64_list = [1,2,3] - 15: uuid rfc4122_uuid + 14: list i64_list = [1,2,3], + 15: uuid rfc4122_uuid, + 16: list rfc4122_uuid_list, } struct Bonk { From 3da784bec37a9080ca2fee2fc2cac19f1c1efa25 Mon Sep 17 00:00:00 2001 From: Carel Combrink Date: Thu, 15 May 2025 12:22:37 +0000 Subject: [PATCH 262/430] THRIFT-5868: UUID Support for TCompactProtocol Client: cpp Patch: Carel Combrink This closes #3137 --- .../src/thrift/protocol/TCompactProtocol.h | 4 +++ .../src/thrift/protocol/TCompactProtocol.tcc | 27 +++++++++++++++++-- lib/cpp/test/AllProtocolTests.tcc | 4 +++ lib/cpp/test/GenericHelpers.h | 13 +++++++++ 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/lib/cpp/src/thrift/protocol/TCompactProtocol.h b/lib/cpp/src/thrift/protocol/TCompactProtocol.h index 81db1f67bd3..c7d81eea6e5 100644 --- a/lib/cpp/src/thrift/protocol/TCompactProtocol.h +++ b/lib/cpp/src/thrift/protocol/TCompactProtocol.h @@ -140,6 +140,8 @@ class TCompactProtocolT : public TVirtualProtocol uint32_t writeBinary(const std::string& str); + uint32_t writeUUID(const TUuid& str); + int getMinSerializedSize(TType type) override; void checkReadBytesAvailable(TSet& set) override @@ -213,6 +215,8 @@ class TCompactProtocolT : public TVirtualProtocol uint32_t readBinary(std::string& str); + uint32_t readUUID(TUuid& str); + /* *These methods are here for the struct to call, but don't have any wire * encoding. diff --git a/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc b/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc index a872c23db89..b57568f8dcb 100644 --- a/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc +++ b/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc @@ -61,10 +61,11 @@ enum Types { CT_LIST = 0x09, CT_SET = 0x0A, CT_MAP = 0x0B, - CT_STRUCT = 0x0C + CT_STRUCT = 0x0C, + CT_UUID = 0x0D }; -const int8_t TTypeToCType[16] = { +const int8_t TTypeToCType[17] = { CT_STOP, // T_STOP 0, // unused CT_BOOLEAN_TRUE, // T_BOOL @@ -81,6 +82,7 @@ const int8_t TTypeToCType[16] = { CT_MAP, // T_MAP CT_SET, // T_SET CT_LIST, // T_LIST + CT_UUID, // T_UUID }; }} // end detail::compact namespace @@ -286,6 +288,15 @@ uint32_t TCompactProtocolT::writeBinary(const std::string& str) { return wsize; } +/** + * Write a TUuid to the wire + */ +template +uint32_t TCompactProtocolT::writeUUID(const TUuid& uuid) { + trans_->write(uuid.data(), uuid.size()); + return uuid.size(); +} + // // Internal Writing methods // @@ -719,6 +730,15 @@ uint32_t TCompactProtocolT::readBinary(std::string& str) { return rsize + static_cast(size); } + +/** + * Read a TUuid from the wire. + */ +template +uint32_t TCompactProtocolT::readUUID(TUuid& uuid) { + return trans_->readAll(uuid.begin(), uuid.size()); +} + /** * Read an i32 from the wire as a varint. The MSB of each byte is set * if there is another byte to follow. This can read up to 5 bytes. @@ -826,6 +846,8 @@ TType TCompactProtocolT::getTType(int8_t type) { return T_MAP; case detail::compact::CT_STRUCT: return T_STRUCT; + case detail::compact::CT_UUID: + return T_UUID; default: throw TException(std::string("don't know what type: ") + static_cast(type)); } @@ -850,6 +872,7 @@ int TCompactProtocolT::getMinSerializedSize(TType type) case T_MAP: return sizeof(int8_t); // element count case T_SET: return sizeof(int8_t); // element count case T_LIST: return sizeof(int8_t); // element count + case T_UUID: return 16; // 16 bytes default: throw TProtocolException(TProtocolException::UNKNOWN, "unrecognized type code"); } } diff --git a/lib/cpp/test/AllProtocolTests.tcc b/lib/cpp/test/AllProtocolTests.tcc index 80a4ea097ab..cb98917d3ea 100644 --- a/lib/cpp/test/AllProtocolTests.tcc +++ b/lib/cpp/test/AllProtocolTests.tcc @@ -25,6 +25,7 @@ #include #include #include +#include #include "GenericHelpers.h" @@ -208,6 +209,9 @@ void testProtocol(const char* protoname) { testNaked("a bit longer than the smallest possible"); testNaked("\x1\x2\x3\x4\x5\x6\x7\x8\x9\xA"); // kinda binary test + testNaked(TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c")); + testField(TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c")); + testField(""); testField("short"); testField("borderlinetiny"); diff --git a/lib/cpp/test/GenericHelpers.h b/lib/cpp/test/GenericHelpers.h index bcef9f24252..1eed4e2b517 100644 --- a/lib/cpp/test/GenericHelpers.h +++ b/lib/cpp/test/GenericHelpers.h @@ -23,6 +23,7 @@ #include #include #include +#include /* ClassName Helper for cleaner exceptions */ class ClassNames { @@ -57,6 +58,10 @@ template <> const char* ClassNames::getName() { return "string"; } +template <> +const char* ClassNames::getName() { + return "uuid"; +} /* Generic Protocol I/O function for tests */ class GenericIO { @@ -87,6 +92,10 @@ class GenericIO { return proto->writeString(val); } + static uint32_t write(std::shared_ptr proto, const apache::thrift::TUuid& val) { + return proto->writeUUID(val); + } + /* Read functions */ static uint32_t read(std::shared_ptr proto, int8_t& val) { return proto->readByte(val); } @@ -102,6 +111,10 @@ class GenericIO { static uint32_t read(std::shared_ptr proto, std::string& val) { return proto->readString(val); } + + static uint32_t read(std::shared_ptr proto, apache::thrift::TUuid& val) { + return proto->readUUID(val); + } }; #endif From af9ac170f4de895266de4b6f9f3e68a58f113760 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 16 May 2025 22:37:06 +0200 Subject: [PATCH 263/430] updated CHANGES.md --- CHANGES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 8616e92a502..14968af8d0a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -20,6 +20,9 @@ - [THRIFT-5841](https://issues.apache.org/jira/browse/THRIFT-5841) - possible init/deinit conflict with manual initialization flag - [THRIFT-5853](https://issues.apache.org/jira/browse/THRIFT-5853) - Remove oldstyle casts from TBufferTransports and TCompactProtocol - [THRIFT-5854](https://issues.apache.org/jira/browse/THRIFT-5854) - TCompactProtocol readString checks maxMessageSize at wrong position and off by one +- [THRIFT-5868](https://issues.apache.org/jira/browse/THRIFT-5868) - UUID Support for TCompactProtocol +- [THRIFT-5865](https://issues.apache.org/jira/browse/THRIFT-5865) - Fix TBinayProtocol with list + ### Compiler (General) From 7da25be7cc4f1529a78f119f911f0fff51659e1f Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sat, 17 May 2025 13:33:58 +0200 Subject: [PATCH 264/430] Markdown fixes (no content changes) --- CHANGES.md | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 14968af8d0a..cc89059131b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,19 +9,19 @@ ### C glib -- [THRIFT-5817](https://issues.apache.org/jira/browse/THRIFT-5817) - [C++] Avoid copy of TUuid +- [THRIFT-5817](https://issues.apache.org/jira/browse/THRIFT-5817) - Avoid copy of TUuid ### C++ - [THRIFT-5637](https://issues.apache.org/jira/browse/THRIFT-5637) - Thrift compiler should be able to output c++ Aggregate types - [THRIFT-5667](https://issues.apache.org/jira/browse/THRIFT-5667) - Make ThriftConfig.cmake relocatable -- [THRIFT-5817](https://issues.apache.org/jira/browse/THRIFT-5817) - [C++] Avoid copy of TUuid +- [THRIFT-5817](https://issues.apache.org/jira/browse/THRIFT-5817) - Avoid copy of TUuid - [THRIFT-5821](https://issues.apache.org/jira/browse/THRIFT-5821) - Cannot compile against aws-lc libcrypto (openssl replacement from AWS) - [THRIFT-5841](https://issues.apache.org/jira/browse/THRIFT-5841) - possible init/deinit conflict with manual initialization flag - [THRIFT-5853](https://issues.apache.org/jira/browse/THRIFT-5853) - Remove oldstyle casts from TBufferTransports and TCompactProtocol - [THRIFT-5854](https://issues.apache.org/jira/browse/THRIFT-5854) - TCompactProtocol readString checks maxMessageSize at wrong position and off by one - [THRIFT-5868](https://issues.apache.org/jira/browse/THRIFT-5868) - UUID Support for TCompactProtocol -- [THRIFT-5865](https://issues.apache.org/jira/browse/THRIFT-5865) - Fix TBinayProtocol with list +- [THRIFT-5865](https://issues.apache.org/jira/browse/THRIFT-5865) - Fix TBinayProtocol with `list` ### Compiler (General) @@ -29,7 +29,7 @@ - [THRIFT-5823](https://issues.apache.org/jira/browse/THRIFT-5823) - Fix illegal uses of exceptions as normal struct type - [THRIFT-5835](https://issues.apache.org/jira/browse/THRIFT-5835) - Allow exceptions to be used as regular struct datatype -# Delphi +### Delphi - [THRIFT-5822](https://issues.apache.org/jira/browse/THRIFT-5822) - Remove deprecated AnsiString functions from the library - [THRIFT-5824](https://issues.apache.org/jira/browse/THRIFT-5824) - Migrate, refactor and improve Delphi code generation test script @@ -585,7 +585,7 @@ NB. CL had been finally dropped from 0.17.0 due to lack of active maintainers. I ### Go -- [THRIFT-5461](https://issues.apache.org/jira/browse/THRIFT-5461) - Invalid golang code generated for optional set with a default value +- [THRIFT-5461](https://issues.apache.org/jira/browse/THRIFT-5461) - Invalid golang code generated for optional `set` with a default value - [THRIFT-5469](https://issues.apache.org/jira/browse/THRIFT-5469) - Go lib skip map value may cause stack overflow - [THRIFT-5490](https://issues.apache.org/jira/browse/THRIFT-5490) - Improve memory efficiency in go THeader implementation - [THRIFT-5509](https://issues.apache.org/jira/browse/THRIFT-5509) - Potential connection leaks caused by the connectivity check @@ -962,13 +962,13 @@ NB. CL had been finally dropped from 0.17.0 due to lack of active maintainers. I - [THRIFT-5012](https://issues.apache.org/jira/browse/THRIFT-5012) - Centralize configuration aspects into a commonly used configuration object - [THRIFT-5015](https://issues.apache.org/jira/browse/THRIFT-5015) - WinHTTP QueryDataAvailable cannot be used to retrieve total response size - [THRIFT-5036](https://issues.apache.org/jira/browse/THRIFT-5036) - buffered transport over sockets may run into unexpected timeouts -- [THRIFT-5048](https://issues.apache.org/jira/browse/THRIFT-5048) - EnumUtils.ToString() throws for elements not known to the receiving end +- [THRIFT-5048](https://issues.apache.org/jira/browse/THRIFT-5048) - `EnumUtils.ToString()` throws for elements not known to the receiving end - [THRIFT-5088](https://issues.apache.org/jira/browse/THRIFT-5088) - Memory leak in TEndpointTransportBase - [THRIFT-5123](https://issues.apache.org/jira/browse/THRIFT-5123) - add possibility to query HTTP status code with WinHTTP - [THRIFT-5146](https://issues.apache.org/jira/browse/THRIFT-5146) - Align Delphi to the test suite arguments rules (its "--switch=value", not "--switch value") - [THRIFT-5186](https://issues.apache.org/jira/browse/THRIFT-5186) - AI_ADDRCONFIG: Thrift libraries crash with localhost-only network. - [THRIFT-5188](https://issues.apache.org/jira/browse/THRIFT-5188) - Occasional ERROR_INSUFFICIENT_BUFFER at WinHttpQueryHeaders() -- [THRIFT-5251](https://issues.apache.org/jira/browse/THRIFT-5251) - StringUtils.ToString() raises an exception for enum values outside range +- [THRIFT-5251](https://issues.apache.org/jira/browse/THRIFT-5251) - `StringUtils.ToString()` raises an exception for enum values outside range - [THRIFT-5304](https://issues.apache.org/jira/browse/THRIFT-5304) - TWinHTTPClientImpl may incorrectly report that the message size is reached ### Documentation @@ -1293,7 +1293,7 @@ NB. CL had been finally dropped from 0.17.0 due to lack of active maintainers. I - [THRIFT-4884](https://issues.apache.org/jira/browse/THRIFT-4884) - Add serialisation performance test for Delphi - [THRIFT-4886](https://issues.apache.org/jira/browse/THRIFT-4886) - More detailed error information for WinHTTP transport - [THRIFT-4894](https://issues.apache.org/jira/browse/THRIFT-4894) - Enable automatic content encoding handling for gzip,deflate in the WinHTTP client -- [THRIFT-4939](https://issues.apache.org/jira/browse/THRIFT-4939) - TThriftListImpl.Sort() does not use comparer +- [THRIFT-4939](https://issues.apache.org/jira/browse/THRIFT-4939) - `TThriftListImpl.Sort()` does not use comparer - [THRIFT-4944](https://issues.apache.org/jira/browse/THRIFT-4944) - Field IDs > 255 fail with compact protocol ### Documentation @@ -1502,7 +1502,7 @@ Released 2019-JAN-04 - [THRIFT-4384](https://issues.apache.org/jira/browse/THRIFT-4384) - cpp: Using multiple async services simultaneously is not thread-safe - [THRIFT-3108](https://issues.apache.org/jira/browse/THRIFT-3108) - haskell: Defaulted struct parameters on a service generates invalid Haskell - [THRIFT-3990](https://issues.apache.org/jira/browse/THRIFT-3990) - nodejs: Exception swallowed by deserialization function -- [THRIFT-4214](https://issues.apache.org/jira/browse/THRIFT-4214) - nodejs: map key treated as hex value in JavaScript +- [THRIFT-4214](https://issues.apache.org/jira/browse/THRIFT-4214) - nodejs: `map` key treated as hex value in JavaScript - [THRIFT-4602](https://issues.apache.org/jira/browse/THRIFT-4602) - nodejs: ERROR in ./node_modules/thrift/lib/nodejs/lib/thrift/connection.js Module not found: Error: Can't resolve 'child_process' - [THRIFT-4639](https://issues.apache.org/jira/browse/THRIFT-4639) - nodejs: Sequence numbering for multiplexed protocol broken - [THRIFT-1310](https://issues.apache.org/jira/browse/THRIFT-1310) - php: sequence and reconnection management issues @@ -1781,7 +1781,7 @@ Released 2017-DEC-27 - [THRIFT-3891](https://issues.apache.org/jira/browse/THRIFT-3891) - TNonblockingServer configured with more than one IO threads does not always return from serve() upon stop() - [THRIFT-3892](https://issues.apache.org/jira/browse/THRIFT-3892) - Thrift uses TLS SNI extension provided by OpenSSL library. Older version of OpenSSL(< 0.9.8f) may create problem because they do not support 'SSL_set_tlsext_host_name()'. - [THRIFT-3895](https://issues.apache.org/jira/browse/THRIFT-3895) - Build fails using Java 1.8 with Ant < 1.9 -- [THRIFT-3896](https://issues.apache.org/jira/browse/THRIFT-3896) - map data with number string key cannot access that deserialized by php extension +- [THRIFT-3896](https://issues.apache.org/jira/browse/THRIFT-3896) - `map` data with number string key cannot access that deserialized by php extension - [THRIFT-3938](https://issues.apache.org/jira/browse/THRIFT-3938) - Python TNonblockingServer does not work with SSL - [THRIFT-3944](https://issues.apache.org/jira/browse/THRIFT-3944) - TSSLSocket has dead code in checkHandshake - [THRIFT-3946](https://issues.apache.org/jira/browse/THRIFT-3946) - Java 1.5 compatibility broken for binary fields (java5 option) @@ -2177,8 +2177,8 @@ Released 2017-DEC-27 - [THRIFT-3635](https://issues.apache.org/jira/browse/THRIFT-3635) - D transport_test is flaky on Jenkins and Travis - [THRIFT-3618](https://issues.apache.org/jira/browse/THRIFT-3618) - Python TSSLSocket deprecation message should print caller's location - [THRIFT-3145](https://issues.apache.org/jira/browse/THRIFT-3145) - JSON protocol does not handle bool and empty containers correctly -- [THRIFT-3158](https://issues.apache.org/jira/browse/THRIFT-3158) - TBase#deepCopy should return T -- [THRIFT-3157](https://issues.apache.org/jira/browse/THRIFT-3157) - TBase signature should be TBase, F extends TFieldIdEnum> +- [THRIFT-3158](https://issues.apache.org/jira/browse/THRIFT-3158) - `TBase#deepCopy` should return T +- [THRIFT-3157](https://issues.apache.org/jira/browse/THRIFT-3157) - TBase signature should be `TBase, F extends TFieldIdEnum>` - [THRIFT-3156](https://issues.apache.org/jira/browse/THRIFT-3156) - Node TLS: server executes processing logic two full times - [THRIFT-3154](https://issues.apache.org/jira/browse/THRIFT-3154) - tutorial/py.tornado throw EOF exception - [THRIFT-3063](https://issues.apache.org/jira/browse/THRIFT-3063) - C++ build -Wunused-parameter warnings on processor_test, TransportTest @@ -2215,7 +2215,7 @@ Released 2017-DEC-27 - [THRIFT-3392](https://issues.apache.org/jira/browse/THRIFT-3392) - Java TZlibTransport does not close its wrapper streams upon close() - [THRIFT-3383](https://issues.apache.org/jira/browse/THRIFT-3383) - i64 related warnings - [THRIFT-3386](https://issues.apache.org/jira/browse/THRIFT-3386) - misc. warnings with make check -- [THRIFT-3385](https://issues.apache.org/jira/browse/THRIFT-3385) - warning: format ‘%lu’ expects ‘long unsigned int’, but has type ‘std::basic_string::size_type {aka unsigned int} +- [THRIFT-3385](https://issues.apache.org/jira/browse/THRIFT-3385) - warning: format ‘%lu’ expects ‘long unsigned int’, but has type `std::basic_string::size_type {aka unsigned int}` - [THRIFT-3355](https://issues.apache.org/jira/browse/THRIFT-3355) - npm WARN package.json thrift@1.0.0-dev No license field. - [THRIFT-3360](https://issues.apache.org/jira/browse/THRIFT-3360) - Improve cross test servers and clients further - [THRIFT-3359](https://issues.apache.org/jira/browse/THRIFT-3359) - Binary field incompatibilities @@ -2234,7 +2234,7 @@ Released 2017-DEC-27 - [THRIFT-3564](https://issues.apache.org/jira/browse/THRIFT-3564) - C++/Qt: potential core dump in TQTcpServer in case an exception occurs in TAsyncProcessor::process() - [THRIFT-3558](https://issues.apache.org/jira/browse/THRIFT-3558) - typos in c_glib tests - [THRIFT-3559](https://issues.apache.org/jira/browse/THRIFT-3559) - Fix awkward extra semi-colons with Cocoa container literals -- [THRIFT-3555](https://issues.apache.org/jira/browse/THRIFT-3555) - 'configure' script does not honor --with-openssl= for libcrypto for BN_init +- [THRIFT-3555](https://issues.apache.org/jira/browse/THRIFT-3555) - 'configure' script does not honor `--with-openssl=` for libcrypto for BN_init - [THRIFT-3554](https://issues.apache.org/jira/browse/THRIFT-3554) - Constant decls may lead to "Error: internal error: prepare_member_name_mapping() already active for different struct" - [THRIFT-3552](https://issues.apache.org/jira/browse/THRIFT-3552) - glib_c Memory Leak - [THRIFT-3551](https://issues.apache.org/jira/browse/THRIFT-3551) - Thrift perl library missing package declaration @@ -2291,7 +2291,7 @@ Released 2017-DEC-27 - [THRIFT-3413](https://issues.apache.org/jira/browse/THRIFT-3413) - Thrift code generation bug in Go when extending service - [THRIFT-3420](https://issues.apache.org/jira/browse/THRIFT-3420) - C++: TSSLSockets are not interruptable - [THRIFT-3415](https://issues.apache.org/jira/browse/THRIFT-3415) - include unistd.h conditionally -- [THRIFT-3414](https://issues.apache.org/jira/browse/THRIFT-3414) - #include in THeaderTransport.h breaks windows build +- [THRIFT-3414](https://issues.apache.org/jira/browse/THRIFT-3414) - `#include ` in THeaderTransport.h breaks windows build - [THRIFT-3411](https://issues.apache.org/jira/browse/THRIFT-3411) - Go generates remotes with wrong package qualifiers when including - [THRIFT-3430](https://issues.apache.org/jira/browse/THRIFT-3430) - Go THttpClient does not read HTTP response body to completion when closing - [THRIFT-3423](https://issues.apache.org/jira/browse/THRIFT-3423) - First call to thrift_transport:read_exact fails to dispatch correct function @@ -2398,11 +2398,11 @@ Released 2017-DEC-27 - [THRIFT-2821](https://issues.apache.org/jira/browse/THRIFT-2821) - Enable the use of custom HTTP-Header in the Transport - [THRIFT-2093](https://issues.apache.org/jira/browse/THRIFT-2093) - added the ability to set compression level in C++ zlib transport - [THRIFT-2089](https://issues.apache.org/jira/browse/THRIFT-2089) - Compiler ignores duplicate typenames -- [THRIFT-2056](https://issues.apache.org/jira/browse/THRIFT-2056) - Moved all #include config.h statements to #include +- [THRIFT-2056](https://issues.apache.org/jira/browse/THRIFT-2056) - Moved all #include config.h statements to #include `` - [THRIFT-2031](https://issues.apache.org/jira/browse/THRIFT-2031) - Make SO_KEEPALIVE configurable for C++ lib - [THRIFT-2021](https://issues.apache.org/jira/browse/THRIFT-2021) - Improve large binary protocol string performance - [THRIFT-2028](https://issues.apache.org/jira/browse/THRIFT-2028) - Cleanup threading headers / libraries -- [THRIFT-2014](https://issues.apache.org/jira/browse/THRIFT-2014) - Change C++ lib includes to use style throughout +- [THRIFT-2014](https://issues.apache.org/jira/browse/THRIFT-2014) - Change C++ lib includes to use `` style throughout - [THRIFT-2312](https://issues.apache.org/jira/browse/THRIFT-2312) - travis.yml: build everything - [THRIFT-1915](https://issues.apache.org/jira/browse/THRIFT-1915) - Multiplexing Services - [THRIFT-1736](https://issues.apache.org/jira/browse/THRIFT-1736) - Visual Studio top level project files within msvc @@ -2669,7 +2669,7 @@ Released March 13, 2019 to backport a CVE fix to the popular 0.9.3 release. - [THRIFT-3102](https://issues.apache.org/jira/browse/THRIFT-3102) - could not make check for Go Library - [THRIFT-3120](https://issues.apache.org/jira/browse/THRIFT-3120) - Minor spelling errors and an outdated URL - [THRIFT-3121](https://issues.apache.org/jira/browse/THRIFT-3121) - Librt does not exist on OS X -- [THRIFT-3152](https://issues.apache.org/jira/browse/THRIFT-3152) - Compiler error on Mac OSX (missing #include ) +- [THRIFT-3152](https://issues.apache.org/jira/browse/THRIFT-3152) - Compiler error on Mac OSX (missing `#include `) - [THRIFT-3162](https://issues.apache.org/jira/browse/THRIFT-3162) - make fails for dmd 2.067 - [THRIFT-3164](https://issues.apache.org/jira/browse/THRIFT-3164) - Thrift C++ library SSL socket by default allows for unsecure SSLv3 negotiation - [THRIFT-3168](https://issues.apache.org/jira/browse/THRIFT-3168) - Fix Maven POM @@ -2777,7 +2777,7 @@ Released March 13, 2019 to backport a CVE fix to the popular 0.9.3 release. - [THRIFT-2864](https://issues.apache.org/jira/browse/THRIFT-2864) - JSON generator missing from Visual Studio build project - [THRIFT-2878](https://issues.apache.org/jira/browse/THRIFT-2878) - Go validation support of required fields - [THRIFT-2873](https://issues.apache.org/jira/browse/THRIFT-2873) - TPipe and TPipeServer don't compile on Windows with UNICODE enabled -- [THRIFT-2888](https://issues.apache.org/jira/browse/THRIFT-2888) - import of is missing in JSON generator +- [THRIFT-2888](https://issues.apache.org/jira/browse/THRIFT-2888) - import of `` is missing in JSON generator - [THRIFT-2900](https://issues.apache.org/jira/browse/THRIFT-2900) - Python THttpClient does not reset socket timeout on exception - [THRIFT-2907](https://issues.apache.org/jira/browse/THRIFT-2907) - 'ntohll' macro redefined - [THRIFT-2884](https://issues.apache.org/jira/browse/THRIFT-2884) - Map does not serialize correctly for JSON protocol in Go library @@ -3056,7 +3056,7 @@ Released March 13, 2019 to backport a CVE fix to the popular 0.9.3 release. ### Bug - [THRIFT-2793](https://issues.apache.org/jira/browse/THRIFT-2793) - Go compiler produces uncompilable code - [THRIFT-1481](https://issues.apache.org/jira/browse/THRIFT-1481) - Unix domain sockets in C++ do not support the abstract namespace -- [THRIFT-1455](https://issues.apache.org/jira/browse/THRIFT-1455) - TBinaryProtocolT::writeString casts from size_t to uint32_t, which is not safe on 64-bit platforms +- [THRIFT-1455](https://issues.apache.org/jira/browse/THRIFT-1455) - `TBinaryProtocolT::writeString` casts from size_t to uint32_t, which is not safe on 64-bit platforms - [THRIFT-1579](https://issues.apache.org/jira/browse/THRIFT-1579) - PHP Extension) - function thrift_protocol_read_binary not working from TBinarySerializer::deserialize - [THRIFT-1584](https://issues.apache.org/jira/browse/THRIFT-1584) - Error: could not SetMinThreads in ThreadPool on single-core machines - [THRIFT-1614](https://issues.apache.org/jira/browse/THRIFT-1614) - Thrift build from svn repo sources fails with automake-1.12 @@ -3149,7 +3149,7 @@ Released March 13, 2019 to backport a CVE fix to the popular 0.9.3 release. - [THRIFT-2389](https://issues.apache.org/jira/browse/THRIFT-2389) - namespaces handled wrongly in acrionscript 3.0 implementation - [THRIFT-2388](https://issues.apache.org/jira/browse/THRIFT-2388) - GoLang) - Fix data races in simple_server and server_socket - [THRIFT-2386](https://issues.apache.org/jira/browse/THRIFT-2386) - Thrift refuses to link yylex -- [THRIFT-2375](https://issues.apache.org/jira/browse/THRIFT-2375) - Excessive
's in generated HTML +- [THRIFT-2375](https://issues.apache.org/jira/browse/THRIFT-2375) - Excessive `
`'s in generated HTML - [THRIFT-2373](https://issues.apache.org/jira/browse/THRIFT-2373) - warning CS0414 in THttpClient.cs: private field 'Thrift.Transport.THttpClient.connection' assigned but never used - [THRIFT-2372](https://issues.apache.org/jira/browse/THRIFT-2372) - thrift/json_protocol.go:160: function ends without a return statement - [THRIFT-2371](https://issues.apache.org/jira/browse/THRIFT-2371) - ruby bundler version fails on ~1.3.1, remove and take latest avail @@ -3343,7 +3343,7 @@ Released March 13, 2019 to backport a CVE fix to the popular 0.9.3 release. - [THRIFT-2401](https://issues.apache.org/jira/browse/THRIFT-2401) - Haskell tutorial compiles - [THRIFT-2417](https://issues.apache.org/jira/browse/THRIFT-2417) - C# Union classes are not partial - [THRIFT-2415](https://issues.apache.org/jira/browse/THRIFT-2415) - Named pipes server performance & message mode -- [THRIFT-2404](https://issues.apache.org/jira/browse/THRIFT-2404) - emit warning on (typically inefficient) list +- [THRIFT-2404](https://issues.apache.org/jira/browse/THRIFT-2404) - emit warning on (typically inefficient) `list` - [THRIFT-2398](https://issues.apache.org/jira/browse/THRIFT-2398) - Improve Node Server Library - [THRIFT-2397](https://issues.apache.org/jira/browse/THRIFT-2397) - Add CORS and CSP support for JavaScript and Node.js libraries - [THRIFT-2407](https://issues.apache.org/jira/browse/THRIFT-2407) - use markdown (rename README => README.md) @@ -3594,7 +3594,7 @@ Released March 13, 2019 to backport a CVE fix to the popular 0.9.3 release. - [THRIFT-990](https://issues.apache.org/jira/browse/THRIFT-990) - Sanify gettimeofday usage codebase-wide - [THRIFT-791](https://issues.apache.org/jira/browse/THRIFT-791) - Let C++ TSimpleServer be driven by an external main loop - [THRIFT-2117](https://issues.apache.org/jira/browse/THRIFT-2117) - Cocoa TBinaryProtocol strictWrite should be set to true by default -- [THRIFT-2014](https://issues.apache.org/jira/browse/THRIFT-2014) - Change C++ lib includes to use style throughout +- [THRIFT-2014](https://issues.apache.org/jira/browse/THRIFT-2014) - Change C++ lib includes to use `` style throughout - [THRIFT-1972](https://issues.apache.org/jira/browse/THRIFT-1972) - Add support for async processors - [THRIFT-1970](https://issues.apache.org/jira/browse/THRIFT-1970) - [Graphviz] Adds option to render exceptions relationships - [THRIFT-1966](https://issues.apache.org/jira/browse/THRIFT-1966) - Support different files for SSL certificates and keys @@ -3714,7 +3714,7 @@ Released March 13, 2019 to backport a CVE fix to the popular 0.9.3 release. - [THRIFT-1553](https://issues.apache.org/jira/browse/THRIFT-1553) - thrift nodejs service side can't read map structure, key as enum, value as Object - [THRIFT-1575](https://issues.apache.org/jira/browse/THRIFT-1575) - Typo in server/TThreadPoolServer.h - [THRIFT-1327](https://issues.apache.org/jira/browse/THRIFT-1327) - Fix Spec Suite under Ruby-1.8.7 (works for MRI Ruby-1.9.2) -- [THRIFT-1326](https://issues.apache.org/jira/browse/THRIFT-1326) - on some platforms, #include is necessary to be included in Thrift.h +- [THRIFT-1326](https://issues.apache.org/jira/browse/THRIFT-1326) - on some platforms, `#include ` is necessary to be included in Thrift.h - [THRIFT-1159](https://issues.apache.org/jira/browse/THRIFT-1159) - THttpClient->Flush() issue (connection thru proxy) - [THRIFT-1277](https://issues.apache.org/jira/browse/THRIFT-1277) - Node.js serializes false booleans as null - [THRIFT-1224](https://issues.apache.org/jira/browse/THRIFT-1224) - Cannot insert UTF-8 text @@ -4002,7 +4002,7 @@ Released March 13, 2019 to backport a CVE fix to the popular 0.9.3 release. - [THRIFT-1192](https://issues.apache.org/jira/browse/THRIFT-1192) - Typo: TProtocol.h tests for HAVE_SYS_PARAM_H_ - [THRIFT-1190](https://issues.apache.org/jira/browse/THRIFT-1190) - readBufferBytesAllocated in TNonblockingServer.java should be AtomicLong to fix FD leakage and general server malfunction - [THRIFT-1187](https://issues.apache.org/jira/browse/THRIFT-1187) - nonblocking_server shutdown race under Ruby 1.9 -- [THRIFT-1178](https://issues.apache.org/jira/browse/THRIFT-1178) - Java: TBase signature should be T extends TBase +- [THRIFT-1178](https://issues.apache.org/jira/browse/THRIFT-1178) - Java: TBase signature should be `T extends TBase` - [THRIFT-1164](https://issues.apache.org/jira/browse/THRIFT-1164) - Segmentation fault on NULL pointer in t_js_generator::generate_const - [THRIFT-1171](https://issues.apache.org/jira/browse/THRIFT-1171) - Perl write/readDouble assumes little-endian platform - [THRIFT-1222](https://issues.apache.org/jira/browse/THRIFT-1222) - Unhandled exception for TEvhttpServer request From 14bc62f9bcbc4fde10e63d78d8f65f1c69a1ec79 Mon Sep 17 00:00:00 2001 From: yoelyang Date: Thu, 11 Apr 2024 16:58:19 +0800 Subject: [PATCH 265/430] THRIFT-5774: Add remote client's IP address to ServerContext in TServerEventHandler --- .../server/AbstractNonblockingServer.java | 7 +++++ .../apache/thrift/server/ServerContext.java | 10 +++++++ .../apache/thrift/server/TSimpleServer.java | 7 +++++ .../thrift/server/TThreadPoolServer.java | 9 +++++- .../transport/SocketAddressProvider.java | 30 +++++++++++++++++++ .../thrift/transport/TNonblockingSocket.java | 12 +++++++- .../org/apache/thrift/transport/TSocket.java | 13 +++++++- .../sasl/NonblockingSaslHandler.java | 7 +++++ 8 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 lib/java/src/main/java/org/apache/thrift/transport/SocketAddressProvider.java diff --git a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java index 0388c1104db..2bcd4b2abb7 100644 --- a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java +++ b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java @@ -20,6 +20,7 @@ package org.apache.thrift.server; import java.io.IOException; +import java.net.SocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; @@ -31,6 +32,7 @@ import org.apache.thrift.TByteArrayOutputStream; import org.apache.thrift.TException; import org.apache.thrift.protocol.TProtocol; +import org.apache.thrift.transport.SocketAddressProvider; import org.apache.thrift.transport.TIOStreamTransport; import org.apache.thrift.transport.TMemoryInputTransport; import org.apache.thrift.transport.TNonblockingServerTransport; @@ -297,6 +299,11 @@ public FrameBuffer( if (eventHandler_ != null) { context_ = eventHandler_.createContext(inProt_, outProt_); + SocketAddress remoteAddress = + trans_ instanceof SocketAddressProvider + ? ((SocketAddressProvider) trans_).getRemoteSocketAddress() + : null; + context_.setRemoteAddress(remoteAddress); } else { context_ = null; } diff --git a/lib/java/src/main/java/org/apache/thrift/server/ServerContext.java b/lib/java/src/main/java/org/apache/thrift/server/ServerContext.java index adf2a438b26..8cc95aaffff 100644 --- a/lib/java/src/main/java/org/apache/thrift/server/ServerContext.java +++ b/lib/java/src/main/java/org/apache/thrift/server/ServerContext.java @@ -20,6 +20,8 @@ /** Interface for storing server's connection context. */ package org.apache.thrift.server; +import java.net.SocketAddress; + public interface ServerContext { /** @@ -42,4 +44,12 @@ public interface ServerContext { * unwrapped from this context. */ boolean isWrapperFor(Class iface); + + /** + * Set the remote socket address for this ServerContext. The remoteAddress is null when transport + * is not socket based + * + * @param remoteAddress The remote socket address, may be null. + */ + default void setRemoteAddress(SocketAddress remoteAddress) {} } diff --git a/lib/java/src/main/java/org/apache/thrift/server/TSimpleServer.java b/lib/java/src/main/java/org/apache/thrift/server/TSimpleServer.java index 69af88a6b47..db1e57f3b14 100644 --- a/lib/java/src/main/java/org/apache/thrift/server/TSimpleServer.java +++ b/lib/java/src/main/java/org/apache/thrift/server/TSimpleServer.java @@ -19,9 +19,11 @@ package org.apache.thrift.server; +import java.net.SocketAddress; import org.apache.thrift.TException; import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TProtocol; +import org.apache.thrift.transport.SocketAddressProvider; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; import org.slf4j.Logger; @@ -70,6 +72,11 @@ public void serve() { outputProtocol = outputProtocolFactory_.getProtocol(outputTransport); if (eventHandler_ != null) { connectionContext = eventHandler_.createContext(inputProtocol, outputProtocol); + SocketAddress remoteAddress = + client instanceof SocketAddressProvider + ? ((SocketAddressProvider) client).getRemoteSocketAddress() + : null; + connectionContext.setRemoteAddress(remoteAddress); } while (true) { if (eventHandler_ != null) { diff --git a/lib/java/src/main/java/org/apache/thrift/server/TThreadPoolServer.java b/lib/java/src/main/java/org/apache/thrift/server/TThreadPoolServer.java index 5409034a918..073f1bc710b 100644 --- a/lib/java/src/main/java/org/apache/thrift/server/TThreadPoolServer.java +++ b/lib/java/src/main/java/org/apache/thrift/server/TThreadPoolServer.java @@ -19,6 +19,7 @@ package org.apache.thrift.server; +import java.net.SocketAddress; import java.net.SocketException; import java.util.Optional; import java.util.concurrent.ExecutorService; @@ -31,6 +32,7 @@ import org.apache.thrift.TException; import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TProtocol; +import org.apache.thrift.transport.SocketAddressProvider; import org.apache.thrift.transport.TServerTransport; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; @@ -239,7 +241,12 @@ public void run() { eventHandler = Optional.ofNullable(getEventHandler()); if (eventHandler.isPresent()) { - connectionContext = eventHandler.get().createContext(inputProtocol, outputProtocol); + connectionContext = eventHandler_.createContext(inputProtocol, outputProtocol); + SocketAddress remoteAddress = + client_ instanceof SocketAddressProvider + ? ((SocketAddressProvider) client_).getRemoteSocketAddress() + : null; + connectionContext.setRemoteAddress(remoteAddress); } while (true) { diff --git a/lib/java/src/main/java/org/apache/thrift/transport/SocketAddressProvider.java b/lib/java/src/main/java/org/apache/thrift/transport/SocketAddressProvider.java new file mode 100644 index 00000000000..1f79941c20c --- /dev/null +++ b/lib/java/src/main/java/org/apache/thrift/transport/SocketAddressProvider.java @@ -0,0 +1,30 @@ +/* + * 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. + */ + +package org.apache.thrift.transport; + +import java.net.SocketAddress; + +/** Interface that can retrieve the socket address. */ +public interface SocketAddressProvider { + + SocketAddress getRemoteSocketAddress(); + + SocketAddress getLocalSocketAddress(); +} diff --git a/lib/java/src/main/java/org/apache/thrift/transport/TNonblockingSocket.java b/lib/java/src/main/java/org/apache/thrift/transport/TNonblockingSocket.java index 0f4076c8da8..650b196c2f3 100644 --- a/lib/java/src/main/java/org/apache/thrift/transport/TNonblockingSocket.java +++ b/lib/java/src/main/java/org/apache/thrift/transport/TNonblockingSocket.java @@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory; /** Transport for use with async client. */ -public class TNonblockingSocket extends TNonblockingTransport { +public class TNonblockingSocket extends TNonblockingTransport implements SocketAddressProvider { private static final Logger LOGGER = LoggerFactory.getLogger(TNonblockingSocket.class.getName()); @@ -205,4 +205,14 @@ public String toString() { + socketChannel_.socket().getLocalAddress() + "]"; } + + @Override + public SocketAddress getRemoteSocketAddress() { + return socketChannel_.socket().getRemoteSocketAddress(); + } + + @Override + public SocketAddress getLocalSocketAddress() { + return socketChannel_.socket().getLocalSocketAddress(); + } } diff --git a/lib/java/src/main/java/org/apache/thrift/transport/TSocket.java b/lib/java/src/main/java/org/apache/thrift/transport/TSocket.java index 558c4fa7eca..2458d0f95d3 100644 --- a/lib/java/src/main/java/org/apache/thrift/transport/TSocket.java +++ b/lib/java/src/main/java/org/apache/thrift/transport/TSocket.java @@ -24,13 +24,14 @@ import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; +import java.net.SocketAddress; import java.net.SocketException; import org.apache.thrift.TConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** Socket implementation of the TTransport interface. To be commented soon! */ -public class TSocket extends TIOStreamTransport { +public class TSocket extends TIOStreamTransport implements SocketAddressProvider { private static final Logger LOGGER = LoggerFactory.getLogger(TSocket.class.getName()); @@ -247,4 +248,14 @@ public void close() { socket_ = null; } } + + @Override + public SocketAddress getRemoteSocketAddress() { + return socket_.getRemoteSocketAddress(); + } + + @Override + public SocketAddress getLocalSocketAddress() { + return socket_.getLocalSocketAddress(); + } } diff --git a/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java b/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java index da82c89a05e..66a1e5f3b86 100644 --- a/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java +++ b/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java @@ -22,6 +22,7 @@ import static org.apache.thrift.transport.sasl.NegotiationStatus.COMPLETE; import static org.apache.thrift.transport.sasl.NegotiationStatus.OK; +import java.net.SocketAddress; import java.nio.channels.SelectionKey; import java.nio.charset.StandardCharsets; import javax.security.sasl.SaslServer; @@ -31,6 +32,7 @@ import org.apache.thrift.protocol.TProtocolFactory; import org.apache.thrift.server.ServerContext; import org.apache.thrift.server.TServerEventHandler; +import org.apache.thrift.transport.SocketAddressProvider; import org.apache.thrift.transport.TMemoryTransport; import org.apache.thrift.transport.TNonblockingTransport; import org.apache.thrift.transport.TTransportException; @@ -325,6 +327,11 @@ private void executeProcessing() { if (eventHandler != null) { if (!serverContextCreated) { serverContext = eventHandler.createContext(requestProtocol, responseProtocol); + SocketAddress remoteAddress = + underlyingTransport instanceof SocketAddressProvider + ? ((SocketAddressProvider) underlyingTransport).getRemoteSocketAddress() + : null; + serverContext.setRemoteAddress(remoteAddress); serverContextCreated = true; } eventHandler.processContext(serverContext, memoryTransport, memoryTransport); From fb0f80dee832912bead53c4a832834b144350436 Mon Sep 17 00:00:00 2001 From: Keith Turner Date: Wed, 14 May 2025 21:51:46 +0200 Subject: [PATCH 266/430] Adds trace logging for java non blocking server memory limit Client: java Patch: Keith Turner Co-authored-by: Christopher Tubbs This closes #3135 --- .../thrift/server/AbstractNonblockingServer.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java index 2bcd4b2abb7..af2bc6321cd 100644 --- a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java +++ b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java @@ -318,6 +318,14 @@ public void setSelectionKey(SelectionKey selectionKey) { selectionKey_ = selectionKey; } + /** + * @return the amount of memory currently used to read data from clients. This information can + * be useful for debugging, metrics, and configuring the maximum memory limit. + */ + public final long getReadBufferBytesAllocated() { + return readBufferBytesAllocated.get(); + } + /** * Give this FrameBuffer a chance to read. The selector loop should have received a read event * for this FrameBuffer. @@ -358,7 +366,13 @@ public boolean read() { // if this frame will push us over the memory limit, then return. // with luck, more memory will free up the next time around. - if (readBufferBytesAllocated.get() + frameSize > MAX_READ_BUFFER_BYTES) { + long currentAllocated = getReadBufferBytesAllocated(); + if (currentAllocated + frameSize > MAX_READ_BUFFER_BYTES) { + LOGGER.trace( + "Deferring reading frame of size {} because {} is already buffered and {} is the limit.", + frameSize, + currentAllocated, + MAX_READ_BUFFER_BYTES); return true; } From 94e1a308973d617b19c07acbda3d8844132a04f7 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Thu, 15 May 2025 21:30:12 +0200 Subject: [PATCH 267/430] THRIFT-5866 Dockerfile to support Ubuntu 24.04 LTS (Noble Numbat) Patch: Jens Geyer This closes #3138 --- .travis.yml | 5 + build/docker/README.md | 97 ++++---- build/docker/ubuntu-noble/Dockerfile | 316 +++++++++++++++++++++++++++ doc/ReleaseManagement.md | 6 +- 4 files changed, 373 insertions(+), 51 deletions(-) create mode 100644 build/docker/ubuntu-noble/Dockerfile diff --git a/.travis.yml b/.travis.yml index 99dd2bc0e2d..130b4be3842 100644 --- a/.travis.yml +++ b/.travis.yml @@ -68,6 +68,11 @@ jobs: - JOB="Docker Build ubuntu-jammy 22.04 LTS" - DISTRO=ubuntu-jammy - TRAVIS_BUILD_STAGE=docker + - script: true + env: + - JOB="Docker Build ubuntu-noble 24.04 LTS" + - DISTRO=ubuntu-noble + - TRAVIS_BUILD_STAGE=docker # ========================= stage: thrift ======================= # ------------------------- phase: cross ------------------------ diff --git a/build/docker/README.md b/build/docker/README.md index 1f67d1d7331..0f2d293dffa 100644 --- a/build/docker/README.md +++ b/build/docker/README.md @@ -46,14 +46,15 @@ Docker Hub and push the resulting tags. ## Supported Containers ## -The Travis CI (continuous integration) builds use the Ubuntu Jammy -(22.04 LTS) and Focal (20.04 LTS) images to maximize language level +The Travis CI (continuous integration) builds use the Ubuntu Noble (24.04 LTS), +Jammy (22.04 LTS) and Focal (20.04 LTS) images to maximize language level coverage. ### Ubuntu ### -* focal (stable, current) -* jammy (next stable, WIP) +* focal (stable) +* jammy (stable) +* noble (next stable) ## Unsupported Containers ## @@ -152,50 +153,50 @@ Open a command prompt in the image: Last updated: March 5, 2024 -| Tool | ubuntu-focal | ubuntu-jammy | Notes | -| :-------- | :------------ | :------------ | :---- | -| ant | 1.10.7 | 1.10.12 | | -| autoconf | 2.69 | 2.71 | | -| automake | 1.16.1 | 1.16.5 | | -| bison | 3.5.1 | 3.8.2 | | -| boost | 1.71.0 | 1.74.0 | | -| cmake | 3.16.3 | 3.22.1 | | -| cppcheck | 1.90 | 2.7 | | -| flex | 2.6.4 | 2.6.4 | | -| libc6 | 2.31 | 2.35 | glibc | -| libevent | 2.0.16 | 2.0.16 | | -| libstdc++ | 10.5.0 | 10.5.0 | | -| make | 4.2.1 | 4.3 | | -| openssl | 1.1.1f | 3.0.2 | | -| qt5 | 5.12.8 | 5.15.3 | | +| Tool | ubuntu-focal | ubuntu-jammy | ubuntu-noble | Notes | +| :-------- | :------------ | :------------ | :------------ | :---- | +| ant | 1.10.7 | 1.10.12 | | | +| autoconf | 2.69 | 2.71 | | | +| automake | 1.16.1 | 1.16.5 | | | +| bison | 3.5.1 | 3.8.2 | | | +| boost | 1.71.0 | 1.74.0 | | | +| cmake | 3.16.3 | 3.22.1 | | | +| cppcheck | 1.90 | 2.7 | | | +| flex | 2.6.4 | 2.6.4 | | | +| libc6 | 2.31 | 2.35 | | glibc | +| libevent | 2.0.16 | 2.0.16 | | | +| libstdc++ | 10.5.0 | 10.5.0 | | | +| make | 4.2.1 | 4.3 | | | +| openssl | 1.1.1f | 3.0.2 | | | +| qt5 | 5.12.8 | 5.15.3 | | | ## Compiler/Language Versions per Dockerfile ## -| Language | ubuntu-focal | ubuntu-jammy | Notes | -| :-------- | :------------ | :------------ | :---- | -| as of | Mar 06, 2018 | Jul 1, 2019 | | -| as3 | 4.6.0 | 4.6.0 | | -| C++ gcc | 9.4.0 | 11.4.0 | | -| C++ clang | 13.0.0 | 13.0.0 | | -| c\_glib | 3.2.12 | 3.2.12 | | -| cl (sbcl) | | 1.5.3 | | -| d | 2.087.0 | 2.087.0 | | -| dart | 2.7.2-1 | 2.7.2-1 | | -| delphi | | | Not in CI | -| erlang | OTP-25.3.2.9 | OTP-25.3.2.9 | | -| go | 1.21.7 | 1.21.7 | | -| haxe | 4.2.1 | 4.2.1 | | -| java | 17 | 17 | | -| js | Node.js 16.20.2, npm 8.19.4 | Node.js 16.20.2, npm 8.19.4 | | -| lua | 5.2.4 | 5.2.4 | Lua 5.3: see THRIFT-4386 | -| netstd | 9.0 | 9.0 | | -| nodejs | 16.20.2 | 16.20.2 | | -| ocaml | 4.08.1 | 4.13.1 | | -| perl | 5.30.0 | 5.34.0 | | -| php | 7.4.3 | 8.1.2 | | -| python2 | 2.7.18 | | | -| python3 | 3.8.10 | 3.10.12 | | -| ruby | 2.7.0p0 | 3.0.2p107 | | -| rust | 1.83.0 | 1.83.0 | | -| smalltalk | | | Not in CI | -| swift | 5.7 | 5.7 | | +| Tool | ubuntu-focal | ubuntu-jammy | ubuntu-noble | Notes | +| :-------- | :------------ | :------------ | :------------ | :---- | +| as of | Mar 06, 2018 | Jul 1, 2019 | | | +| as3 | 4.6.0 | 4.6.0 | | | +| C++ gcc | 9.4.0 | 11.4.0 | | | +| C++ clang | 13.0.0 | 13.0.0 | | | +| c\_glib | 3.2.12 | 3.2.12 | | | +| cl (sbcl) | | 1.5.3 | | | +| d | 2.087.0 | 2.087.0 | | | +| dart | 2.7.2-1 | 2.7.2-1 | | | +| delphi | | | | Not in CI | +| erlang | OTP-25.3.2.9 | OTP-25.3.2.9 | | | +| go | 1.21.7 | 1.21.7 | | | +| haxe | 4.2.1 | 4.2.1 | | | +| java | 17 | 17 | | | +| js | Node.js 16.20.2, npm 8.19.4 | | | Node.js 16.20.2, npm 8.19.4 | +| lua | 5.2.4 | 5.2.4 | | Lua 5.3: see THRIFT-4386 | +| netstd | 9.0 | 9.0 | 9.0 | | +| nodejs | 16.20.2 | 16.20.2 | | | +| ocaml | 4.08.1 | 4.13.1 | | | +| perl | 5.30.0 | 5.34.0 | | | +| php | 7.4.3 | 8.1.2 | 8.3 | | +| python2 | 2.7.18 | | | | +| python3 | 3.8.10 | 3.10.12 | | | +| ruby | 2.7.0p0 | 3.0.2p107 | | | +| rust | 1.83.0 | 1.83.0 | | | +| smalltalk | | | | Not in CI | +| swift | 5.7 | 5.7 | 6.1 | | diff --git a/build/docker/ubuntu-noble/Dockerfile b/build/docker/ubuntu-noble/Dockerfile new file mode 100644 index 00000000000..374b4b59596 --- /dev/null +++ b/build/docker/ubuntu-noble/Dockerfile @@ -0,0 +1,316 @@ +# Licensed 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. + +# +# Apache Thrift Docker build environment for Ubuntu Noble +# with some updated packages. +# + +FROM buildpack-deps:noble-scm +LABEL MAINTAINER="Apache Thrift " +ENV DEBIAN_FRONTEND=noninteractive + +### Add apt repos + +RUN apt-get update -yq && \ + apt-get dist-upgrade -y && \ + apt-get install -y --no-install-recommends --fix-missing \ + apt \ + apt-transport-https \ + apt-utils \ + curl \ + dirmngr \ + software-properties-common \ + wget + +# Create a user +ARG user=build +ARG group=build +ARG uid=1001 +ARG gid=1001 + +RUN apt-get install -y --no-install-recommends sudo && \ + echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \ + if [ -z `cat /etc/group | grep "${group}:"` ] && [ -z `cat /etc/group | grep ":${gid}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ + if [ -z `cat /etc/passwd | grep "${user}:"` ] && [ -z `cat /etc/passwd | grep ":${uid}:"` ]; then adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos ""; fi && \ + echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ + mkdir -p /home/${user} && \ + chown -R ${user}:${group} /home/${user} + +# Dart +RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ + curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \ + /etc/apt/sources.list.d/dart_stable.list + +# node.js +RUN curl -sL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \ + echo "deb https://deb.nodesource.com/node_16.x focal main" | tee /etc/apt/sources.list.d/nodesource.list + +### install general dependencies +RUN apt-get update -yq && \ + apt-get install -y --no-install-recommends \ + `# General dependencies` \ + bash-completion \ + bison \ + build-essential \ + clang \ + cmake \ + debhelper \ + flex \ + gdb \ + libatk-bridge2.0-0 \ + libgtk-3-0 \ + llvm \ + ninja-build \ + pkg-config \ + unzip \ + valgrind \ + vim +ENV PATH /usr/lib/llvm-6.0/bin:$PATH + +# lib/as3 (ActionScript) +RUN mkdir -p /usr/local/adobe/flex/4.6 && \ + cd /usr/local/adobe/flex/4.6 && \ + wget -q "http://download.macromedia.com/pub/flex/sdk/flex_sdk_4.6.zip" && \ + unzip flex_sdk_4.6.zip +ENV FLEX_HOME /usr/local/adobe/flex/4.6 + +# TODO: "apt-get install" without "apt-get update" in the same "RUN" step can cause cache issues if modified later. +# See https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run +RUN apt-get install -y --no-install-recommends \ + `# C++ dependencies` \ + libboost-all-dev \ + libevent-dev \ + libssl-dev \ + qtbase5-dev \ + qtbase5-dev-tools + +ENV SBCL_VERSION 1.5.3 +RUN \ + `# Common Lisp (sbcl) dependencies` \ + curl --version && \ + curl -o sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 -J -L https://sourceforge.net/projects/sbcl/files/sbcl/${SBCL_VERSION}/sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2/download?use_mirror=managedway# && \ + tar xjf sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 && \ + cd sbcl-${SBCL_VERSION}-x86-64-linux && \ + ./install.sh && \ + sbcl --version && \ + cd .. && \ + rm -rf sbcl* + +ENV D_VERSION 2.087.0 +ENV DMD_DEB dmd_2.087.0-0_amd64.deb +RUN \ + `# D dependencies` \ + wget -q http://downloads.dlang.org/releases/2.x/${D_VERSION}/${DMD_DEB} && \ + dpkg --install ${DMD_DEB} && \ + rm -f ${DMD_DEB} && \ + mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \ + git clone -b 'v2.0.2+2.0.16' https://github.com/D-Programming-Deimos/libevent.git deimos-libevent-2.0 && \ + mv deimos-libevent-2.0/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ + mv deimos-libevent-2.0/C/* /usr/include/dmd/druntime/import/C/ && \ + rm -rf deimos-libevent-2.0 && \ + git clone -b 'v2.0.0+1.1.0h' https://github.com/D-Programming-Deimos/openssl.git deimos-openssl-1.1.0h && \ + mv deimos-openssl-1.1.0h/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ + mv deimos-openssl-1.1.0h/C/* /usr/include/dmd/druntime/import/C/ && \ + rm -rf deimos-openssl-1.1.0h + +ENV DART_VERSION 2.7.2-1 +RUN apt-get install -y --no-install-recommends \ + `# Dart dependencies` \ + dart=$DART_VERSION +ENV PATH /usr/lib/dart/bin:$PATH + +RUN add-apt-repository ppa:dotnet/backports +RUN apt-get install -y --no-install-recommends \ + `# dotnet core dependencies` \ + dotnet-sdk-9.0 \ + dotnet-runtime-9.0 \ + aspnetcore-runtime-9.0 \ + dotnet-apphost-pack-9.0 + +# Erlang dependencies +ARG ERLANG_OTP_VERSION=25.3.2.9 +ARG ERLANG_REBAR_VERSION=3.18.0 +RUN apt-get update && apt-get install -y --no-install-recommends libncurses5-dev && \ + curl -ssLo /usr/local/bin/kerl https://raw.githubusercontent.com/kerl/kerl/master/kerl && chmod +x /usr/local/bin/kerl && \ + kerl build $ERLANG_OTP_VERSION && kerl install $ERLANG_OTP_VERSION /usr/local/lib/otp/ && . /usr/local/lib/otp/activate && \ + curl -ssLo /usr/local/bin/rebar3 https://github.com/erlang/rebar3/releases/download/${ERLANG_REBAR_VERSION}/rebar3 && chmod +x /usr/local/bin/rebar3 && \ + rebar3 --version +ENV PATH /usr/local/lib/otp/bin:$PATH + +RUN apt-get install -y --no-install-recommends \ + `# GlibC dependencies` \ + libglib2.0-dev + +# golang +ENV GOLANG_VERSION 1.24.3 +ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz +ENV GOLANG_DOWNLOAD_SHA256 3333f6ea53afa971e9078895eaa4ac7204a8c6b5c68c10e6bc9a33e8e391bdd8 +RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \ + echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - && \ + tar -C /usr/local -xzf golang.tar.gz && \ + ln -s /usr/local/go/bin/go /usr/local/bin && \ + rm golang.tar.gz + +# HAXE +ARG HAXE_VERSION=4.2.1 +ARG NEKO_VERSION=2.3.0 +RUN cd $HOME && \ + `# Haxe dependencies` && \ + wget https://github.com/HaxeFoundation/haxe/releases/download/${HAXE_VERSION}/haxe-${HAXE_VERSION}-linux64.tar.gz && \ + tar xvf haxe-${HAXE_VERSION}-linux64.tar.gz && \ + rm haxe-${HAXE_VERSION}-linux64.tar.gz && \ + mv haxe_* /opt/haxe && \ + wget https://github.com/HaxeFoundation/neko/releases/download/v`echo ${NEKO_VERSION} | sed "s/\./-/g"`/neko-${NEKO_VERSION}-linux64.tar.gz && \ + tar xvf neko-${NEKO_VERSION}-linux64.tar.gz && \ + rm neko-${NEKO_VERSION}-linux64.tar.gz && \ + mv neko-* /opt/neko +ENV PATH /opt/haxe:/opt/neko:$PATH +RUN echo "/opt/neko" > /etc/ld.so.conf.d/neko.conf && \ + ldconfig +USER ${user} +RUN mkdir -p $HOME/haxe/lib && \ + haxelib setup --always $HOME/haxe/lib && \ + haxelib install --always hxcpp 2>&1 > /dev/null && \ + haxelib install --always uuid 2>&1 > /dev/null +USER root + +ENV GRADLE_VERSION="8.4" +RUN apt-get install -y --no-install-recommends \ + `# Java dependencies` \ + ant \ + ant-optional \ + maven \ + openjdk-17-jdk-headless && \ + `# Gradle` \ + wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \ + (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \ + unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \ + mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \ + ln -s /usr/local/gradle/bin/gradle /usr/local/bin + +RUN apt-get install -y --no-install-recommends \ + `# Lua dependencies` \ + lua5.4 \ + liblua5.4-dev +# https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212 +# lua5.3 does not install alternatives! +# need to update our luasocket code, lua doesn't have luaL_openlib any more + +RUN apt-get install -y --no-install-recommends \ + `# Node.js dependencies` \ + nodejs + +# Test dependencies for running puppeteer +RUN apt-get install -y --no-install-recommends \ + `# JS dependencies` \ + libxss1 \ + libxtst6 + +RUN apt-get install -y --no-install-recommends \ + `# OCaml dependencies` \ + ocaml \ + opam && \ + `# disable sandboxing see https://github.com/ocaml/opam/issues/4327` \ + opam init --yes --disable-sandboxing && \ + opam install --yes oasis + +RUN apt-get install -y --no-install-recommends \ + `# Perl dependencies` \ + libbit-vector-perl \ + libclass-accessor-class-perl \ + libcrypt-ssleay-perl \ + libio-socket-ssl-perl \ + libnet-ssleay-perl \ + libtest-exception-perl + +RUN apt-get install -y --no-install-recommends \ + `# Php dependencies` \ + php8.3 \ + php8.3-cli \ + php8.3-dev \ + php8.3-mbstring \ + php8.3-xml \ + php8.3-curl \ + php8.3-xdebug \ + php-pear \ + re2c \ + composer + +RUN apt-get install -y --no-install-recommends \ + `# Python3 dependencies` \ + python3-all \ + python3-all-dbg \ + python3-all-dev \ + python3-pip \ + python3-setuptools \ + python3-tornado \ + python3-twisted \ + python3-wheel \ + python3-zope.interface + +RUN apt-get install -y --no-install-recommends \ + `# Ruby dependencies` \ + ruby \ + ruby-dev \ + ruby-bundler + +USER ${user} +RUN `# Rust dependencies` \ + curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.83.0 -y +ENV PATH /home/${user}/.cargo/bin:$PATH +USER root + +# Swift on Linux for cross tests +RUN apt-get install -yq \ + libedit-dev \ + libz3-dev \ + python3-flake8 \ + libxml2-dev && \ + cd / && \ + wget --quiet https://download.swift.org/swift-6.1-release/ubuntu2404/swift-6.1-RELEASE/swift-6.1-RELEASE-ubuntu24.04.tar.gz && \ + tar xf swift-6.1-RELEASE-ubuntu24.04.tar.gz && \ + mv swift-6.1-RELEASE-ubuntu24.04 /usr/share/swift && \ + rm swift-6.1-RELEASE-ubuntu24.04.tar.gz + +ENV PATH /usr/share/swift/usr/bin:$PATH +RUN swift --version + +# Locale(s) for cpp unit tests +RUN apt-get install -y --no-install-recommends \ + `# Locale dependencies` \ + locales && \ + locale-gen en_US.UTF-8 && \ + locale-gen de_DE.UTF-8 && \ + update-locale + +RUN apt-get install -y --no-install-recommends \ + `# Static Code Analysis dependencies` \ + cppcheck \ + sloccount + +#RUN pip install flake8 + +# NOTE: this does not reduce the image size but adds an additional layer. +# # Clean up +# RUN rm -rf /var/cache/apt/* && \ +# rm -rf /var/lib/apt/lists/* && \ +# rm -rf /tmp/* && \ +# rm -rf /var/tmp/* + +ENV THRIFT_ROOT /thrift +RUN mkdir -p $THRIFT_ROOT/src && \ + chown -R ${uid}:${uid} $THRIFT_ROOT/ +COPY Dockerfile $THRIFT_ROOT/ +WORKDIR $THRIFT_ROOT/src + +USER ${user} diff --git a/doc/ReleaseManagement.md b/doc/ReleaseManagement.md index 4077d61667a..2db770d2b91 100644 --- a/doc/ReleaseManagement.md +++ b/doc/ReleaseManagement.md @@ -145,19 +145,19 @@ All Apache Thrift releases go through a 72-hour final release candidate voting p 1. On a linux system get a clean copy of the release branch, for example: ```bash - ~$ git clone -b "release/1.0.0" git@github.com:apache/thrift.git thrift-1.0.0-src + git clone -b "release/1.0.0" git@github.com:apache/thrift.git thrift-1.0.0-src ``` 1. In the clean copy of the release branch, build the container image: ```bash - ~$ docker build -t thrift build/docker/ubuntu-jammy + docker build -t thrift build/docker/ubuntu-jammy ``` 1. Run the container and `make dist`: ```bash - ~$ docker run -v $(pwd):/thrift/src -it thrift /bin/bash + docker run -v $(pwd):/thrift/src -it thrift /bin/bash root@8b4101188aa2:/thrift/src# ./bootstrap.sh && ./configure && make dist ``` From e73b238faa0baa7ab7f6600bc1529a550586c6b9 Mon Sep 17 00:00:00 2001 From: Hasnain Lakhani Date: Sat, 17 May 2025 21:18:33 -0700 Subject: [PATCH 268/430] [nit] Use more consistent free method in c_glib generated code for binary types --- compiler/cpp/src/thrift/generate/t_c_glib_generator.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/compiler/cpp/src/thrift/generate/t_c_glib_generator.cc b/compiler/cpp/src/thrift/generate/t_c_glib_generator.cc index b5eb6032891..06dce57c33c 100644 --- a/compiler/cpp/src/thrift/generate/t_c_glib_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_c_glib_generator.cc @@ -4023,7 +4023,12 @@ void t_c_glib_generator::generate_deserialize_field(ostream& out, if (tbase == t_base_type::TYPE_STRING) { indent(out) << "if (" << name << " != NULL)" << '\n' << indent() << "{" << '\n'; indent_up(); - indent(out) << "g_free(" << name << ");" << '\n' << indent() << name << " = NULL;" << '\n'; + if (type->is_binary()) { + indent(out) << "g_byte_array_free(" << name << ", TRUE);" << '\n'; + } else { + indent(out) << "g_free(" << name << ");" << '\n'; + } + indent(out) << name << " = NULL;" << '\n'; indent_down(); indent(out) << "}" << '\n' << '\n'; } From 6ba51d07f82bd5f7e99af08d64be0f961f0756e9 Mon Sep 17 00:00:00 2001 From: Hasnain Lakhani Date: Sat, 17 May 2025 21:18:46 -0700 Subject: [PATCH 269/430] [nit] compile enum test types when building lib/c_glib tests --- lib/c_glib/test/Makefile.am | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/c_glib/test/Makefile.am b/lib/c_glib/test/Makefile.am index 0a5f220ac91..6eeece9deda 100644 --- a/lib/c_glib/test/Makefile.am +++ b/lib/c_glib/test/Makefile.am @@ -34,7 +34,8 @@ BUILT_SOURCES = \ gen-c_glib/t_test_container_service.h \ gen-c_glib/t_test_srv.h \ gen-c_glib/t_test_thrift_test.h \ - gen-c_glib/t_test_thrift_test_types.h + gen-c_glib/t_test_thrift_test_types.h \ + gen-c_glib/t_test_enum_test_types.h AM_CPPFLAGS = -I../src -I./gen-c_glib -I$(top_builddir)/lib/c_glib/src/thrift AM_CFLAGS = -g -Wall -Wextra -pedantic $(GLIB_CFLAGS) $(GOBJECT_CFLAGS) $(OPENSSL_INCLUDES) \ From ef6a6c282a659a3e80add7e2d23ddb6855df34e2 Mon Sep 17 00:00:00 2001 From: Hasnain Lakhani Date: Sat, 17 May 2025 20:41:28 -0700 Subject: [PATCH 270/430] [nit] Improve error handling in thrift_protocol_skip --- lib/c_glib/src/thrift/c_glib/protocol/thrift_protocol.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/c_glib/src/thrift/c_glib/protocol/thrift_protocol.c b/lib/c_glib/src/thrift/c_glib/protocol/thrift_protocol.c index 252f4bec96f..cb7199b9508 100644 --- a/lib/c_glib/src/thrift/c_glib/protocol/thrift_protocol.c +++ b/lib/c_glib/src/thrift/c_glib/protocol/thrift_protocol.c @@ -471,10 +471,12 @@ thrift_protocol_skip (ThriftProtocol *protocol, ThriftType type, GError **error) } case T_STRING: { - gpointer data; + gpointer data = NULL; guint32 len; gint32 ret = thrift_protocol_read_binary (protocol, &data, &len, error); - g_free (data); + if (data) { + g_free (data); + } return ret; } case T_STRUCT: From 1b8a998b938e5d21665d445f2e52ba9186c8ec4d Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Wed, 21 May 2025 10:47:40 -0700 Subject: [PATCH 271/430] Put field name in error message for set duplication check on write Client: go Before: thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("%T error writing set field: slice is not unique", p.Foo)) After: thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("%T error writing set field %q: slice is not unique", p.Foo, "p.Foo")) Currently when there are more than one field inside a struct being sets and this error happens, it's impossible to tell which field contains duplications to cause this error. --- compiler/cpp/src/thrift/generate/t_go_generator.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc index 8d0589231cd..bef28553632 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc @@ -3747,8 +3747,8 @@ void t_go_generator::generate_serialize_container(ostream& out, out << indent() << "}(" << wrapped_prefix << "[i], " << wrapped_prefix << "[j]) {" << '\n'; indent_up(); out << indent() << "return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, " - << "fmt.Errorf(\"%T error writing set field: slice is not " "unique\", " - << wrapped_prefix << "))" << '\n'; + << "fmt.Errorf(\"%T error writing set field %q: slice is not unique\", " + << wrapped_prefix << ", \"" << escape_string(prefix) << "\"))" << '\n'; indent_down(); out << indent() << "}" << '\n'; indent_down(); From 02b02df2ce6d3f4520751b41d5cc31d351fe49cf Mon Sep 17 00:00:00 2001 From: Spl3en Date: Wed, 21 May 2025 20:40:37 +0200 Subject: [PATCH 272/430] Fix received keyword readMessageBegin doesn't declare received as a variable. --- lib/js/src/thrift.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/js/src/thrift.js b/lib/js/src/thrift.js index 0c4eb266c85..c84aef004f3 100644 --- a/lib/js/src/thrift.js +++ b/lib/js/src/thrift.js @@ -1084,7 +1084,7 @@ Thrift.Protocol.prototype = { this.rstack = []; this.rpos = []; - received = this.transport.readAll(); + var received = this.transport.readAll(); if (typeof JSONInt64 !== 'undefined' && typeof JSONInt64.parse === 'function') { this.robj = JSONInt64.parse(received); From 433857d507540d18f942f7705ef4dabd7752d541 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 23 May 2025 22:59:23 +0200 Subject: [PATCH 273/430] FIX release date 0.22.0 in debian/changelog is wrong --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 8826c9a361d..9b66cad8e1a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,7 +2,7 @@ thrift (0.22.0) stable; urgency=low * update to 0.22.0 - -- Apache Thrift Developers Mon, 02 Sep 2024 23:30:00 +0100 + -- Apache Thrift Developers Wed, 14 May 2025 22:08:00 +0100 thrift (0.21.0) stable; urgency=low From f695b75dd0a7e25ea94df007d443ec20ac1ce90d Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 23 May 2025 23:36:42 +0200 Subject: [PATCH 274/430] We have 2025 for a while now --- lib/netstd/Thrift/Thrift.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/netstd/Thrift/Thrift.csproj b/lib/netstd/Thrift/Thrift.csproj index aca676f8358..fb3276bd43b 100644 --- a/lib/netstd/Thrift/Thrift.csproj +++ b/lib/netstd/Thrift/Thrift.csproj @@ -55,7 +55,7 @@ https://github.com/apache/thrift git README.md - Copyright 2024 The Apache Software Foundation + Copyright 2025 The Apache Software Foundation
From b0252a9b43d54ddddee9ff0db95e9c4372b0ff77 Mon Sep 17 00:00:00 2001 From: Hasnain Lakhani Date: Sun, 18 May 2025 02:39:47 +0200 Subject: [PATCH 275/430] Throw exception instead of asserting in TJSONProtocol::readByte Client: cpp Patch: Hasnain Lakhani --- lib/cpp/src/thrift/protocol/TJSONProtocol.cpp | 5 ++++- lib/cpp/test/JSONProtoTest.cpp | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp index 3805869a936..1218190be1f 100644 --- a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp +++ b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp @@ -1087,7 +1087,10 @@ uint32_t TJSONProtocol::readBool(bool& value) { uint32_t TJSONProtocol::readByte(int8_t& byte) { auto tmp = (int16_t)byte; uint32_t result = readJSONInteger(tmp); - assert(tmp < 256); + if (tmp > 127 || tmp < -128) { + throw TProtocolException(TProtocolException::INVALID_DATA, + "Expected byte value; got " + to_string(tmp)); + } byte = (int8_t)tmp; return result; } diff --git a/lib/cpp/test/JSONProtoTest.cpp b/lib/cpp/test/JSONProtoTest.cpp index ef3938589ac..1874ccdca3e 100644 --- a/lib/cpp/test/JSONProtoTest.cpp +++ b/lib/cpp/test/JSONProtoTest.cpp @@ -366,3 +366,16 @@ BOOST_AUTO_TEST_CASE(test_json_unicode_escaped_missing_hi_surrogate) { BOOST_CHECK_THROW(ooe2.read(proto.get()), apache::thrift::protocol::TProtocolException); } + +BOOST_AUTO_TEST_CASE(test_json_invalid_byte_range) { + // Test case for byte values outside valid range + const char json_string[] = "\"3\":{\"i8\":849}"; + + std::shared_ptr buffer(new TMemoryBuffer( + (uint8_t*)(json_string), sizeof(json_string))); + std::shared_ptr proto(new TJSONProtocol(buffer)); + + OneOfEach ooe2; + BOOST_CHECK_THROW(ooe2.read(proto.get()), + apache::thrift::protocol::TProtocolException); +} From bd2e2a4792b126a9671dc081181be85d749fe4ad Mon Sep 17 00:00:00 2001 From: Hasnain Lakhani Date: Sat, 24 May 2025 12:18:57 -0700 Subject: [PATCH 276/430] [nit] Return early if no bytes left to return in thrift_memory_buffer_read --- lib/c_glib/src/thrift/c_glib/transport/thrift_memory_buffer.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/c_glib/src/thrift/c_glib/transport/thrift_memory_buffer.c b/lib/c_glib/src/thrift/c_glib/transport/thrift_memory_buffer.c index d38d494b6a2..9ef0057ccaa 100644 --- a/lib/c_glib/src/thrift/c_glib/transport/thrift_memory_buffer.c +++ b/lib/c_glib/src/thrift/c_glib/transport/thrift_memory_buffer.c @@ -91,6 +91,10 @@ thrift_memory_buffer_read (ThriftTransport *transport, gpointer buf, give = t->buf->len; } + if (give == 0) { + return -1; + } + memcpy (buf, t->buf->data, give); g_byte_array_remove_range (t->buf, 0, give); From 32530798e144463e03a5438bdbf4834b63bec5b4 Mon Sep 17 00:00:00 2001 From: dengzh Date: Wed, 30 Apr 2025 11:45:02 +0800 Subject: [PATCH 277/430] THRIFT-5869: Close the transport after TServerEventHandler deleteContext --- .../server/AbstractNonblockingServer.java | 9 ++++-- .../sasl/NonblockingSaslHandler.java | 29 ++++++++++--------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java index af2bc6321cd..310bb78827c 100644 --- a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java +++ b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java @@ -477,9 +477,12 @@ public void close() { || state_ == FrameBufferState.AWAITING_CLOSE) { readBufferBytesAllocated.addAndGet(-buffer_.array().length); } - trans_.close(); - if (eventHandler_ != null) { - eventHandler_.deleteContext(context_, inProt_, outProt_); + try { + if (eventHandler_ != null) { + eventHandler_.deleteContext(context_, inProt_, outProt_); + } + } finally { + trans_.close(); } } diff --git a/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java b/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java index 66a1e5f3b86..930f8e869b8 100644 --- a/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java +++ b/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java @@ -416,20 +416,23 @@ private void handleWritingResponse() { * selector. */ public void close() { - underlyingTransport.close(); - selectionKey.cancel(); - if (saslPeer != null) { - saslPeer.dispose(); - } - if (serverContextCreated) { - eventHandler.deleteContext( - serverContext, - inputProtocolFactory.getProtocol(underlyingTransport), - outputProtocolFactory.getProtocol(underlyingTransport)); + try { + if (serverContextCreated) { + eventHandler.deleteContext( + serverContext, + inputProtocolFactory.getProtocol(underlyingTransport), + outputProtocolFactory.getProtocol(underlyingTransport)); + } + } finally { + selectionKey.cancel(); + if (saslPeer != null) { + saslPeer.dispose(); + } + nextPhase = Phase.CLOSED; + currentPhase = Phase.CLOSED; + underlyingTransport.close(); + LOGGER.trace("Connection closed: {}", underlyingTransport); } - nextPhase = Phase.CLOSED; - currentPhase = Phase.CLOSED; - LOGGER.trace("Connection closed: {}", underlyingTransport); } public enum Phase { From 63b7a263fc669c56fedca5d9a7310902d98df335 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sun, 25 May 2025 14:48:57 +0200 Subject: [PATCH 278/430] THRIFT-5864 swift CI broken & no maintainer around to fix Client: swift Patch: Jens Geyer --- .github/workflows/build.yml | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 188bdf855a2..fee8b723121 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -366,6 +366,7 @@ jobs: lib-swift: needs: compiler runs-on: ubuntu-24.04 + if: false # swift is currently broken and no maintainers around -> see THRIFT-5864 steps: - uses: actions/checkout@v4 @@ -554,16 +555,17 @@ jobs: cross-test: needs: - lib-java-kotlin - - lib-swift + #- lib-swift # swift is currently broken and no maintainers around -> see THRIFT-5864 - lib-rust - lib-go - lib-python runs-on: ubuntu-24.04 strategy: matrix: - server_lang: ['java', 'kotlin', 'go', 'rs', 'swift'] + # swift is currently broken and no maintainers around -> see THRIFT-5864 + server_lang: ['java', 'kotlin', 'go', 'rs'] # ['java', 'kotlin', 'go', 'rs', 'swift'] # we always use comma join as many client langs as possible, to reduce the number of jobs - client_lang: ['java,kotlin', 'go,rs', 'swift'] + client_lang: ['java,kotlin', 'go,rs'] # ['java,kotlin', 'go,rs', 'swift'] fail-fast: false steps: - uses: actions/checkout@v4 @@ -596,11 +598,12 @@ jobs: name: kotlin-precross path: lib/kotlin - - name: Download swift precross artifacts - uses: actions/download-artifact@v4 - with: - name: swift-precross - path: test/swift/CrossTests/.build/x86_64-unknown-linux-gnu/debug + # swift is currently broken and no maintainers around -> see THRIFT-5864 + #- name: Download swift precross artifacts + # uses: actions/download-artifact@v4 + # with: + # name: swift-precross + # path: test/swift/CrossTests/.build/x86_64-unknown-linux-gnu/debug - name: Download rust precross artifacts uses: actions/download-artifact@v4 @@ -620,7 +623,7 @@ jobs: lib/java/build/run* \ lib/kotlin/cross-test-client/build/install/TestClient/bin/* \ lib/kotlin/cross-test-server/build/install/TestServer/bin/* \ - test/swift/CrossTests/.build/x86_64-unknown-linux-gnu/debug/* \ + # THRIFT-5864 test/swift/CrossTests/.build/x86_64-unknown-linux-gnu/debug/* \ test/rs/bin/* \ test/go/bin/* From 716835fa76bdfe8020179f30d1d5dbadc65bf5fb Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Wed, 28 May 2025 15:44:53 -0700 Subject: [PATCH 279/430] Fix cross-test 1. Comment in the middle of multi-line shell command joined by \ does not work, change to multiple individual commands instead. 2. Fix a py 2vs3 compat issue missed in 24df0a5 used in cross runner. --- .github/workflows/build.yml | 13 ++++++------- test/test.py | 15 +++++++-------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fee8b723121..423a0b5aef8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -619,13 +619,12 @@ jobs: - name: Set back executable flags run: | - chmod a+x \ - lib/java/build/run* \ - lib/kotlin/cross-test-client/build/install/TestClient/bin/* \ - lib/kotlin/cross-test-server/build/install/TestServer/bin/* \ - # THRIFT-5864 test/swift/CrossTests/.build/x86_64-unknown-linux-gnu/debug/* \ - test/rs/bin/* \ - test/go/bin/* + chmod a+x lib/java/build/run* + chmod a+x lib/kotlin/cross-test-client/build/install/TestClient/bin/* + chmod a+x lib/kotlin/cross-test-server/build/install/TestServer/bin/* + # THRIFT-5864 chmod a+x test/swift/CrossTests/.build/x86_64-unknown-linux-gnu/debug/* + chmod a+x test/rs/bin/* + chmod a+x test/go/bin/* - name: Create tmp domain socket folder run: mkdir /tmp/v0.16 diff --git a/test/test.py b/test/test.py index a288c265ae1..e03cb45d954 100755 --- a/test/test.py +++ b/test/test.py @@ -36,7 +36,6 @@ import sys import crossrunner -from crossrunner.compat import path_join # 3.3 introduced subprocess timeouts on waiting for child req_version = (3, 3) @@ -46,15 +45,15 @@ ROOT_DIR = os.path.dirname(os.path.realpath(os.path.dirname(__file__))) TEST_DIR_RELATIVE = 'test' -TEST_DIR = path_join(ROOT_DIR, TEST_DIR_RELATIVE) -FEATURE_DIR_RELATIVE = path_join(TEST_DIR_RELATIVE, 'features') +TEST_DIR = os.path.join(ROOT_DIR, TEST_DIR_RELATIVE) +FEATURE_DIR_RELATIVE = os.path.join(TEST_DIR_RELATIVE, 'features') CONFIG_FILE = 'tests.json' def run_cross_tests(server_match, client_match, jobs, skip_known_failures, only_known_failures, retry_count, regex): logger = multiprocessing.get_logger() logger.debug('Collecting tests') - with open(path_join(TEST_DIR, CONFIG_FILE), 'r') as fp: + with open(os.path.join(TEST_DIR, CONFIG_FILE), 'r') as fp: j = json.load(fp) tests = crossrunner.collect_cross_tests(j, server_match, client_match, regex) if not tests: @@ -85,12 +84,12 @@ def run_cross_tests(server_match, client_match, jobs, skip_known_failures, only_ def run_feature_tests(server_match, feature_match, jobs, skip_known_failures, only_known_failures, retry_count, regex): - basedir = path_join(ROOT_DIR, FEATURE_DIR_RELATIVE) + basedir = os.path.join(ROOT_DIR, FEATURE_DIR_RELATIVE) logger = multiprocessing.get_logger() logger.debug('Collecting tests') - with open(path_join(TEST_DIR, CONFIG_FILE), 'r') as fp: + with open(os.path.join(TEST_DIR, CONFIG_FILE), 'r') as fp: j = json.load(fp) - with open(path_join(basedir, CONFIG_FILE), 'r') as fp: + with open(os.path.join(basedir, CONFIG_FILE), 'r') as fp: j2 = json.load(fp) tests = crossrunner.collect_feature_tests(j, j2, server_match, feature_match, regex) if not tests: @@ -171,7 +170,7 @@ def main(argv): client_match = list(chain(*[x.split(',') for x in options.client])) if options.update_failures or options.print_failures: - dire = path_join(ROOT_DIR, FEATURE_DIR_RELATIVE) if options.features is not None else TEST_DIR + dire = os.path.join(ROOT_DIR, FEATURE_DIR_RELATIVE) if options.features is not None else TEST_DIR res = crossrunner.generate_known_failures( dire, options.update_failures == 'overwrite', options.update_failures, options.print_failures) From 270696c9bea3b8cdbf464f8b4da5a157123a29e7 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Wed, 28 May 2025 10:54:04 -0700 Subject: [PATCH 280/430] go: Add a zlib reader pool We implemented a zlib writer pool for default level when implementing THeader, this change also add a zlib reader pool to help speed up things when zlib is used. Also make TZlibTransport to use the zlib writer pool when it's using the default compression level. --- lib/go/thrift/compact_protocol_test.go | 15 +++- lib/go/thrift/header_transport.go | 33 ++------ lib/go/thrift/pool.go | 2 +- lib/go/thrift/zlib_pool.go | 109 +++++++++++++++++++++++++ lib/go/thrift/zlib_pool_test.go | 51 ++++++++++++ lib/go/thrift/zlib_transport.go | 19 +++-- 6 files changed, 190 insertions(+), 39 deletions(-) create mode 100644 lib/go/thrift/zlib_pool.go create mode 100644 lib/go/thrift/zlib_pool_test.go diff --git a/lib/go/thrift/compact_protocol_test.go b/lib/go/thrift/compact_protocol_test.go index 65f77f2c42d..0d9575992b7 100644 --- a/lib/go/thrift/compact_protocol_test.go +++ b/lib/go/thrift/compact_protocol_test.go @@ -33,9 +33,18 @@ func TestReadWriteCompactProtocol(t *testing.T) { NewTFramedTransport(NewTMemoryBuffer()), } - zlib0, _ := NewTZlibTransport(NewTMemoryBuffer(), 0) - zlib6, _ := NewTZlibTransport(NewTMemoryBuffer(), 6) - zlib9, _ := NewTZlibTransport(NewTFramedTransport(NewTMemoryBuffer()), 9) + newTZlibTransport := func(trans TTransport, level int) *TZlibTransport { + t.Helper() + zlibTrans, err := NewTZlibTransport(trans, level) + if err != nil { + t.Fatalf("NewTZlibTransport returned error: %v", err) + } + return zlibTrans + } + + zlib0 := newTZlibTransport(NewTMemoryBuffer(), 0) + zlib6 := newTZlibTransport(NewTMemoryBuffer(), 6) + zlib9 := newTZlibTransport(NewTFramedTransport(NewTMemoryBuffer()), 9) transports = append(transports, zlib0, zlib6, zlib9) for _, trans := range transports { diff --git a/lib/go/thrift/header_transport.go b/lib/go/thrift/header_transport.go index d6d64160af3..06f71b3a30d 100644 --- a/lib/go/thrift/header_transport.go +++ b/lib/go/thrift/header_transport.go @@ -166,7 +166,7 @@ func (tr *TransformReader) AddTransform(id THeaderTransformID) error { case TransformNone: // no-op case TransformZlib: - readCloser, err := zlib.NewReader(tr.Reader) + readCloser, err := newZlibReader(tr.Reader) if err != nil { return err } @@ -211,25 +211,6 @@ func (tw *TransformWriter) Close() error { return nil } -var zlibDefaultLevelWriterPool = newPool( - func() *zlib.Writer { - return zlib.NewWriter(nil) - }, - nil, -) - -type zlibPoolCloser struct { - writer *zlib.Writer -} - -func (z *zlibPoolCloser) Close() error { - defer func() { - z.writer.Reset(nil) - zlibDefaultLevelWriterPool.put(&z.writer) - }() - return z.writer.Close() -} - // AddTransform adds a transform. func (tw *TransformWriter) AddTransform(id THeaderTransformID) error { switch id { @@ -241,12 +222,12 @@ func (tw *TransformWriter) AddTransform(id THeaderTransformID) error { case TransformNone: // no-op case TransformZlib: - writeCloser := zlibDefaultLevelWriterPool.get() - writeCloser.Reset(tw.Writer) - tw.Writer = writeCloser - tw.closers = append(tw.closers, &zlibPoolCloser{ - writer: writeCloser, - }) + writer, closer, err := newZlibWriterCloserLevel(tw.Writer, zlib.DefaultCompression) + if err != nil { + return err + } + tw.Writer = writer + tw.closers = append(tw.closers, closer) } return nil } diff --git a/lib/go/thrift/pool.go b/lib/go/thrift/pool.go index 1d623d42223..6912f3ea5d5 100644 --- a/lib/go/thrift/pool.go +++ b/lib/go/thrift/pool.go @@ -43,7 +43,7 @@ func newPool[T any](generate func() *T, reset func(*T)) *pool[T] { } return &pool[T]{ pool: sync.Pool{ - New: func() interface{} { + New: func() any { return generate() }, }, diff --git a/lib/go/thrift/zlib_pool.go b/lib/go/thrift/zlib_pool.go new file mode 100644 index 00000000000..b41929167bb --- /dev/null +++ b/lib/go/thrift/zlib_pool.go @@ -0,0 +1,109 @@ +/* +* 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. + */ + +package thrift + +import ( + "compress/zlib" + "io" + "sync" +) + +type zlibReader interface { + io.ReadCloser + zlib.Resetter +} + +var zlibReaderPool sync.Pool + +func newZlibReader(r io.Reader) (io.ReadCloser, error) { + if reader, _ := zlibReaderPool.Get().(*wrappedZlibReader); reader != nil { + if err := reader.Reset(r, nil); err == nil { + return reader, nil + } + } + reader, err := zlib.NewReader(r) + if err != nil { + return nil, err + } + return &wrappedZlibReader{reader.(zlibReader)}, nil +} + +type wrappedZlibReader struct { + zlibReader +} + +func (wr *wrappedZlibReader) Close() error { + defer func() { + zlibReaderPool.Put(wr) + }() + return wr.zlibReader.Close() +} + +func newZlibWriterLevelMust(level int) *zlib.Writer { + w, err := zlib.NewWriterLevel(nil, level) + if err != nil { + panic(err) + } + return w +} + +// level -> pool +var zlibWriterPools map[int]*pool[zlib.Writer] = func() map[int]*pool[zlib.Writer] { + m := make(map[int]*pool[zlib.Writer]) + for level := zlib.HuffmanOnly; level <= zlib.BestCompression; level++ { + // force a panic at init if we have an invalid level here + newZlibWriterLevelMust(level) + m[level] = newPool( + func() *zlib.Writer { + return newZlibWriterLevelMust(level) + }, + nil, + ) + } + return m +}() + +type zlibWriterPoolCloser struct { + writer *zlib.Writer + pool *pool[zlib.Writer] +} + +func (z *zlibWriterPoolCloser) Close() error { + defer func() { + z.writer.Reset(nil) + z.pool.put(&z.writer) + }() + return z.writer.Close() +} + +func newZlibWriterCloserLevel(w io.Writer, level int) (*zlib.Writer, io.Closer, error) { + pool, ok := zlibWriterPools[level] + if !ok { + // not pooled + writer, err := zlib.NewWriterLevel(w, level) + if err != nil { + return nil, nil, err + } + return writer, writer, nil + } + writer := pool.get() + writer.Reset(w) + return writer, &zlibWriterPoolCloser{writer: writer, pool: pool}, nil +} diff --git a/lib/go/thrift/zlib_pool_test.go b/lib/go/thrift/zlib_pool_test.go new file mode 100644 index 00000000000..1b3f5d8afe7 --- /dev/null +++ b/lib/go/thrift/zlib_pool_test.go @@ -0,0 +1,51 @@ +/* +* 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. + */ + +package thrift + +import ( + "compress/zlib" + "fmt" + "maps" + "slices" + "testing" +) + +func TestZlibWriterPools(t *testing.T) { + // make sure we have the writer pools created at the given levels + for _, level := range []int{ + zlib.HuffmanOnly, + zlib.DefaultCompression, + zlib.NoCompression, + zlib.BestSpeed, + zlib.BestCompression, + } { + t.Run(fmt.Sprintf("%d", level), func(t *testing.T) { + _, ok := zlibWriterPools[level] + if !ok { + t.Errorf("level %d does not exist in the writer pools", level) + } + }) + } + if t.Failed() { + levels := slices.Collect(maps.Keys(zlibWriterPools)) + slices.Sort(levels) + t.Log("zlib writer pools:", levels) + } +} diff --git a/lib/go/thrift/zlib_transport.go b/lib/go/thrift/zlib_transport.go index cefe1f99448..8f2d073b53e 100644 --- a/lib/go/thrift/zlib_transport.go +++ b/lib/go/thrift/zlib_transport.go @@ -33,9 +33,10 @@ type TZlibTransportFactory struct { // TZlibTransport is a TTransport implementation that makes use of zlib compression. type TZlibTransport struct { - reader io.ReadCloser - transport TTransport - writer *zlib.Writer + reader io.ReadCloser + transport TTransport + writer *zlib.Writer + writeCloser io.Closer } // GetTransport constructs a new instance of NewTZlibTransport @@ -64,14 +65,14 @@ func NewTZlibTransportFactoryWithFactory(level int, factory TTransportFactory) * // NewTZlibTransport constructs a new instance of TZlibTransport func NewTZlibTransport(trans TTransport, level int) (*TZlibTransport, error) { - w, err := zlib.NewWriterLevel(trans, level) + writer, closer, err := newZlibWriterCloserLevel(trans, level) if err != nil { return nil, err } - return &TZlibTransport{ - writer: w, - transport: trans, + writer: writer, + writeCloser: closer, + transport: trans, }, nil } @@ -83,7 +84,7 @@ func (z *TZlibTransport) Close() error { return err } } - if err := z.writer.Close(); err != nil { + if err := z.writeCloser.Close(); err != nil { return err } return z.transport.Close() @@ -109,7 +110,7 @@ func (z *TZlibTransport) Open() error { func (z *TZlibTransport) Read(p []byte) (int, error) { if z.reader == nil { - r, err := zlib.NewReader(z.transport) + r, err := newZlibReader(z.transport) if err != nil { return 0, NewTTransportExceptionFromError(err) } From 7aea524e13d2a6fbeb942716f4224cd51bfda0ea Mon Sep 17 00:00:00 2001 From: Jeffrey Tolar Date: Fri, 30 May 2025 11:20:05 -0500 Subject: [PATCH 281/430] THRIFT-5873: py: fix client auth support for THttpClient --- lib/py/src/transport/THttpClient.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/py/src/transport/THttpClient.py b/lib/py/src/transport/THttpClient.py index cda5f83d462..1dd1476d3a4 100644 --- a/lib/py/src/transport/THttpClient.py +++ b/lib/py/src/transport/THttpClient.py @@ -43,7 +43,7 @@ def __init__(self, uri_or_host, port=None, path=None, cafile=None, cert_file=Non Only the second supports https. To properly authenticate against the server, provide the client's identity by specifying cert_file and key_file. To properly authenticate the server, specify either cafile or ssl_context with a CA defined. - NOTE: if both cafile and ssl_context are defined, ssl_context will override cafile. + NOTE: if ssl_context is defined, it will override any provided cert_file, key_file, and cafile. """ if port is not None: warnings.warn( @@ -63,9 +63,11 @@ def __init__(self, uri_or_host, port=None, path=None, cafile=None, cert_file=Non self.port = parsed.port or http.client.HTTP_PORT elif self.scheme == 'https': self.port = parsed.port or http.client.HTTPS_PORT - self.certfile = cert_file - self.keyfile = key_file - self.context = ssl.create_default_context(cafile=cafile) if (cafile and not ssl_context) else ssl_context + if (cafile or cert_file or key_file) and not ssl_context: + self.context = ssl.create_default_context(cafile=cafile) + self.context.load_cert_chain(certfile=cert_file, keyfile=key_file) + else: + self.context = ssl_context self.host = parsed.hostname self.path = parsed.path if parsed.query: From 92e5b71b882c44d887a5eb797b6b1b8e9c5bcb02 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 4 Jun 2025 23:05:40 +0200 Subject: [PATCH 282/430] THRIFT-5874 Introduce new type MESSAGE_SIZE_LIMIT in TTransportException Client: Delphi Patch: Jens Geyer --- lib/netstd/Thrift/Protocol/TJSONProtocol.cs | 3 +++ lib/netstd/Thrift/Transport/Client/THttpTransport.cs | 1 + lib/netstd/Thrift/Transport/TEndpointTransport.cs | 6 +++--- lib/netstd/Thrift/Transport/TTransportException.cs | 5 +++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/netstd/Thrift/Protocol/TJSONProtocol.cs b/lib/netstd/Thrift/Protocol/TJSONProtocol.cs index ae37a807525..170f294ed62 100644 --- a/lib/netstd/Thrift/Protocol/TJSONProtocol.cs +++ b/lib/netstd/Thrift/Protocol/TJSONProtocol.cs @@ -468,6 +468,7 @@ private async ValueTask ReadJsonStringAsync(bool skipContext, Cancellati } // it's \uXXXX + Trans.CheckReadBytesAvailable(4); await Trans.ReadAllAsync(_tempBuffer, 0, 4, cancellationToken); var wch = (short) ((TJSONProtocolHelper.ToHexVal(_tempBuffer[0]) << 12) + @@ -1018,6 +1019,7 @@ public async ValueTask ReadAsync(CancellationToken cancellationToken) else { // find more easy way to avoid exception on reading primitive types + Proto.Trans.CheckReadBytesAvailable(1); await Proto.Trans.ReadAllAsync(_data, 0, 1, cancellationToken); } return _data[0]; @@ -1034,6 +1036,7 @@ public async ValueTask PeekAsync(CancellationToken cancellationToken) if (!_hasData) { // find more easy way to avoid exception on reading primitive types + Proto.Trans.CheckReadBytesAvailable(1); await Proto.Trans.ReadAllAsync(_data, 0, 1, cancellationToken); _hasData = true; } diff --git a/lib/netstd/Thrift/Transport/Client/THttpTransport.cs b/lib/netstd/Thrift/Transport/Client/THttpTransport.cs index 4467681ae1f..439777eb390 100644 --- a/lib/netstd/Thrift/Transport/Client/THttpTransport.cs +++ b/lib/netstd/Thrift/Transport/Client/THttpTransport.cs @@ -27,6 +27,7 @@ #pragma warning disable IDE0079 // unneeded suppression -> all except net8 #pragma warning disable IDE0301 // simplify collection init -> net8 only +#pragma warning disable IDE0305 // simplify collection init -> net8 only namespace Thrift.Transport.Client { diff --git a/lib/netstd/Thrift/Transport/TEndpointTransport.cs b/lib/netstd/Thrift/Transport/TEndpointTransport.cs index 27fb48daf96..c736e2f136a 100644 --- a/lib/netstd/Thrift/Transport/TEndpointTransport.cs +++ b/lib/netstd/Thrift/Transport/TEndpointTransport.cs @@ -56,7 +56,7 @@ public override void ResetMessageSizeAndConsumedBytes(long newSize = -1) // update only: message size can shrink, but not grow Debug.Assert(KnownMessageSize <= MaxMessageSize); if (newSize > KnownMessageSize) - throw new TTransportException(TTransportException.ExceptionType.EndOfFile, "MaxMessageSize reached"); + throw new TTransportException(TTransportException.ExceptionType.MessageSizeLimit, "MaxMessageSize reached"); KnownMessageSize = newSize; RemainingMessageSize = newSize; @@ -81,7 +81,7 @@ public override void UpdateKnownMessageSize(long size) public override void CheckReadBytesAvailable(long numBytes) { if ((RemainingMessageSize < numBytes) || (numBytes < 0)) - throw new TTransportException(TTransportException.ExceptionType.EndOfFile, "MaxMessageSize reached"); + throw new TTransportException(TTransportException.ExceptionType.MessageSizeLimit, "MaxMessageSize reached"); } /// @@ -97,7 +97,7 @@ protected void CountConsumedMessageBytes(long numBytes) else { RemainingMessageSize = 0; - throw new TTransportException(TTransportException.ExceptionType.EndOfFile, "MaxMessageSize reached"); + throw new TTransportException(TTransportException.ExceptionType.MessageSizeLimit, "MaxMessageSize reached"); } } } diff --git a/lib/netstd/Thrift/Transport/TTransportException.cs b/lib/netstd/Thrift/Transport/TTransportException.cs index 760a178e6ce..682b8640523 100644 --- a/lib/netstd/Thrift/Transport/TTransportException.cs +++ b/lib/netstd/Thrift/Transport/TTransportException.cs @@ -29,7 +29,8 @@ public enum ExceptionType AlreadyOpen, TimedOut, EndOfFile, - Interrupted + Interrupted, + MessageSizeLimit } public ExceptionType ExType { get; private set; } @@ -57,4 +58,4 @@ public TTransportException(string message, Exception inner = null) public ExceptionType Type => ExType; } -} \ No newline at end of file +} From 81fb1a7968e9e65fb2288c6d5f84fe5410c21426 Mon Sep 17 00:00:00 2001 From: Carel Combrink Date: Wed, 4 Jun 2025 08:10:05 +0200 Subject: [PATCH 283/430] Fix cross test for netstd: Tries to run the debug build but it appears that the script builds release Patch: Carel Combrink --- test/tests.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/tests.json b/test/tests.json index c9bd0682006..16b47acd8ea 100644 --- a/test/tests.json +++ b/test/tests.json @@ -478,6 +478,7 @@ "run", "--no-build", "--project=Server/Server.csproj", + "--configuration=Release", "server" ] }, @@ -488,6 +489,7 @@ "run", "--no-build", "--project=Client/Client.csproj", + "--configuration=Release", "client" ] }, From b7a1d8b1c5ffe09a9da77d4cf4dd613fee2718b6 Mon Sep 17 00:00:00 2001 From: Patrick Gansterer Date: Thu, 5 Jun 2025 16:56:38 +0200 Subject: [PATCH 284/430] FIX broken build on big endian platforms Client: cpp Patch: Patrick Gansterer This closes #3162 --- lib/cpp/src/thrift/protocol/TProtocol.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/cpp/src/thrift/protocol/TProtocol.h b/lib/cpp/src/thrift/protocol/TProtocol.h index 37b0db71199..63b959163d4 100644 --- a/lib/cpp/src/thrift/protocol/TProtocol.h +++ b/lib/cpp/src/thrift/protocol/TProtocol.h @@ -170,8 +170,8 @@ static inline To bitwise_cast(From from) { | (((n) & 0x0000ff00ul) << 8) \ | (((n) & 0x000000fful) << 24) ) # define bswap_16(n) \ - ( (((n) & (static_cast(0xff00ul)) >> 8) \ - | (((n) & (static_cast(0x00fful)) << 8) ) + ( (((n) & static_cast(0xff00ul)) >> 8) \ + | (((n) & static_cast(0x00fful)) << 8) ) # define THRIFT_htolell(n) bswap_64(n) # define THRIFT_letohll(n) bswap_64(n) # define THRIFT_htolel(n) bswap_32(n) From 2f8347c0a59e9c4ee3276c1618a6130bf3c5d15b Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 7 Feb 2025 01:58:30 +0100 Subject: [PATCH 285/430] added TMemoryStream to hx --- .../apache/thrift/transport/TMemoryStream.hx | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 lib/haxe/src/org/apache/thrift/transport/TMemoryStream.hx diff --git a/lib/haxe/src/org/apache/thrift/transport/TMemoryStream.hx b/lib/haxe/src/org/apache/thrift/transport/TMemoryStream.hx new file mode 100644 index 00000000000..49b494e64d2 --- /dev/null +++ b/lib/haxe/src/org/apache/thrift/transport/TMemoryStream.hx @@ -0,0 +1,88 @@ +/* + * 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. + */ + +package org.apache.thrift.transport; + +import haxe.io.Bytes; +import haxe.io.BytesBuffer; +import haxe.io.Output; + +class TMemoryStream implements TStream { + + private var Data : Bytes; + public var Position(default,default) : Int; + + public function new( data : Bytes = null) { + var target = new BytesBuffer(); + if ( data != null) { + for ( i in 0...data.length) { + target.addByte( data.get(i)); + ++Position; + } + } + Data = target.getBytes(); + } + + private function IsEof() : Bool { + return (0 > Position) || (Position >= Data.length); + } + + public function Close() : Void { + var target = new BytesBuffer(); + Data = target.getBytes(); + Position = 0; + } + + public function Peek() : Bool { + return (! IsEof()); + } + + // read count bytes into buf starting at offset + public function Read( buf : Bytes, offset : Int, count : Int) : Int { + var numRead = 0; + + for ( i in 0...count) { + if ( IsEof()) + break; + + buf.set( offset + i, Data.get( Position++)); + ++numRead; + } + + return numRead; + } + + // write count bytes from buf starting at offset + public function Write( buf : Bytes, offset : Int, count : Int) : Void { + var numBytes = buf.length - offset; + if ( numBytes > count) { + numBytes = count; + } + + for ( i in 0...numBytes) { + Data.set( Position + i, buf.get( offset + i)); + } + } + + public function Flush() : Void { + // nothing to do + } + +} + From 845a87a8158e29ca4b3f176ab8b335a9302db300 Mon Sep 17 00:00:00 2001 From: Hasnain Lakhani Date: Tue, 27 May 2025 22:31:42 -0700 Subject: [PATCH 286/430] [THRIFT-5871] Improve MAX_MESSAGE_SIZE_CHECK and friends --- .../c_glib/protocol/thrift_binary_protocol.c | 151 +++++++++++++++++- .../c_glib/protocol/thrift_binary_protocol.h | 4 + .../c_glib/protocol/thrift_compact_protocol.c | 21 ++- .../c_glib/transport/thrift_transport.c | 2 +- .../src/thrift/protocol/TBinaryProtocol.tcc | 9 +- .../src/thrift/protocol/TCompactProtocol.tcc | 6 +- lib/cpp/src/thrift/protocol/TJSONProtocol.cpp | 4 +- lib/cpp/src/thrift/transport/TTransport.h | 2 +- lib/delphi/src/Thrift.Protocol.Compact.pas | 6 +- lib/delphi/src/Thrift.Protocol.JSON.pas | 4 +- lib/delphi/src/Thrift.Protocol.pas | 6 +- lib/go/thrift/binary_protocol.go | 50 +++++- lib/go/thrift/compact_protocol.go | 58 ++++++- lib/go/thrift/json_protocol.go | 50 +++++- .../apache/thrift/protocol/TBinaryProtocol.hx | 6 +- .../thrift/protocol/TCompactProtocol.hx | 6 +- .../apache/thrift/protocol/TJSONProtocol.hx | 4 +- .../thrift/transport/TEndpointTransport.hx | 2 +- .../thrift/protocol/TBinaryProtocol.java | 6 +- .../thrift/protocol/TCompactProtocol.java | 6 +- .../apache/thrift/protocol/TJSONProtocol.java | 4 +- .../thrift/protocol/TSimpleJSONProtocol.java | 4 +- .../thrift/transport/TEndpointTransport.java | 2 +- lib/netstd/Thrift/Protocol/TBinaryProtocol.cs | 6 +- .../Thrift/Protocol/TCompactProtocol.cs | 6 +- lib/netstd/Thrift/Protocol/TJSONProtocol.cs | 4 +- 26 files changed, 361 insertions(+), 68 deletions(-) diff --git a/lib/c_glib/src/thrift/c_glib/protocol/thrift_binary_protocol.c b/lib/c_glib/src/thrift/c_glib/protocol/thrift_binary_protocol.c index 9e80e107c2a..0df2fb0c326 100644 --- a/lib/c_glib/src/thrift/c_glib/protocol/thrift_binary_protocol.c +++ b/lib/c_glib/src/thrift/c_glib/protocol/thrift_binary_protocol.c @@ -25,6 +25,14 @@ #include #include +/* object properties */ +enum _ThriftBinaryProtocolProperties +{ + PROP_0, + PROP_THRIFT_BINARY_PROTOCOL_STRING_LIMIT, + PROP_THRIFT_BINARY_PROTOCOL_CONTAINER_LIMIT +}; + G_DEFINE_TYPE(ThriftBinaryProtocol, thrift_binary_protocol, THRIFT_TYPE_PROTOCOL) static guint64 @@ -561,6 +569,14 @@ thrift_binary_protocol_read_map_begin (ThriftProtocol *protocol, return -1; } + ThriftBinaryProtocol *bp = THRIFT_BINARY_PROTOCOL (protocol); + if (bp->container_limit > 0 && sizei > bp->container_limit) { + g_set_error (error, THRIFT_PROTOCOL_ERROR, + THRIFT_PROTOCOL_ERROR_SIZE_LIMIT, + "got size over limit (%d > %d)", sizei, bp->container_limit); + return -1; + } + if(!ttc->checkReadBytesAvailable (THRIFT_TRANSPORT(tp->transport), sizei * thrift_binary_protocol_get_min_serialized_size(protocol, k, error) + sizei * thrift_binary_protocol_get_min_serialized_size(protocol, v, error), @@ -618,6 +634,14 @@ thrift_binary_protocol_read_list_begin (ThriftProtocol *protocol, return -1; } + ThriftBinaryProtocol *bp = THRIFT_BINARY_PROTOCOL (protocol); + if (bp->container_limit > 0 && sizei > bp->container_limit) { + g_set_error (error, THRIFT_PROTOCOL_ERROR, + THRIFT_PROTOCOL_ERROR_SIZE_LIMIT, + "got size over limit (%d > %d)", sizei, bp->container_limit); + return -1; + } + if(!ttc->checkReadBytesAvailable (THRIFT_TRANSPORT(tp->transport), (sizei * thrift_binary_protocol_get_min_serialized_size(protocol, e, error)), error)) @@ -814,6 +838,23 @@ thrift_binary_protocol_read_string (ThriftProtocol *protocol, return -1; } + ThriftBinaryProtocol *bp = THRIFT_BINARY_PROTOCOL (protocol); + if (bp->string_limit > 0 && read_len > bp->string_limit) { + g_set_error (error, THRIFT_PROTOCOL_ERROR, + THRIFT_PROTOCOL_ERROR_SIZE_LIMIT, + "got size over limit (%d > %d)", read_len, bp->string_limit); + *str = NULL; + return -1; + } + + ThriftProtocol *tp = THRIFT_PROTOCOL (protocol); + ThriftTransportClass *ttc = THRIFT_TRANSPORT_GET_CLASS (tp->transport); + if(!ttc->checkReadBytesAvailable (THRIFT_TRANSPORT(tp->transport), read_len, error)) + { + *str = NULL; + return -1; + } + /* allocate the memory for the string */ len = (guint32) read_len + 1; /* space for null terminator */ *str = g_new0 (gchar, len); @@ -854,8 +895,36 @@ thrift_binary_protocol_read_binary (ThriftProtocol *protocol, } xfer += ret; + if (read_len < 0) { + g_set_error (error, THRIFT_PROTOCOL_ERROR, + THRIFT_PROTOCOL_ERROR_NEGATIVE_SIZE, + "got negative size of %d", read_len); + *buf = NULL; + *len = 0; + return -1; + } + + ThriftBinaryProtocol *bp = THRIFT_BINARY_PROTOCOL (protocol); + if (bp->string_limit > 0 && read_len > bp->string_limit) { + g_set_error (error, THRIFT_PROTOCOL_ERROR, + THRIFT_PROTOCOL_ERROR_SIZE_LIMIT, + "got size over limit (%d > %d)", read_len, bp->string_limit); + *buf = NULL; + *len = 0; + return -1; + } + if (read_len > 0) { + ThriftProtocol *tp = THRIFT_PROTOCOL (protocol); + ThriftTransportClass *ttc = THRIFT_TRANSPORT_GET_CLASS (tp->transport); + if(!ttc->checkReadBytesAvailable (THRIFT_TRANSPORT(tp->transport), read_len, error)) + { + *buf = NULL; + *len = 0; + return -1; + } + /* allocate the memory as an array of unsigned char for binary data */ *len = (guint32) read_len; *buf = g_new (guchar, *len); @@ -885,9 +954,9 @@ thrift_binary_protocol_get_min_serialized_size(ThriftProtocol *protocol, ThriftT switch (type) { case T_STOP: - return 0; + return 1; /* T_STOP needs to count itself */ case T_VOID: - return 0; + return 1; /* T_VOID needs to count itself */ case T_BOOL: return sizeof(gint8); case T_BYTE: @@ -903,7 +972,7 @@ thrift_binary_protocol_get_min_serialized_size(ThriftProtocol *protocol, ThriftT case T_STRING: return sizeof(int); case T_STRUCT: - return 0; + return 1; /* empty struct needs at least 1 byte for the T_STOP */ case T_MAP: return sizeof(int); case T_SET: @@ -919,6 +988,48 @@ thrift_binary_protocol_get_min_serialized_size(ThriftProtocol *protocol, ThriftT } } +/* property accessor */ +void +thrift_binary_protocol_get_property (GObject *object, guint property_id, + GValue *value, GParamSpec *pspec) +{ + ThriftBinaryProtocol *tb; + + THRIFT_UNUSED_VAR (pspec); + + tb = THRIFT_BINARY_PROTOCOL (object); + + switch (property_id) { + case PROP_THRIFT_BINARY_PROTOCOL_STRING_LIMIT: + g_value_set_int (value, tb->string_limit); + break; + case PROP_THRIFT_BINARY_PROTOCOL_CONTAINER_LIMIT: + g_value_set_int (value, tb->container_limit); + break; + } +} + +/* property mutator */ +void +thrift_binary_protocol_set_property (GObject *object, guint property_id, + const GValue *value, GParamSpec *pspec) +{ + ThriftBinaryProtocol *tb; + + THRIFT_UNUSED_VAR (pspec); + + tb = THRIFT_BINARY_PROTOCOL (object); + + switch (property_id) { + case PROP_THRIFT_BINARY_PROTOCOL_STRING_LIMIT: + tb->string_limit = g_value_get_int (value); + break; + case PROP_THRIFT_BINARY_PROTOCOL_CONTAINER_LIMIT: + tb->container_limit = g_value_get_int (value); + break; + } +} + static void thrift_binary_protocol_init (ThriftBinaryProtocol *protocol) { @@ -929,7 +1040,39 @@ thrift_binary_protocol_init (ThriftBinaryProtocol *protocol) static void thrift_binary_protocol_class_init (ThriftBinaryProtocolClass *klass) { - ThriftProtocolClass *cls = THRIFT_PROTOCOL_CLASS (klass); + ThriftProtocolClass *cls; + GObjectClass *gobject_class; + GParamSpec *param_spec; + + cls = THRIFT_PROTOCOL_CLASS (klass); + gobject_class = G_OBJECT_CLASS (klass); + param_spec = NULL; + + /* setup accessors and mutators */ + gobject_class->get_property = thrift_binary_protocol_get_property; + gobject_class->set_property = thrift_binary_protocol_set_property; + + param_spec = g_param_spec_int ("string_limit", + "Max allowed string size", + "Set the max string limit", + 0, /* min */ + G_MAXINT32, /* max */ + 0, /* default value */ + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_THRIFT_BINARY_PROTOCOL_STRING_LIMIT, + param_spec); + + param_spec = g_param_spec_int ("container_limit", + "Max allowed container size", + "Set the max container limit", + 0, /* min */ + G_MAXINT32, /* max */ + 0, /* default value */ + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_THRIFT_BINARY_PROTOCOL_CONTAINER_LIMIT, + param_spec); cls->write_message_begin = thrift_binary_protocol_write_message_begin; cls->write_message_end = thrift_binary_protocol_write_message_end; diff --git a/lib/c_glib/src/thrift/c_glib/protocol/thrift_binary_protocol.h b/lib/c_glib/src/thrift/c_glib/protocol/thrift_binary_protocol.h index bd8b84effbc..6d2bc3e55e2 100644 --- a/lib/c_glib/src/thrift/c_glib/protocol/thrift_binary_protocol.h +++ b/lib/c_glib/src/thrift/c_glib/protocol/thrift_binary_protocol.h @@ -52,6 +52,10 @@ typedef struct _ThriftBinaryProtocol ThriftBinaryProtocol; struct _ThriftBinaryProtocol { ThriftProtocol parent; + + /* protected */ + gint32 string_limit; + gint32 container_limit; }; typedef struct _ThriftBinaryProtocolClass ThriftBinaryProtocolClass; diff --git a/lib/c_glib/src/thrift/c_glib/protocol/thrift_compact_protocol.c b/lib/c_glib/src/thrift/c_glib/protocol/thrift_compact_protocol.c index 0aa9a6fe640..73be027c5dd 100644 --- a/lib/c_glib/src/thrift/c_glib/protocol/thrift_compact_protocol.c +++ b/lib/c_glib/src/thrift/c_glib/protocol/thrift_compact_protocol.c @@ -1414,6 +1414,13 @@ thrift_compact_protocol_read_string (ThriftProtocol *protocol, return -1; } + ThriftProtocol *tp = THRIFT_PROTOCOL (protocol); + ThriftTransportClass *ttc = THRIFT_TRANSPORT_GET_CLASS (tp->transport); + if (read_len > 0 && !ttc->checkReadBytesAvailable (THRIFT_TRANSPORT (tp->transport), read_len, error)) { + *str = NULL; + return -1; + } + /* allocate the memory as an array of unsigned char for binary data */ *str = g_new0 (gchar, read_len + 1); if (read_len > 0) { @@ -1468,6 +1475,14 @@ thrift_compact_protocol_read_binary (ThriftProtocol *protocol, } if (read_len > 0) { + ThriftProtocol *tp = THRIFT_PROTOCOL (protocol); + ThriftTransportClass *ttc = THRIFT_TRANSPORT_GET_CLASS (tp->transport); + if (!ttc->checkReadBytesAvailable (THRIFT_TRANSPORT (tp->transport), read_len, error)) { + *buf = NULL; + *len = 0; + return -1; + } + /* allocate the memory as an array of unsigned char for binary data */ *len = (guint32) read_len; *buf = g_new (guchar, *len); @@ -1505,9 +1520,9 @@ thrift_compact_protocol_get_min_serialized_size (ThriftProtocol *protocol, Thrif switch (type) { case T_STOP: - return 0; + return 1; /* T_STOP needs to count itself */ case T_VOID: - return 0; + return 1; /* T_VOID needs to count itself */ case T_BOOL: return sizeof(gint8); case T_DOUBLE: @@ -1523,7 +1538,7 @@ thrift_compact_protocol_get_min_serialized_size (ThriftProtocol *protocol, Thrif case T_STRING: return sizeof(gint8); case T_STRUCT: - return 0; + return 1; /* empty struct needs at least 1 byte for the T_STOP */ case T_MAP: return sizeof(gint8); case T_SET: diff --git a/lib/c_glib/src/thrift/c_glib/transport/thrift_transport.c b/lib/c_glib/src/thrift/c_glib/transport/thrift_transport.c index 9d3f25e75e7..a03eb9e2b7a 100644 --- a/lib/c_glib/src/thrift/c_glib/transport/thrift_transport.c +++ b/lib/c_glib/src/thrift/c_glib/transport/thrift_transport.c @@ -164,7 +164,7 @@ thrift_transport_checkReadBytesAvailable(ThriftTransport *transport, glong numBy { gboolean boolean = TRUE; ThriftTransport *tt = THRIFT_TRANSPORT (transport); - if(tt->remainingMessageSize_ < numBytes) + if(tt->remainingMessageSize_ < numBytes || numBytes < 0) { g_set_error(error, THRIFT_TRANSPORT_ERROR, diff --git a/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc b/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc index b227c330497..67265cc79a2 100644 --- a/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc +++ b/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc @@ -469,6 +469,9 @@ uint32_t TBinaryProtocolT::readStringBody(StrType& str, return size; } + // Check against MaxMessageSize before alloc + trans_->checkReadBytesAvailable(size); + str.resize(size); this->trans_->readAll(reinterpret_cast(&str[0]), size); return (uint32_t)size; @@ -480,8 +483,8 @@ int TBinaryProtocolT::getMinSerializedSize(TType type) { switch (type) { - case T_STOP: return 0; - case T_VOID: return 0; + case T_STOP: return 1; // T_STOP needs to count itself + case T_VOID: return 1; // T_VOID needs to count itself case T_BOOL: return sizeof(int8_t); case T_BYTE: return sizeof(int8_t); case T_DOUBLE: return sizeof(double); @@ -489,7 +492,7 @@ int TBinaryProtocolT::getMinSerializedSize(TType type) case T_I32: return sizeof(int); case T_I64: return sizeof(long); case T_STRING: return sizeof(int); // string length - case T_STRUCT: return 0; // empty struct + case T_STRUCT: return 1; // empty struct needs at least 1 byte for the T_STOP case T_MAP: return sizeof(int); // element count case T_SET: return sizeof(int); // element count case T_LIST: return sizeof(int); // element count diff --git a/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc b/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc index b57568f8dcb..2a4990c545d 100644 --- a/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc +++ b/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc @@ -859,8 +859,8 @@ int TCompactProtocolT::getMinSerializedSize(TType type) { switch (type) { - case T_STOP: return 0; - case T_VOID: return 0; + case T_STOP: return 1; // T_STOP needs to count itself + case T_VOID: return 1; // T_VOID needs to count itself case T_BOOL: return sizeof(int8_t); case T_DOUBLE: return 8; // uses fixedLongToBytes() which always writes 8 bytes case T_BYTE: return sizeof(int8_t); @@ -868,7 +868,7 @@ int TCompactProtocolT::getMinSerializedSize(TType type) case T_I32: return sizeof(int8_t); // zigzag case T_I64: return sizeof(int8_t); // zigzag case T_STRING: return sizeof(int8_t); // string length - case T_STRUCT: return 0; // empty struct + case T_STRUCT: return 1; // empty struct needs at least 1 byte for the T_STOP case T_MAP: return sizeof(int8_t); // element count case T_SET: return sizeof(int8_t); // element count case T_LIST: return sizeof(int8_t); // element count diff --git a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp index 1218190be1f..a04d7adcd71 100644 --- a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp +++ b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp @@ -1131,8 +1131,8 @@ int TJSONProtocol::getMinSerializedSize(TType type) { switch (type) { - case T_STOP: return 0; - case T_VOID: return 0; + case T_STOP: return 1; // T_STOP needs to count itself + case T_VOID: return 1; // T_VOID needs to count itself case T_BOOL: return 1; // written as int case T_BYTE: return 1; case T_DOUBLE: return 1; diff --git a/lib/cpp/src/thrift/transport/TTransport.h b/lib/cpp/src/thrift/transport/TTransport.h index 52b3a0a4d32..1158bcf04d2 100644 --- a/lib/cpp/src/thrift/transport/TTransport.h +++ b/lib/cpp/src/thrift/transport/TTransport.h @@ -274,7 +274,7 @@ class TTransport { */ void checkReadBytesAvailable(long int numBytes) { - if (remainingMessageSize_ < numBytes) + if (remainingMessageSize_ < numBytes || numBytes < 0) throw TTransportException(TTransportException::END_OF_FILE, "MaxMessageSize reached"); } diff --git a/lib/delphi/src/Thrift.Protocol.Compact.pas b/lib/delphi/src/Thrift.Protocol.Compact.pas index a8ad53a4192..afb3dd52d24 100644 --- a/lib/delphi/src/Thrift.Protocol.Compact.pas +++ b/lib/delphi/src/Thrift.Protocol.Compact.pas @@ -1011,8 +1011,8 @@ function TCompactProtocolImpl.GetMinSerializedSize( const aType : TType) : Integ // Return the minimum number of bytes a type will consume on the wire begin case aType of - TType.Stop: result := 0; - TType.Void: result := 0; + TType.Stop: result := 1; // T_STOP needs to count itself + TType.Void: result := 1; // T_VOID needs to count itself TType.Bool_: result := SizeOf(Byte); TType.Byte_: result := SizeOf(Byte); TType.Double_: result := 8; // uses fixedLongToBytes() which always writes 8 bytes @@ -1020,7 +1020,7 @@ function TCompactProtocolImpl.GetMinSerializedSize( const aType : TType) : Integ TType.I32: result := SizeOf(Byte); TType.I64: result := SizeOf(Byte); TType.String_: result := SizeOf(Byte); // string length - TType.Struct: result := 0; // empty struct + TType.Struct: result := 1; // empty struct needs at least 1 byte for the T_STOP TType.Map: result := SizeOf(Byte); // element count TType.Set_: result := SizeOf(Byte); // element count TType.List: result := SizeOf(Byte); // element count diff --git a/lib/delphi/src/Thrift.Protocol.JSON.pas b/lib/delphi/src/Thrift.Protocol.JSON.pas index 2a9682ced11..5be7ae00cf3 100644 --- a/lib/delphi/src/Thrift.Protocol.JSON.pas +++ b/lib/delphi/src/Thrift.Protocol.JSON.pas @@ -1257,8 +1257,8 @@ function TJSONProtocolImpl.GetMinSerializedSize( const aType : TType) : Integer; // Return the minimum number of bytes a type will consume on the wire begin case aType of - TType.Stop: result := 0; - TType.Void: result := 0; + TType.Stop: result := 1; // T_STOP needs to count itself + TType.Void: result := 1; // T_VOID needs to count itself TType.Bool_: result := 1; TType.Byte_: result := 1; TType.Double_: result := 1; diff --git a/lib/delphi/src/Thrift.Protocol.pas b/lib/delphi/src/Thrift.Protocol.pas index 969fbcd0788..ecf210361a2 100644 --- a/lib/delphi/src/Thrift.Protocol.pas +++ b/lib/delphi/src/Thrift.Protocol.pas @@ -1237,8 +1237,8 @@ function TBinaryProtocolImpl.GetMinSerializedSize( const aType : TType) : Intege // Return the minimum number of bytes a type will consume on the wire begin case aType of - TType.Stop: result := 0; - TType.Void: result := 0; + TType.Stop: result := 1; // T_STOP needs to count itself + TType.Void: result := 1; // T_VOID needs to count itself TType.Bool_: result := SizeOf(Byte); TType.Byte_: result := SizeOf(Byte); TType.Double_: result := SizeOf(Double); @@ -1246,7 +1246,7 @@ function TBinaryProtocolImpl.GetMinSerializedSize( const aType : TType) : Intege TType.I32: result := SizeOf(Int32); TType.I64: result := SizeOf(Int64); TType.String_: result := SizeOf(Int32); // string length - TType.Struct: result := 0; // empty struct + TType.Struct: result := 1; // empty struct needs at least 1 byte for the T_STOP TType.Map: result := SizeOf(Int32); // element count TType.Set_: result := SizeOf(Int32); // element count TType.List: result := SizeOf(Int32); // element count diff --git a/lib/go/thrift/binary_protocol.go b/lib/go/thrift/binary_protocol.go index eded931346e..431e4462fbe 100644 --- a/lib/go/thrift/binary_protocol.go +++ b/lib/go/thrift/binary_protocol.go @@ -355,7 +355,9 @@ func (p *TBinaryProtocol) ReadMapBegin(ctx context.Context) (kType, vType TType, err = NewTProtocolException(e) return } - err = checkSizeForProtocol(size32, p.cfg) + minElemSize := p.getMinSerializedSize(kType) + p.getMinSerializedSize(vType) + totalMinSize := size32 * minElemSize + err = checkSizeForProtocol(totalMinSize, p.cfg) if err != nil { return } @@ -379,7 +381,9 @@ func (p *TBinaryProtocol) ReadListBegin(ctx context.Context) (elemType TType, si err = NewTProtocolException(e) return } - err = checkSizeForProtocol(size32, p.cfg) + minElemSize := p.getMinSerializedSize(elemType) + totalMinSize := size32 * minElemSize + err = checkSizeForProtocol(totalMinSize, p.cfg) if err != nil { return } @@ -404,7 +408,9 @@ func (p *TBinaryProtocol) ReadSetBegin(ctx context.Context) (elemType TType, siz err = NewTProtocolException(e) return } - err = checkSizeForProtocol(size32, p.cfg) + minElemSize := p.getMinSerializedSize(elemType) + totalMinSize := size32 * minElemSize + err = checkSizeForProtocol(totalMinSize, p.cfg) if err != nil { return } @@ -546,6 +552,44 @@ var ( _ TConfigurationSetter = (*TBinaryProtocol)(nil) ) +// Return the minimum number of bytes a type will consume on the wire +func (p *TBinaryProtocol) getMinSerializedSize(ttype TType) int32 { + switch ttype { + case STOP: + return 1 // T_STOP needs to count itself + case VOID: + return 1 // T_VOID needs to count itsel∂ + case BOOL: + return 1 // sizeof(int8) + case BYTE: + return 1 // sizeof(int8) + case DOUBLE: + return 8 // sizeof(double) + case I16: + return 2 // sizeof(short) + case I32: + return 4 // sizeof(int) + case I64: + return 8 // sizeof(long) + case STRING: + return 4 // string length + case STRUCT: + return 1 // empty struct needs at least 1 byte for the T_STOP + case MAP: + return 4 // element count + case SET: + return 4 // element count + case LIST: + return 4 // element count + case UUID: + return 16 // 16 bytes + default: + return 1 // unknown type + } +} + + + // This function is shared between TBinaryProtocol and TCompactProtocol. // // It tries to read size bytes from trans, in a way that prevents large diff --git a/lib/go/thrift/compact_protocol.go b/lib/go/thrift/compact_protocol.go index 18915fee8ad..a5223d38e41 100644 --- a/lib/go/thrift/compact_protocol.go +++ b/lib/go/thrift/compact_protocol.go @@ -486,10 +486,6 @@ func (p *TCompactProtocol) ReadMapBegin(ctx context.Context) (keyType TType, val err = NewTProtocolException(e) return } - err = checkSizeForProtocol(size32, p.cfg) - if err != nil { - return - } size = int(size32) keyAndValueType := byte(STOP) @@ -501,6 +497,13 @@ func (p *TCompactProtocol) ReadMapBegin(ctx context.Context) (keyType TType, val } keyType, _ = p.getTType(tCompactType(keyAndValueType >> 4)) valueType, _ = p.getTType(tCompactType(keyAndValueType & 0xf)) + + minElemSize := p.getMinSerializedSize(keyType) + p.getMinSerializedSize(valueType) + totalMinSize := size32 * minElemSize + err = checkSizeForProtocol(totalMinSize, p.cfg) + if err != nil { + return + } return } @@ -524,15 +527,18 @@ func (p *TCompactProtocol) ReadListBegin(ctx context.Context) (elemType TType, s } size = int(size2) } - err = checkSizeForProtocol(int32(size), p.cfg) - if err != nil { - return - } elemType, e := p.getTType(tCompactType(size_and_type)) if e != nil { err = NewTProtocolException(e) return } + + minElemSize := p.getMinSerializedSize(elemType) + totalMinSize := int32(size) * minElemSize + err = checkSizeForProtocol(totalMinSize, p.cfg) + if err != nil { + return + } return } @@ -860,6 +866,42 @@ func (p *TCompactProtocol) SetTConfiguration(conf *TConfiguration) { p.cfg = conf } +// Return the minimum number of bytes a type will consume on the wire +func (p *TCompactProtocol) getMinSerializedSize(ttype TType) int32 { + switch ttype { + case STOP: + return 1 // T_STOP needs to count itself + case VOID: + return 1 // T_VOID needs to count itself + case BOOL: + return 1 // sizeof(int8) + case BYTE: + return 1 // sizeof(int8) + case DOUBLE: + return 8 // uses PutUint64() which always writes 8 bytes + case I16: + return 1 // zigzag + case I32: + return 1 // zigzag + case I64: + return 1 // zigzag + case STRING: + return 1 // string length + case STRUCT: + return 1 // empty struct needs at least 1 byte for the T_STOP + case MAP: + return 1 // element count + case SET: + return 1 // element count + case LIST: + return 1 // element count + case UUID: + return 16 // 16 bytes + default: + return 1 // unknown type + } +} + var ( _ TConfigurationSetter = (*TCompactProtocolFactory)(nil) _ TConfigurationSetter = (*TCompactProtocol)(nil) diff --git a/lib/go/thrift/json_protocol.go b/lib/go/thrift/json_protocol.go index 6743a7fe3b8..3d53b698d80 100644 --- a/lib/go/thrift/json_protocol.go +++ b/lib/go/thrift/json_protocol.go @@ -314,11 +314,14 @@ func (p *TJSONProtocol) ReadMapBegin(ctx context.Context) (keyType TType, valueT if err != nil { return keyType, valueType, size, err } - err = checkSizeForProtocol(int32(iSize), p.cfg) + size = int(iSize) + + minElemSize := p.getMinSerializedSize(keyType) + p.getMinSerializedSize(valueType) + totalMinSize := int32(iSize) * minElemSize + err = checkSizeForProtocol(totalMinSize, p.cfg) if err != nil { return keyType, valueType, 0, err } - size = int(iSize) _, e = p.ParseObjectStart() return keyType, valueType, size, e @@ -492,11 +495,14 @@ func (p *TJSONProtocol) ParseElemListBegin() (elemType TType, size int, e error) if err != nil { return elemType, 0, err } - err = checkSizeForProtocol(int32(nSize), p.cfg) + size = int(nSize) + + minElemSize := p.getMinSerializedSize(elemType) + totalMinSize := int32(nSize) * minElemSize + err = checkSizeForProtocol(totalMinSize, p.cfg) if err != nil { return elemType, 0, err } - size = int(nSize) return elemType, size, nil } @@ -564,4 +570,40 @@ func (p *TJSONProtocol) StringToTypeId(fieldType string) (TType, error) { return TType(STOP), NewTProtocolExceptionWithType(INVALID_DATA, e) } +// Return the minimum number of bytes a type will consume on the wire +func (p *TJSONProtocol) getMinSerializedSize(ttype TType) int32 { + switch ttype { + case STOP: + return 1 // T_STOP needs to count itself + case VOID: + return 1 // T_VOID needs to count itself + case BOOL: + return 1 // written as int + case BYTE: + return 1 + case DOUBLE: + return 1 + case I16: + return 1 + case I32: + return 1 + case I64: + return 1 + case STRING: + return 2 // empty string + case STRUCT: + return 2 // empty struct + case MAP: + return 2 // empty map + case SET: + return 2 // empty set + case LIST: + return 2 // empty list + case UUID: + return 16 // empty UUID + default: + return 1 // unknown type + } +} + var _ TConfigurationSetter = (*TJSONProtocol)(nil) diff --git a/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocol.hx b/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocol.hx index 48b8d1e5cf3..c510895de00 100644 --- a/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocol.hx +++ b/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocol.hx @@ -321,8 +321,8 @@ class TBinaryProtocol extends TProtocolImplBase implements TProtocol { { switch (type) { - case TType.STOP: return 0; - case TType.VOID_: return 0; + case TType.STOP: return 1; // T_STOP needs to count itself + case TType.VOID_: return 1; // T_VOID needs to count itself case TType.BOOL: return 1; case TType.BYTE: return 1; case TType.DOUBLE: return 8; @@ -330,7 +330,7 @@ class TBinaryProtocol extends TProtocolImplBase implements TProtocol { case TType.I32: return 4; case TType.I64: return 8; case TType.STRING: return 4; // string length - case TType.STRUCT: return 0; // empty struct + case TType.STRUCT: return 1; // empty struct needs at least 1 byte for the T_STOP case TType.MAP: return 4; // element count case TType.SET: return 4; // element count case TType.LIST: return 4; // element count diff --git a/lib/haxe/src/org/apache/thrift/protocol/TCompactProtocol.hx b/lib/haxe/src/org/apache/thrift/protocol/TCompactProtocol.hx index d3577f1f770..22af9e8024e 100644 --- a/lib/haxe/src/org/apache/thrift/protocol/TCompactProtocol.hx +++ b/lib/haxe/src/org/apache/thrift/protocol/TCompactProtocol.hx @@ -725,8 +725,8 @@ class TCompactProtocol extends TProtocolImplBase implements TProtocol { { switch (type) { - case TType.STOP: return 0; - case TType.VOID_: return 0; + case TType.STOP: return 1; // T_STOP needs to count itself + case TType.VOID_: return 1; // T_VOID needs to count itself case TType.BOOL: return 1; case TType.DOUBLE: return 8; // uses fixedLongToBytes() which always writes 8 bytes case TType.BYTE: return 1; @@ -734,7 +734,7 @@ class TCompactProtocol extends TProtocolImplBase implements TProtocol { case TType.I32: return 1; // zigzag case TType.I64: return 1; // zigzag case TType.STRING: return 1; // string length - case TType.STRUCT: return 0; // empty struct + case TType.STRUCT: return 1; // empty struct needs at least 1 byte for the T_STOP case TType.MAP: return 1; // element count case TType.SET: return 1; // element count case TType.LIST: return 1; // element count diff --git a/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocol.hx b/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocol.hx index a47479d42a2..4bbc42725a6 100644 --- a/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocol.hx +++ b/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocol.hx @@ -792,8 +792,8 @@ class TJSONProtocol extends TProtocolImplBase implements TProtocol { { switch (type) { - case TType.STOP: return 0; - case TType.VOID_: return 0; + case TType.STOP: return 1; // T_STOP needs to count itself + case TType.VOID_: return 1; // T_VOID needs to count itself case TType.BOOL: return 1; // written as int case TType.BYTE: return 1; case TType.DOUBLE: return 1; diff --git a/lib/haxe/src/org/apache/thrift/transport/TEndpointTransport.hx b/lib/haxe/src/org/apache/thrift/transport/TEndpointTransport.hx index b20dc702dc3..fad3b549245 100644 --- a/lib/haxe/src/org/apache/thrift/transport/TEndpointTransport.hx +++ b/lib/haxe/src/org/apache/thrift/transport/TEndpointTransport.hx @@ -78,7 +78,7 @@ class TEndpointTransport extends TTransport // Throws if there are not enough bytes in the input stream to satisfy a read of numBytes bytes of data public override function CheckReadBytesAvailable(numBytes : Int64) : Void { - if (RemainingMessageSize < numBytes) + if (RemainingMessageSize < numBytes || numBytes < 0) throw new TTransportException(TTransportException.END_OF_FILE, 'CheckReadBytesAvailable(${numBytes}): MaxMessageSize reached, only ${RemainingMessageSize} bytes available'); } diff --git a/lib/java/src/main/java/org/apache/thrift/protocol/TBinaryProtocol.java b/lib/java/src/main/java/org/apache/thrift/protocol/TBinaryProtocol.java index 99c3e930203..64d62b15a3f 100644 --- a/lib/java/src/main/java/org/apache/thrift/protocol/TBinaryProtocol.java +++ b/lib/java/src/main/java/org/apache/thrift/protocol/TBinaryProtocol.java @@ -524,9 +524,9 @@ private int readAll(byte[] buf, int off, int len) throws TException { public int getMinSerializedSize(byte type) throws TTransportException { switch (type) { case 0: - return 0; // Stop + return 1; // Stop - T_STOP needs to count itself case 1: - return 0; // Void + return 1; // Void - T_VOID needs to count itself case 2: return 1; // Bool sizeof(byte) case 3: @@ -542,7 +542,7 @@ public int getMinSerializedSize(byte type) throws TTransportException { case 11: return 4; // string length sizeof(int) case 12: - return 0; // empty struct + return 1; // empty struct needs at least 1 byte for the T_STOP case 13: return 4; // element count Map sizeof(int) case 14: diff --git a/lib/java/src/main/java/org/apache/thrift/protocol/TCompactProtocol.java b/lib/java/src/main/java/org/apache/thrift/protocol/TCompactProtocol.java index abb5cca31cd..3407f6269cc 100644 --- a/lib/java/src/main/java/org/apache/thrift/protocol/TCompactProtocol.java +++ b/lib/java/src/main/java/org/apache/thrift/protocol/TCompactProtocol.java @@ -911,9 +911,9 @@ private byte getCompactType(byte ttype) { public int getMinSerializedSize(byte type) throws TTransportException { switch (type) { case 0: - return 0; // Stop + return 1; // Stop - T_STOP needs to count itself case 1: - return 0; // Void + return 1; // Void - T_VOID needs to count itself case 2: return 1; // Bool sizeof(byte) case 3: @@ -929,7 +929,7 @@ public int getMinSerializedSize(byte type) throws TTransportException { case 11: return 1; // string length sizeof(byte) case 12: - return 0; // empty struct + return 1; // empty struct needs at least 1 byte for the T_STOP case 13: return 1; // element count Map sizeof(byte) case 14: diff --git a/lib/java/src/main/java/org/apache/thrift/protocol/TJSONProtocol.java b/lib/java/src/main/java/org/apache/thrift/protocol/TJSONProtocol.java index 203c016da20..e32d70bb5fb 100644 --- a/lib/java/src/main/java/org/apache/thrift/protocol/TJSONProtocol.java +++ b/lib/java/src/main/java/org/apache/thrift/protocol/TJSONProtocol.java @@ -972,9 +972,9 @@ public ByteBuffer readBinary() throws TException { public int getMinSerializedSize(byte type) throws TTransportException { switch (type) { case 0: - return 0; // Stop + return 1; // Stop - T_STOP needs to count itself case 1: - return 0; // Void + return 1; // Void - T_VOID needs to count itself case 2: return 1; // Bool case 3: diff --git a/lib/java/src/main/java/org/apache/thrift/protocol/TSimpleJSONProtocol.java b/lib/java/src/main/java/org/apache/thrift/protocol/TSimpleJSONProtocol.java index cceb517a5ea..7b78a653945 100644 --- a/lib/java/src/main/java/org/apache/thrift/protocol/TSimpleJSONProtocol.java +++ b/lib/java/src/main/java/org/apache/thrift/protocol/TSimpleJSONProtocol.java @@ -477,9 +477,9 @@ public CollectionMapKeyException(String message) { public int getMinSerializedSize(byte type) throws TException { switch (type) { case 0: - return 0; // Stop + return 1; // Stop - T_STOP needs to count itself case 1: - return 0; // Void + return 1; // Void - T_VOID needs to count itself case 2: return 1; // Bool case 3: diff --git a/lib/java/src/main/java/org/apache/thrift/transport/TEndpointTransport.java b/lib/java/src/main/java/org/apache/thrift/transport/TEndpointTransport.java index 6026390413c..99f31928712 100644 --- a/lib/java/src/main/java/org/apache/thrift/transport/TEndpointTransport.java +++ b/lib/java/src/main/java/org/apache/thrift/transport/TEndpointTransport.java @@ -92,7 +92,7 @@ public void updateKnownMessageSize(long size) throws TTransportException { * @param numBytes */ public void checkReadBytesAvailable(long numBytes) throws TTransportException { - if (remainingMessageSize < numBytes) + if (remainingMessageSize < numBytes || numBytes < 0) throw new TTransportException( TTransportException.MESSAGE_SIZE_LIMIT, "Message size exceeds limit: " + getMaxMessageSize()); diff --git a/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs b/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs index 44fa9f7d995..fc5be9a9aff 100644 --- a/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs +++ b/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs @@ -452,8 +452,8 @@ public override int GetMinSerializedSize(TType type) { switch (type) { - case TType.Stop: return 0; - case TType.Void: return 0; + case TType.Stop: return 1; // T_STOP needs to count itself + case TType.Void: return 1; // T_VOID needs to count itself case TType.Bool: return sizeof(byte); case TType.Byte: return sizeof(byte); case TType.Double: return sizeof(double); @@ -461,7 +461,7 @@ public override int GetMinSerializedSize(TType type) case TType.I32: return sizeof(int); case TType.I64: return sizeof(long); case TType.String: return sizeof(int); // string length - case TType.Struct: return 0; // empty struct + case TType.Struct: return 1; // empty struct needs at least 1 byte for the T_STOP case TType.Map: return sizeof(int); // element count case TType.Set: return sizeof(int); // element count case TType.List: return sizeof(int); // element count diff --git a/lib/netstd/Thrift/Protocol/TCompactProtocol.cs b/lib/netstd/Thrift/Protocol/TCompactProtocol.cs index 1fd7e50ce54..5ca4841f670 100644 --- a/lib/netstd/Thrift/Protocol/TCompactProtocol.cs +++ b/lib/netstd/Thrift/Protocol/TCompactProtocol.cs @@ -816,8 +816,8 @@ public override int GetMinSerializedSize(TType type) { switch (type) { - case TType.Stop: return 0; - case TType.Void: return 0; + case TType.Stop: return 1; // T_STOP needs to count itself + case TType.Void: return 1; // T_VOID needs to count itself case TType.Bool: return sizeof(byte); case TType.Double: return 8; // uses fixedLongToBytes() which always writes 8 bytes case TType.Byte: return sizeof(byte); @@ -825,7 +825,7 @@ public override int GetMinSerializedSize(TType type) case TType.I32: return sizeof(byte); // zigzag case TType.I64: return sizeof(byte); // zigzag case TType.String: return sizeof(byte); // string length - case TType.Struct: return 0; // empty struct + case TType.Struct: return 1; // empty struct needs at least 1 byte for the T_STOP case TType.Map: return sizeof(byte); // element count case TType.Set: return sizeof(byte); // element count case TType.List: return sizeof(byte); // element count diff --git a/lib/netstd/Thrift/Protocol/TJSONProtocol.cs b/lib/netstd/Thrift/Protocol/TJSONProtocol.cs index 170f294ed62..37424a74ffa 100644 --- a/lib/netstd/Thrift/Protocol/TJSONProtocol.cs +++ b/lib/netstd/Thrift/Protocol/TJSONProtocol.cs @@ -838,8 +838,8 @@ public override int GetMinSerializedSize(TType type) { switch (type) { - case TType.Stop: return 0; - case TType.Void: return 0; + case TType.Stop: return 1; // T_STOP needs to count itself + case TType.Void: return 1; // T_VOID needs to count itself case TType.Bool: return 1; // written as int case TType.Byte: return 1; case TType.Double: return 1; From 3e6be73ced989ea40fe04025d77fbcc196cc4795 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Wed, 4 Jun 2025 22:31:55 +0200 Subject: [PATCH 287/430] Protocol conformity and serialization tests for UUIDs --- lib/delphi/src/Thrift.Serializer.pas | 32 +++-- .../test/serializer/TestSerializer.Tests.pas | 109 ++++++++++++++---- .../Protocols/ProtocolConformityTests.cs | 90 +++++++++++++++ .../Protocols/ProtocolsOperationsTests.cs | 74 +++++++----- .../Protocols/TestBase.cs | 48 ++++++++ 5 files changed, 292 insertions(+), 61 deletions(-) create mode 100644 lib/netstd/Tests/Thrift.IntegrationTests/Protocols/ProtocolConformityTests.cs create mode 100644 lib/netstd/Tests/Thrift.IntegrationTests/Protocols/TestBase.cs diff --git a/lib/delphi/src/Thrift.Serializer.pas b/lib/delphi/src/Thrift.Serializer.pas index 8ee8a3540dc..c354a37dacc 100644 --- a/lib/delphi/src/Thrift.Serializer.pas +++ b/lib/delphi/src/Thrift.Serializer.pas @@ -66,7 +66,7 @@ TDeserializer = class public constructor Create( const aProtFact : IProtocolFactory = nil; // defaults to TBinaryProtocol const aTransFact : ITransportFactory = nil; - const aConfig : IThriftConfiguration = nil); + const aConfig : IThriftConfiguration = nil); // DTOR destructor Destroy; override; @@ -74,6 +74,11 @@ TDeserializer = class // Deserialize the Thrift object data. procedure Deserialize( const input : TBytes; const target : IBase); overload; procedure Deserialize( const input : TStream; const target : IBase); overload; + + // helper + property Protocol : IProtocol read FProtocol; + property Transport : ITransport read FTransport; + property Stream : TThriftMemoryStream read FStream; end; @@ -164,14 +169,14 @@ procedure TSerializer.Serialize( const input : IBase; const aStm : TStream); constructor TDeserializer.Create( const aProtFact : IProtocolFactory; const aTransFact : ITransportFactory; - const aConfig : IThriftConfiguration); + const aConfig : IThriftConfiguration); var adapter : IThriftStream; protfact : IProtocolFactory; begin inherited Create; - FStream := TThriftMemoryStream.Create; - adapter := TThriftStreamAdapterDelphi.Create( FStream, FALSE); + FStream := TThriftMemoryStream.Create; + adapter := TThriftStreamAdapterDelphi.Create( FStream, FALSE); FTransport := TStreamTransportImpl.Create( adapter, nil, aConfig); if aTransfact <> nil then FTransport := aTransfact.GetTransport( FTransport); @@ -205,8 +210,11 @@ procedure TDeserializer.Deserialize( const input : TBytes; const target : IBase) try iBytes := Length(input); FStream.Size := iBytes; - if iBytes > 0 - then Move( input[0], FStream.Memory^, iBytes); + if iBytes > 0 then begin + Move( input[0], FStream.Memory^, iBytes); + Transport.ResetMessageSizeAndConsumedBytes(); // size has changed + Transport.UpdateKnownMessageSize(iBytes); + end; target.Read( FProtocol); finally @@ -221,9 +229,15 @@ procedure TDeserializer.Deserialize( const input : TStream; const target : IBase var before : Int64; begin try - before := FStream.Position; - FStream.CopyFrom( input, COPY_ENTIRE_STREAM); - FStream.Position := before; + if Assigned(input) then begin + before := FStream.Position; + ASSERT( before = 0); + FStream.CopyFrom( input, COPY_ENTIRE_STREAM); + FStream.Position := before; + Transport.ResetMessageSizeAndConsumedBytes(); // size has changed + Transport.UpdateKnownMessageSize(FStream.Size); + end; + target.Read( FProtocol); finally FStream.Size := 0; // free any allocated memory diff --git a/lib/delphi/test/serializer/TestSerializer.Tests.pas b/lib/delphi/test/serializer/TestSerializer.Tests.pas index 466fb269efc..7f5b829ec51 100644 --- a/lib/delphi/test/serializer/TestSerializer.Tests.pas +++ b/lib/delphi/test/serializer/TestSerializer.Tests.pas @@ -49,7 +49,7 @@ interface type TFactoryPair = record - prot : IProtocolFactory; + proto : IProtocolFactory; trans : ITransportFactory; end; @@ -72,8 +72,9 @@ TTestSerializer = class //extends TestCase { class procedure Deserialize( const input : TBytes; const target : IBase; const factory : TFactoryPair); overload; class procedure Deserialize( const input : TStream; const target : IBase; const factory : TFactoryPair); overload; - class procedure ValidateReadToEnd( const input : TBytes; const serial : TDeserializer); overload; - class procedure ValidateReadToEnd( const input : TStream; const serial : TDeserializer); overload; + class procedure Deserialize( const input : TBytes; out target : TGuid; const factory : TFactoryPair); overload; + + class procedure ValidateReadToEnd( const serial : TDeserializer); overload; class function LengthOf( const bytes : TBytes) : Integer; overload; inline; class function LengthOf( const bytes : IThriftBytes) : Integer; overload; inline; @@ -90,6 +91,9 @@ TTestSerializer = class //extends TestCase { procedure Test_ExceptionStruct( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream); procedure Test_SimpleException( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream); + procedure Test_ProtocolConformity( const factory : TFactoryPair; const stream : TFileStream); + procedure Test_UuidDeserialization( const factory : TFactoryPair; const stream : TFileStream); + public constructor Create; destructor Destroy; override; @@ -143,7 +147,7 @@ destructor TTestSerializer.Destroy; procedure TTestSerializer.AddFactoryCombination( const aProto : IProtocolFactory; const aTrans : ITransportFactory); var rec : TFactoryPair; begin - rec.prot := aProto; + rec.proto := aProto; rec.trans := aTrans; FProtocols.Add( rec); end; @@ -177,6 +181,53 @@ class function TTestSerializer.DataPtrOf( const bytes : IThriftBytes) : Pointer; end; +procedure TTestSerializer.Test_ProtocolConformity( const factory : TFactoryPair; const stream : TFileStream); +begin + Test_UuidDeserialization( factory, stream); + // add more tests here +end; + + +procedure TTestSerializer.Test_UuidDeserialization( const factory : TFactoryPair; const stream : TFileStream); + + function CreateGuidBytes : TBytes; + var obj : TObject; + i : Integer; + begin + obj := factory.proto as TObject; + + if obj is TJSONProtocolImpl.TFactory then begin + result := TEncoding.UTF8.GetBytes('"00112233-4455-6677-8899-aabbccddeeff"'); + Exit; + end; + + if (obj is TBinaryProtocolImpl.TFactory) + or (obj is TCompactProtocolImpl.TFactory) + then begin + SetLength(result,16); + for i := 0 to Length(result)-1 do result[i] := (i * $10) + i; + Exit; + end; + + raise Exception.Create('Unhandled case'); + end; + + +var tested, correct : TGuid; + bytes : TBytes; +begin + // write + bytes := CreateGuidBytes(); + + // init + read + Deserialize( bytes, tested, factory); + + // check + correct := TGuid.Create('{00112233-4455-6677-8899-aabbccddeeff}'); + ASSERT( tested = correct); +end; + + procedure TTestSerializer.Test_OneOfEach( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream); var tested, correct : IOneOfEach; bytes : TBytes; @@ -385,6 +436,11 @@ procedure TTestSerializer.Test_Serializer_Deserializer; for factory in FProtocols do begin Writeln('- '+UserFriendlyName(factory)); + // protocol conformity tests + if (method = TMethod.mt_Bytes) and (factory.trans = nil) + then Test_ProtocolConformity( factory, stream); + + // normal objects Test_OneOfEach( method, factory, stream); Test_CompactStruct( method, factory, stream); Test_ExceptionStruct( method, factory, stream); @@ -402,7 +458,7 @@ procedure TTestSerializer.Test_Serializer_Deserializer; class function TTestSerializer.UserFriendlyName( const factory : TFactoryPair) : string; begin - result := Copy( (factory.prot as TObject).ClassName, 2, MAXINT); + result := Copy( (factory.proto as TObject).ClassName, 2, MAXINT); if factory.trans <> nil then result := Copy( (factory.trans as TObject).ClassName, 2, MAXINT) +' '+ result; @@ -472,7 +528,7 @@ class function TTestSerializer.Serialize(const input : IBase; const factory : TF config := TThriftConfigurationImpl.Create; //config.MaxMessageSize := 0; // we don't read anything here - serial := TSerializer.Create( factory.prot, factory.trans, config); + serial := TSerializer.Create( factory.proto, factory.trans, config); try result := serial.Serialize( input); finally @@ -488,7 +544,7 @@ class procedure TTestSerializer.Serialize(const input : IBase; const factory : T config := TThriftConfigurationImpl.Create; //config.MaxMessageSize := 0; // we don't read anything here - serial := TSerializer.Create( factory.prot, factory.trans, config); + serial := TSerializer.Create( factory.proto, factory.trans, config); try serial.Serialize( input, aStream); finally @@ -504,10 +560,10 @@ class procedure TTestSerializer.Deserialize( const input : TBytes; const target config := TThriftConfigurationImpl.Create; config.MaxMessageSize := Length(input); - serial := TDeserializer.Create( factory.prot, factory.trans, config); + serial := TDeserializer.Create( factory.proto, factory.trans, config); try serial.Deserialize( input, target); - ValidateReadToEnd( input, serial); + ValidateReadToEnd( serial); finally serial.Free; end; @@ -521,44 +577,49 @@ class procedure TTestSerializer.Deserialize( const input : TStream; const target config := TThriftConfigurationImpl.Create; config.MaxMessageSize := input.Size; - serial := TDeserializer.Create( factory.prot, factory.trans, config); + serial := TDeserializer.Create( factory.proto, factory.trans, config); try serial.Deserialize( input, target); - ValidateReadToEnd( input, serial); + ValidateReadToEnd( serial); finally serial.Free; end; end; -class procedure TTestSerializer.ValidateReadToEnd( const input : TBytes; const serial : TDeserializer); -// we should not have any more byte to read -var dummy : IBase; +class procedure TTestSerializer.Deserialize( const input : TBytes; out target : TGuid; const factory : TFactoryPair); +var serial : TDeserializer; + config : IThriftConfiguration; begin + config := TThriftConfigurationImpl.Create; + config.MaxMessageSize := Length(input); + + serial := TDeserializer.Create( factory.proto, factory.trans, config); try - dummy := TOneOfEachImpl.Create; - serial.Deserialize( input, dummy); - raise EInOutError.Create('Expected exception not thrown?'); - except - on e:TTransportExceptionEndOfFile do {expected}; - on e:Exception do raise; // unexpected + serial.Stream.Write(input[0], Length(input)); + serial.Stream.Position := 0; + serial.Transport.ResetMessageSizeAndConsumedBytes(); // size has changed + + target := serial.Protocol.ReadUuid; + finally + serial.Free; end; end; -class procedure TTestSerializer.ValidateReadToEnd( const input : TStream; const serial : TDeserializer); +class procedure TTestSerializer.ValidateReadToEnd( const serial : TDeserializer); // we should not have any more byte to read var dummy : IBase; begin try - input.Position := 0; dummy := TOneOfEachImpl.Create; - serial.Deserialize( input, dummy); + serial.Deserialize( nil, dummy); raise EInOutError.Create('Expected exception not thrown?'); except - on e:TTransportExceptionEndOfFile do {expected}; + on e:TTransportException do {expected}; on e:Exception do raise; // unexpected end; end; + end. diff --git a/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/ProtocolConformityTests.cs b/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/ProtocolConformityTests.cs new file mode 100644 index 00000000000..8c5988f2be7 --- /dev/null +++ b/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/ProtocolConformityTests.cs @@ -0,0 +1,90 @@ +// 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. + +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using KellermanSoftware.CompareNetObjects; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Thrift.Protocol; +using Thrift.Protocol.Entities; +using Thrift.Transport; +using Thrift.Transport.Client; + +namespace Thrift.IntegrationTests.Protocols +{ + [TestClass] + public class ProtocolConformityTests : TestBase + { + [DataTestMethod] + [DataRow(typeof(TBinaryProtocol))] + [DataRow(typeof(TCompactProtocol))] + [DataRow(typeof(TJsonProtocol))] + public async Task ReadUuidFromStream(Type protocolType) + { + var expected = new Guid("{00112233-4455-6677-8899-aabbccddeeff}"); + + try + { + var tuple = GetProtocolInstance(protocolType); + using var stream = tuple.Stream; + + await GenerateGuidTestData(stream, protocolType, default); + stream.Seek(0, SeekOrigin.Begin); + tuple.Transport.ResetMessageSizeAndConsumedBytes(); // length has changed + + var actual = await tuple.Protocol.ReadUuidAsync(default); + + var result = _compareLogic.Compare(expected, actual); + Assert.IsTrue(result.AreEqual, result.DifferencesString); + } + catch (Exception e) + { + throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e); + } + } + + private static async Task GenerateGuidTestData(Stream stream, Type protocolType, CancellationToken cancel) + { + stream.Seek(0, SeekOrigin.Begin); + + if(protocolType == typeof(TJsonProtocol)) + { + await stream.WriteAsync(Encoding.UTF8.GetBytes("\"00112233-4455-6677-8899-aabbccddeeff\""), cancel); + return; + } + + if (protocolType == typeof(TBinaryProtocol)) + { + var data = new byte[16] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; + await stream.WriteAsync(data, cancel); + return; + } + + if (protocolType == typeof(TCompactProtocol)) + { + var data = new byte[16] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; + await stream.WriteAsync(data, cancel); + return; + } + + throw new Exception($"Unhandled protocol: {protocolType.FullName}"); + } + } +} diff --git a/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/ProtocolsOperationsTests.cs b/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/ProtocolsOperationsTests.cs index f9f3117a6fc..844bd10d200 100644 --- a/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/ProtocolsOperationsTests.cs +++ b/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/ProtocolsOperationsTests.cs @@ -31,11 +31,8 @@ namespace Thrift.IntegrationTests.Protocols { [TestClass] - public class ProtocolsOperationsTests + public class ProtocolsOperationsTests : TestBase { - private readonly CompareLogic _compareLogic = new(); - private static readonly TConfiguration Configuration = new(); - [DataTestMethod] [DataRow(typeof(TBinaryProtocol), TMessageType.Call)] [DataRow(typeof(TBinaryProtocol), TMessageType.Exception)] @@ -99,7 +96,7 @@ public async Task WriteReadStruct_Test(Type protocolType) await protocol.WriteStructEndAsync(default); await tuple.Transport.FlushAsync(default); - stream?.Seek(0, SeekOrigin.Begin); + stream.Seek(0, SeekOrigin.Begin); var actual = await protocol.ReadStructBeginAsync(default); await protocol.ReadStructEndAsync(default); @@ -135,7 +132,7 @@ public async Task WriteReadField_Test(Type protocolType) await protocol.WriteFieldEndAsync(default); await tuple.Transport.FlushAsync(default); - stream?.Seek(0, SeekOrigin.Begin); + stream.Seek(0, SeekOrigin.Begin); var actual = await protocol.ReadFieldBeginAsync(default); await protocol.ReadFieldEndAsync(default); @@ -169,7 +166,7 @@ public async Task WriteReadMap_Test(Type protocolType) await protocol.WriteMapEndAsync(default); await tuple.Transport.FlushAsync(default); - stream?.Seek(0, SeekOrigin.Begin); + stream.Seek(0, SeekOrigin.Begin); var actual = await protocol.ReadMapBeginAsync(default); await protocol.ReadMapEndAsync(default); @@ -204,7 +201,7 @@ public async Task WriteReadList_Test(Type protocolType) await protocol.WriteListEndAsync(default); await tuple.Transport.FlushAsync(default); - stream?.Seek(0, SeekOrigin.Begin); + stream.Seek(0, SeekOrigin.Begin); var actual = await protocol.ReadListBeginAsync(default); await protocol.ReadListEndAsync(default); @@ -238,7 +235,7 @@ public async Task WriteReadSet_Test(Type protocolType) await protocol.WriteSetEndAsync(default); await tuple.Transport.FlushAsync(default); - stream?.Seek(0, SeekOrigin.Begin); + stream.Seek(0, SeekOrigin.Begin); var actual = await protocol.ReadSetBeginAsync(default); await protocol.ReadSetEndAsync(default); @@ -271,7 +268,7 @@ public async Task WriteReadBool_Test(Type protocolType) await protocol.WriteBoolAsync(expected, default); await tuple.Transport.FlushAsync(default); - stream?.Seek(0, SeekOrigin.Begin); + stream.Seek(0, SeekOrigin.Begin); var actual = await protocol.ReadBoolAsync(default); @@ -303,7 +300,7 @@ public async Task WriteReadByte_Test(Type protocolType) await protocol.WriteByteAsync(expected, default); await tuple.Transport.FlushAsync(default); - stream?.Seek(0, SeekOrigin.Begin); + stream.Seek(0, SeekOrigin.Begin); var actual = await protocol.ReadByteAsync(default); @@ -335,7 +332,7 @@ public async Task WriteReadI16_Test(Type protocolType) await protocol.WriteI16Async(expected, default); await tuple.Transport.FlushAsync(default); - stream?.Seek(0, SeekOrigin.Begin); + stream.Seek(0, SeekOrigin.Begin); var actual = await protocol.ReadI16Async(default); @@ -367,7 +364,7 @@ public async Task WriteReadI32_Test(Type protocolType) await protocol.WriteI32Async(expected, default); await tuple.Transport.FlushAsync(default); - stream?.Seek(0, SeekOrigin.Begin); + stream.Seek(0, SeekOrigin.Begin); var actual = await protocol.ReadI32Async(default); @@ -399,7 +396,7 @@ public async Task WriteReadI64_Test(Type protocolType) await protocol.WriteI64Async(expected, default); await tuple.Transport.FlushAsync(default); - stream?.Seek(0, SeekOrigin.Begin); + stream.Seek(0, SeekOrigin.Begin); var actual = await protocol.ReadI64Async(default); @@ -431,7 +428,7 @@ public async Task WriteReadDouble_Test(Type protocolType) await protocol.WriteDoubleAsync(expected, default); await tuple.Transport.FlushAsync(default); - stream?.Seek(0, SeekOrigin.Begin); + stream.Seek(0, SeekOrigin.Begin); var actual = await protocol.ReadDoubleAsync(default); @@ -445,6 +442,38 @@ public async Task WriteReadDouble_Test(Type protocolType) } } + [DataTestMethod] + [DataRow(typeof(TBinaryProtocol))] + [DataRow(typeof(TCompactProtocol))] + [DataRow(typeof(TJsonProtocol))] + public async Task WriteReadUuid_Test(Type protocolType) + { + var expected = new Guid("{00112233-4455-6677-8899-aabbccddeeff}"); + + try + { + var tuple = GetProtocolInstance(protocolType); + using (var stream = tuple.Stream) + { + var protocol = tuple.Protocol; + + await protocol.WriteUuidAsync(expected, default); + await tuple.Transport.FlushAsync(default); + + stream.Seek(0, SeekOrigin.Begin); + + var actual = await protocol.ReadUuidAsync(default); + + var result = _compareLogic.Compare(expected, actual); + Assert.IsTrue(result.AreEqual, result.DifferencesString); + } + } + catch (Exception e) + { + throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e); + } + } + [DataTestMethod] [DataRow(typeof(TBinaryProtocol))] [DataRow(typeof(TCompactProtocol))] @@ -463,7 +492,7 @@ public async Task WriteReadString_Test(Type protocolType) await protocol.WriteStringAsync(expected, default); await tuple.Transport.FlushAsync(default); - stream?.Seek(0, SeekOrigin.Begin); + stream.Seek(0, SeekOrigin.Begin); var actual = await protocol.ReadStringAsync(default); @@ -495,7 +524,7 @@ public async Task WriteReadBinary_Test(Type protocolType) await protocol.WriteBinaryAsync(expected, default); await tuple.Transport.FlushAsync(default); - stream?.Seek(0, SeekOrigin.Begin); + stream.Seek(0, SeekOrigin.Begin); var actual = await protocol.ReadBinaryAsync(default); @@ -508,16 +537,5 @@ public async Task WriteReadBinary_Test(Type protocolType) throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e); } } - - private record struct ProtocolTransportStack(Stream Stream, TTransport Transport, TProtocol Protocol); - - private static ProtocolTransportStack GetProtocolInstance(Type protocolType) - { - var memoryStream = new MemoryStream(); - var streamClientTransport = new TStreamTransport(memoryStream, memoryStream,Configuration); - if( Activator.CreateInstance(protocolType, streamClientTransport) is TProtocol protocol) - return new ProtocolTransportStack(memoryStream, streamClientTransport, protocol); - throw new Exception("Unexpected"); - } } } diff --git a/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/TestBase.cs b/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/TestBase.cs new file mode 100644 index 00000000000..5cbdea9bdf4 --- /dev/null +++ b/lib/netstd/Tests/Thrift.IntegrationTests/Protocols/TestBase.cs @@ -0,0 +1,48 @@ +// 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. + +using KellermanSoftware.CompareNetObjects; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Thrift.Protocol; +using Thrift.Transport; +using Thrift.Transport.Client; + +namespace Thrift.IntegrationTests.Protocols +{ + public class TestBase + { + protected readonly CompareLogic _compareLogic = new(); + protected static readonly TConfiguration Configuration = new(); + + + protected record struct ProtocolTransportStack(Stream Stream, TTransport Transport, TProtocol Protocol); + + protected static ProtocolTransportStack GetProtocolInstance(Type protocolType) + { + var memoryStream = new MemoryStream(); + var streamClientTransport = new TStreamTransport(memoryStream, memoryStream, Configuration); + if (Activator.CreateInstance(protocolType, streamClientTransport) is TProtocol protocol) + return new ProtocolTransportStack(memoryStream, streamClientTransport, protocol); + throw new Exception("Unexpected"); + } + } +} From a420a24cbac98cc78fdffd8efc43cc64146d49e0 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 7 Feb 2025 01:58:30 +0100 Subject: [PATCH 288/430] Protocol conformity and serialization tests for UUIDs - Haxe --- .../src/org/apache/thrift/TConfiguration.hx | 6 +- lib/haxe/test/HaxeTests.hxproj | 2 +- lib/haxe/test/src/ConstantsTest.hx | 74 --------- lib/haxe/test/src/Main.hx | 139 ++++++++-------- lib/haxe/test/src/tests/ConstantsTest.hx | 150 ++++++++++++++++++ .../test/src/{ => tests}/MultiplexTest.hx | 19 +-- lib/haxe/test/src/{ => tests}/StreamTest.hx | 13 +- lib/haxe/test/src/{ => tests}/TestBase.hx | 2 +- 8 files changed, 246 insertions(+), 159 deletions(-) delete mode 100644 lib/haxe/test/src/ConstantsTest.hx create mode 100644 lib/haxe/test/src/tests/ConstantsTest.hx rename lib/haxe/test/src/{ => tests}/MultiplexTest.hx (92%) rename lib/haxe/test/src/{ => tests}/StreamTest.hx (85%) rename lib/haxe/test/src/{ => tests}/TestBase.hx (98%) diff --git a/lib/haxe/src/org/apache/thrift/TConfiguration.hx b/lib/haxe/src/org/apache/thrift/TConfiguration.hx index 47973f2c2c0..3bc5a864f8c 100644 --- a/lib/haxe/src/org/apache/thrift/TConfiguration.hx +++ b/lib/haxe/src/org/apache/thrift/TConfiguration.hx @@ -25,9 +25,9 @@ class TConfiguration public static inline var DEFAULT_MAX_FRAME_SIZE = 16384000; // this value is used consistently across all Thrift libraries public static inline var DEFAULT_RECURSION_DEPTH = 64; - public var MaxMessageSize(default,null) : Int = DEFAULT_MAX_MESSAGE_SIZE; - public var MaxFrameSize(default,null) : Int = DEFAULT_MAX_FRAME_SIZE; - public var RecursionLimit(default,null) : Int = DEFAULT_RECURSION_DEPTH; + public var MaxMessageSize(default,default) : Int = DEFAULT_MAX_MESSAGE_SIZE; + public var MaxFrameSize(default,default) : Int = DEFAULT_MAX_FRAME_SIZE; + public var RecursionLimit(default,default) : Int = DEFAULT_RECURSION_DEPTH; // TODO(JensG): add connection and i/o timeouts diff --git a/lib/haxe/test/HaxeTests.hxproj b/lib/haxe/test/HaxeTests.hxproj index 839917b4757..fbb9c8e5ef0 100644 --- a/lib/haxe/test/HaxeTests.hxproj +++ b/lib/haxe/test/HaxeTests.hxproj @@ -63,7 +63,7 @@ thrift -r -gen haxe ../../../lib/rb/benchmark/Benchmark.thrift