From 28c286718f7d2c46b9ff310bb4178b7f2258bb25 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar@redhat.com>
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 <smueller@cpan.org>
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!
<https://rt.cpan.org/Public/Bug/Display.html?id=86367>
<https://bugzilla.redhat.com/show_bug.cgi?id=1032181>
Signed-off-by: Petr Písař <ppisar@redhat.com>
---
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<int>', 'std::vector<int>'],
+ ['std::vector< unsigned int >', 'std::vector<unsigned int>'],
+ ['std::vector< vector<unsigned int> >', 'std::vector<vector<unsigned int> >'],
+ ['std::map< map <unsigned int, int>, int>', 'std::map<map<unsigned int, int>, 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