Blob Blame History Raw
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