From 41687fc6cfa179883da9b18d094ad56f6be669da Mon Sep 17 00:00:00 2001 From: T Jake Luciani Date: Tue, 23 Dec 2008 03:45:43 +0000 Subject: [PATCH] THRIFT-193: Patch for proper namespace support in perl compiler git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@728863 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/generate/t_perl_generator.cc | 55 ++++++++++++------- test/perl/Makefile | 2 +- test/perl/TestClient.pl | 20 +++---- tutorial/perl/PerlClient.pl | 12 ++-- 4 files changed, 52 insertions(+), 37 deletions(-) diff --git a/compiler/cpp/src/generate/t_perl_generator.cc b/compiler/cpp/src/generate/t_perl_generator.cc index 4d846c66..737dce91 100644 --- a/compiler/cpp/src/generate/t_perl_generator.cc +++ b/compiler/cpp/src/generate/t_perl_generator.cc @@ -184,6 +184,17 @@ class t_perl_generator : public t_oop_generator { return result; } + std::string get_namespace_out_dir() { + std::string outdir = get_out_dir(); + std::list dirs; + perl_namespace_dirs(program_, dirs); + std::list::iterator it; + for (it = dirs.begin(); it != dirs.end(); it++) { + outdir += *it + "/"; + } + return outdir; + } + private: /** @@ -275,7 +286,7 @@ 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 "<get_name()<<";"<get_name()<<";"< constants = tenum->get_constants(); vector::iterator c_iter; @@ -448,6 +459,7 @@ void t_perl_generator::generate_perl_struct_definition(ofstream& out, } //Create simple acessor methods + out << "use Class::Accessor;\n"; out << "use base('Class::Accessor');\n"; if (members.size() > 0) { @@ -656,7 +668,7 @@ void t_perl_generator::generate_perl_struct_writer(ofstream& out, * @param tservice The service definition */ void t_perl_generator::generate_service(t_service* tservice) { - string f_service_name = get_out_dir()+service_name_+".pm"; + string f_service_name = get_namespace_out_dir()+service_name_+".pm"; f_service_.open(f_service_name.c_str()); f_service_ << @@ -667,9 +679,10 @@ void t_perl_generator::generate_service(t_service* tservice) { f_service_ << "use " << perl_namespace(tservice->get_program()) << "Types;" << endl; - if (tservice->get_extends() != NULL) { + t_service* extends_s = tservice->get_extends(); + if (extends_s != NULL) { f_service_ << - "use " << tservice->get_extends()->get_name() << ";" << endl; + "use " << perl_namespace(extends_s->get_program()) << extends_s->get_name() << ";" << endl; } f_service_ << @@ -699,8 +712,9 @@ void t_perl_generator::generate_service_processor(t_service* tservice) { string extends = ""; string extends_processor = ""; - if (tservice->get_extends() != NULL) { - extends = tservice->get_extends()->get_name(); + t_service* extends_s = tservice->get_extends(); + if (extends_s != NULL) { + extends = perl_namespace(extends_s->get_program()) + extends_s->get_name(); extends_processor = "use base('" + extends + "Processor');"; } @@ -708,7 +722,7 @@ void t_perl_generator::generate_service_processor(t_service* tservice) { // Generate the header portion f_service_ << - "package " << service_name_ << "Processor;" << endl << extends_processor << endl; + "package " << perl_namespace(program_) << service_name_ << "Processor;" << endl << extends_processor << endl; if (extends.empty()) { @@ -937,15 +951,14 @@ void t_perl_generator::generate_perl_function_helpers(t_function* tfunction) { * @param tservice The service to generate a header definition for */ void t_perl_generator::generate_service_interface(t_service* tservice) { - string extends = ""; string extends_if = ""; - if (tservice->get_extends() != NULL) { - extends = "use base('" + tservice->get_extends()->get_name() + "');"; - extends_if = "use base('" + tservice->get_extends()->get_name() + "If');"; + t_service* extends_s = tservice->get_extends(); + if (extends_s != NULL) { + extends_if = "use base('" + perl_namespace(extends_s->get_program()) + extends_s->get_name() + "If');"; } f_service_ << - "package " << service_name_ << "If;"<get_extends() != NULL) { - extends = tservice->get_extends()->get_name(); - extends_if = "use base('" + tservice->get_extends()->get_name() + "Rest');"; + t_service* extends_s = tservice->get_extends(); + if (extends_s != NULL) { + extends = extends_s->get_name(); + extends_if = "use base('" + perl_namespace(extends_s->get_program()) + extends_s->get_name() + "Rest');"; } f_service_ << - "package " << service_name_ << "Rest;"<get_extends() != NULL) { - extends = tservice->get_extends()->get_name(); + t_service* extends_s = tservice->get_extends(); + if (extends_s != NULL) { + extends = perl_namespace(extends_s->get_program()) + extends_s->get_name(); extends_client = "use base('" + extends + "Client');"; } f_service_ << - "package " << service_name_ << "Client;"<open(); @@ -177,23 +177,23 @@ print(" = {".join(",",@$listin)."}\n"); # ENUM TEST # print("testEnum(ONE)"); -my $ret = $testClient->testEnum(Numberz::ONE); +my $ret = $testClient->testEnum(ThriftTest::Numberz::ONE); print(" = $ret\n"); print("testEnum(TWO)"); -$ret = $testClient->testEnum(Numberz::TWO); +$ret = $testClient->testEnum(ThriftTest::Numberz::TWO); print(" = $ret\n"); print("testEnum(THREE)"); -$ret = $testClient->testEnum(Numberz::THREE); +$ret = $testClient->testEnum(ThriftTest::Numberz::THREE); print(" = $ret\n"); print("testEnum(FIVE)"); -$ret = $testClient->testEnum(Numberz::FIVE); +$ret = $testClient->testEnum(ThriftTest::Numberz::FIVE); print(" = $ret\n"); print("testEnum(EIGHT)"); -$ret = $testClient->testEnum(Numberz::EIGHT); +$ret = $testClient->testEnum(ThriftTest::Numberz::EIGHT); print(" = $ret\n"); # @@ -222,7 +222,7 @@ print("}\n"); # INSANITY TEST # my $insane = new ThriftTest::Insanity(); -$insane->{userMap}->{Numberz::FIVE} = 5000; +$insane->{userMap}->{ThriftTest::Numberz::FIVE} = 5000; my $truck = new ThriftTest::Xtruct(); $truck->string_thing("Truck"); $truck->byte_thing(8); diff --git a/tutorial/perl/PerlClient.pl b/tutorial/perl/PerlClient.pl index 44a5a521..9451a948 100644 --- a/tutorial/perl/PerlClient.pl +++ b/tutorial/perl/PerlClient.pl @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/env perl use strict; use warnings; @@ -11,8 +11,8 @@ use Thrift::BinaryProtocol; use Thrift::Socket; use Thrift::BufferedTransport; -use SharedService; -use Calculator; +use shared::SharedService; +use tutorial::Calculator; use shared::Types; use tutorial::Types; @@ -21,7 +21,7 @@ use Data::Dumper; my $socket = new Thrift::Socket('localhost',9090); my $transport = new Thrift::BufferedTransport($socket,1024,1024); my $protocol = new Thrift::BinaryProtocol($transport); -my $client = new CalculatorClient($protocol); +my $client = new tutorial::CalculatorClient($protocol); eval{ @@ -36,7 +36,7 @@ eval{ my $work = new tutorial::Work(); - $work->op(Operation::DIVIDE); + $work->op(tutorial::Operation::DIVIDE); $work->num1(1); $work->num2(0); @@ -47,7 +47,7 @@ eval{ warn "InvalidOperation: ".Dumper($@); } - $work->op(Operation::SUBTRACT); + $work->op(tutorial::Operation::SUBTRACT); $work->num1(15); $work->num2(10); my $diff = $client->calculate(1, $work); -- 2.17.1