From 28c286718f7d2c46b9ff310bb4178b7f2258bb25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= Date: Wed, 20 Nov 2013 12:49:57 +0100 Subject: [PATCH] EU::ParseXS: Attempt to canonicalize C++ types in tidy_type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a 3.18 port of perl commit: Author: Steffen Mueller Date: Wed May 22 21:49:06 2013 +0200 EU::ParseXS: Attempt to canonicalize C++ types in tidy_type Includes moving tidy_type to ExtUtils::Typemaps where it seems to belong. It's a pretty poor canonicalizer, but better than nothing! Signed-off-by: Petr Písař --- lib/ExtUtils/ParseXS/Utilities.pm | 7 +++++++ lib/ExtUtils/Typemaps.pm | 7 +++++++ t/103-tidy_type.t | 27 +++++++++++++++------------ 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/lib/ExtUtils/ParseXS/Utilities.pm b/lib/ExtUtils/ParseXS/Utilities.pm index d0089f8..f64af35 100644 --- a/lib/ExtUtils/ParseXS/Utilities.pm +++ b/lib/ExtUtils/ParseXS/Utilities.pm @@ -201,6 +201,13 @@ String cleaned up. sub tidy_type { local ($_) = @_; + # for templated C++ types, do some bit of flawed canonicalization + # wrt. templates at least + if (/[<>]/) { + s/\s*([<>])\s*/$1/g; + s/>>/> >/g; + } + # rationalise any '*' by joining them into bunches and removing whitespace s#\s*(\*+)\s*#$1#g; s#(\*+)# $1 #g; diff --git a/lib/ExtUtils/Typemaps.pm b/lib/ExtUtils/Typemaps.pm index 2768ef0..fc4e413 100644 --- a/lib/ExtUtils/Typemaps.pm +++ b/lib/ExtUtils/Typemaps.pm @@ -973,6 +973,13 @@ sub _parse { sub _tidy_type { local $_ = shift; + # for templated C++ types, do some bit of flawed canonicalization + # wrt. templates at least + if (/[<>]/) { + s/\s*([<>])\s*/$1/g; + s/>>/> >/g; + } + # rationalise any '*' by joining them into bunches and removing whitespace s#\s*(\*+)\s*#$1#g; s#(\*+)# $1 #g ; diff --git a/t/103-tidy_type.t b/t/103-tidy_type.t index a043383..fb44aa9 100644 --- a/t/103-tidy_type.t +++ b/t/103-tidy_type.t @@ -1,23 +1,26 @@ #!/usr/bin/perl use strict; use warnings; -use Test::More tests => 3; +use Test::More; use lib qw( lib ); use ExtUtils::ParseXS::Utilities qw( tidy_type ); -my $input; - -$input = ' * ** '; -is( tidy_type($input), '***', - "Got expected value for '$input'" ); +my @tests = ( + [' * ** ', '***'], + [' * ** ', '***'], + [' * ** foobar * ', '*** foobar *'], + ['unsigned int', 'unsigned int'], + ['std::vector', 'std::vector'], + ['std::vector< unsigned int >', 'std::vector'], + ['std::vector< vector >', 'std::vector >'], + ['std::map< map , int>', 'std::map, int>'], +); -$input = ' * ** '; -is( tidy_type($input), '***', - "Got expected value for '$input'" ); +plan tests => scalar(@tests); -$input = ' * ** foobar * '; -is( tidy_type($input), '*** foobar *', - "Got expected value for '$input'" ); +foreach my $test (@tests) { + is(tidy_type($test->[0]), $test->[1], "Tidying '$test->[0]'"); +} -- 1.8.3.1