# New Ticket Created by Vyacheslav Matjukhin # Please include the string: [perl #57884] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=57884 >
genfile() method at the Parrot::Configure::Compiler module generates wrong vim syntax modelines, i.e., it prints ft=c always. This patch fixes it by implementing new file_type option. If file_type isn't specified, genfile() tries to automatically recognize file type by looking at a target file name. Also, understanding file_type allows method users to forget about a comment_type option in most cases. This obviously generalizes old makefile option, so i removed it. Patch contents description follows. (as required by "How To Submit A Patch" from submissions.pod; should i really do this? It all seems pretty obvious...) config/gen/config_h.pm, config/gen/crypto.pm, config/gen/makefiles.pm: using new file_type option where needed, sometimes instead of makefile option. lib/Parrot/Configure/Compiler.pm: file_type option implementation and pod; hash with description of possible file_type's and corresponding comment_type's and vim_ft's. t/configure/034-step.t: trivial test updates. PS. I should've refactored 034-step.t too, but this can be done next time. There are no tests checking genfile() output, they all just check return value...
Index: lib/Parrot/Configure/Compiler.pm =================================================================== --- lib/Parrot/Configure/Compiler.pm (revision 30189) +++ lib/Parrot/Configure/Compiler.pm (working copy) @@ -34,6 +34,25 @@ move_if_diff ); +our %file_types_info = ( + makefile => { + comment_type => '#', + vim_ft => 'make', + }, + c => { + comment_type => '/*', + vim_ft => 'c', + }, + pmc => { + comment_type => '/*', + vim_ft => 'pmc', + }, + perl => { + comment_type => '#', + vim_ft => 'perl', + }, +); + =item C<cc_gen()> $conf->cc_gen($source) @@ -46,7 +65,7 @@ my $conf = shift; my $source = shift; - $conf->genfile( $source, "test_$$.c" ); + $conf->genfile( $source, "test_$$.c", file_type => 'none' ); } =item C<cc_build()> @@ -179,13 +198,15 @@ =over 4 -=item makefile +=item file_type -If set to a true value, this flag sets (unless overridden) C<comment_type> -to '#', C<replace_slashes> to enabled, and C<conditioned_lines> to enabled. +If set to a C<makefile>, C<c> or C<perl> value, C<comment_type> will be set +to corresponding value. +Moreover, when set to a C<makefile> value, it will set C<replace_slashes> to +enabled, and C<conditioned_lines> to enabled. -If the name of the file being generated ends in C<Makefile>, this option -defaults to true. +Its value will be detected automatically by target file name unless you set +it to a special value C<none>. =item conditioned_lines @@ -272,21 +293,52 @@ open my $in, '<', $source or die "Can't open $source: $!"; open my $out, '>', "$target.tmp" or die "Can't open $target.tmp: $!"; - if ( !exists $options{makefile} && $target =~ m/makefile$/i ) { - $options{makefile} = 1; + if ( !exists $options{file_type}) { + if ( $target =~ m/makefile$/i ) { + $options{file_type} = 'makefile'; + } + elsif ($target =~ m/\.pl$/i ) { + $options{file_type} = 'perl'; + } + elsif ($target =~ m/\.[hc]$/ ) { + $options{file_type} = 'c'; + } + elsif ($target =~ m/\.pmc$/ ) { + $options{file_type} = 'pmc'; + } + } elsif ( $options{file_type} eq 'none' ) { + delete $options{file_type}; } - if ( $options{makefile} ) { - exists $options{comment_type} or $options{comment_type} = '#'; - exists $options{replace_slashes} or $options{replace_slashes} = 1; - exists $options{conditioned_lines} or $options{conditioned_lines} = 1; + if ( !exists $options{file_type} && $target =~ m/makefile$/i ) { + $options{file_type} = 'makefile'; } + if ( $options{file_type} ) { + unless ( exists $file_types_info{$options{file_type}} ) { + die "Unknown file_type '$options{file_type}'"; + } + unless ( exists $options{comment_type} ) { + $options{comment_type} = $file_types_info{$options{file_type}}{comment_type}; + } + if ( $options{file_type} eq 'makefile' ) { + exists $options{replace_slashes} or $options{replace_slashes} = 1; + exists $options{conditioned_lines} or $options{conditioned_lines} = 1; + } + } + if ( $options{comment_type} ) { - my @comment = ( 'ex: set ro ft=c:', + my @comment = ( 'ex: set ro', 'DO NOT EDIT THIS FILE', 'Generated by ' . __PACKAGE__ . " from $source" ); + if ($options{file_type}) { + $comment[0] .= ' ft=' . $file_types_info{$options{file_type}}{vim_ft} . ':'; + } + else { + $comment[0] .= ':'; + } + if ( $options{comment_type} eq '#' ) { foreach my $line (@comment) { $line = "# $line\n"; Index: t/configure/034-step.t =================================================================== --- t/configure/034-step.t (revision 30189) +++ t/configure/034-step.t (working copy) @@ -33,9 +33,9 @@ ok( $conf->genfile( $dummy => 'CFLAGS', - makefile => 1, + file_type => 'makefile', ), - "genfile() returned true value with 'makefile' option" + "genfile() returned true value with 'file_type' option being set to 'makefile'" ); unlink $dummy or croak "Unable to delete file after testing"; chdir $cwd or croak "Unable to change back to starting directory"; @@ -48,7 +48,7 @@ open my $IN, '>', $dummy or croak "Unable to open temp file for writing"; print $IN qq{Hello world\n}; close $IN or croak "Unable to close temp file"; - eval { $conf->genfile( $dummy => 'CFLAGS', makefile => 1, comment_type => q{<!--}, ); }; + eval { $conf->genfile( $dummy => 'CFLAGS', file_type => 'makefile', comment_type => q{<!--}, ); }; like( $@, qr/^Unknown comment type/, @@ -68,7 +68,7 @@ ok( $conf->genfile( $dummy => 'CFLAGS', - makefile => 1, + file_type => 'makefile', feature_file => 0, ), "genfile() returned true value with false value for 'feature_file' option" Index: config/gen/config_h.pm =================================================================== --- config/gen/config_h.pm (revision 30189) +++ config/gen/config_h.pm (working copy) @@ -40,13 +40,11 @@ my ( $self, $conf ) = @_; $conf->genfile($self->{templates}->{config_h}, 'include/parrot/config.h', - comment_type => '/*', ignore_pattern => 'PARROT_CONFIG_DATE', conditioned_lines => 1 ); $conf->genfile($self->{templates}->{feature_h}, 'include/parrot/feature.h', - comment_type => '/*', ignore_pattern => 'PARROT_CONFIG_DATE', feature_file => 1 ); Index: config/gen/crypto.pm =================================================================== --- config/gen/crypto.pm (revision 30189) +++ config/gen/crypto.pm (working copy) @@ -77,10 +77,7 @@ ? '#if 0' : '#ifndef OPENSSL_NO_' . $md ); - $conf->genfile( - $self->{digest_pmc_template} => "src/dynpmc/${file}.pmc", - comment_type => '/*', - ); + $conf->genfile( $self->{digest_pmc_template} => "src/dynpmc/${file}.pmc" ); } return 1; Index: config/gen/makefiles.pm =================================================================== --- config/gen/makefiles.pm (revision 30189) +++ config/gen/makefiles.pm (working copy) @@ -28,13 +28,8 @@ $data{result} = q{}; $data{makefiles} = { 'Makefile' => { SOURCE => 'config/gen/makefiles/root.in' }, + 'ext/Makefile' => { SOURCE => 'config/gen/makefiles/ext.in', }, - 'ext/Makefile' => { - SOURCE => 'config/gen/makefiles/ext.in', - commentType => '#', - replace_slashes => 1, - conditioned_lines => 1, - }, 'ext/Parrot-Embed/Makefile.PL' => { SOURCE => 'config/gen/makefiles/parrot_embed.in', replace_slashes => 0, @@ -64,13 +59,11 @@ 'tools/build/dynpmc.pl' => { SOURCE => 'config/gen/makefiles/dynpmc_pl.in', - comment_type => '#', replace_slashes => 0, conditioned_lines => 1, }, 'tools/build/dynoplibs.pl' => { SOURCE => 'config/gen/makefiles/dynoplibs_pl.in', - comment_type => '#', replace_slashes => 0, conditioned_lines => 1, },