Re: kernel-doc mishandles declarations split into lines

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Em Tue, 06 Jun 2017 15:28:34 +0200
Johannes Berg <johannes@xxxxxxxxxxxxxxxx> escreveu:

> Hi,
> 
> Apologies for the long CC list, wasn't sure who really feels like they
> understand this script anymore ... Markus, I think you had a rewrite of
> the script in python?
> 
> If you have something like this:
> 
> /**
>  * struct something
>  * @very_long_member_name: abcde
>  */
> struct something {
> 	struct this_is_a_very_long_struct_name_so_need_to_break_for_the
> 		very_long_member_name;
> };
> 
> then kernel-doc will mishandle it:
> 
> $ ./scripts/kernel-doc -rst -internal /tmp/test.c
> /tmp/test.c:9: warning: No description found for parameter 'this_is_a_very_long_struct_name_so_need_to_break_for_thevery_long_member_name'
> /tmp/test.c:9: warning: Excess struct/union/enum/typedef member 'very_long_member_name' description in 'something'
> 
> 
> .. c:type:: struct something
> 
> 
> **Definition**
> 
> ::
> 
>   struct something {
>   };
> 
> **Members**
> 
> 
> 
> Clearly, the code that strips trailing and leading whitespace (in
> process_proto_type) is a bit *too* eager to do so, but so far I haven't
> found anything that makes it work.
> 
> Anyone have any thoughts?

A trivial "fix" would be to use just one line for the struct field :-)

-

The logic that handle structs is at sub dump_struct() function at
kernel-doc, with is called by dump_declaration().

I added some debug prints at kernel-doc...
I guess the problem you're noticing is at process_proto_type():

	$ ./scripts/kernel-doc -rst -internal /tmp/test.c
	process_proto_type - original:struct something {

	process_proto_type - parsed: struct something {
	process_proto_type - original:	struct this_is_a_very_long_struct_name_so_need_to_break_for_the

	process_proto_type - parsed: struct this_is_a_very_long_struct_name_so_need_to_break_for_the
	process_proto_type - original:		very_long_member_name;

	process_proto_type - parsed: very_long_member_name;
	process_proto_type - original:};

	process_proto_type - parsed: };
	process_proto_type - to_dump: struct something {struct this_is_a_very_long_struct_name_so_need_to_break_for_thevery_long_member_name;};
	dump_struct: struct something {struct this_is_a_very_long_struct_name_so_need_to_break_for_thevery_long_member_name;};
	members: struct this_is_a_very_long_struct_name_so_need_to_break_for_thevery_long_member_name;

Basically, that while(1) loop there seems to be misinterpreting the line with "very_long_member_name;"

Thanks,
Mauro

diff --git a/scripts/kernel-doc b/scripts/kernel-doc
index a26a5f2dce39..55001278a2af 100755
--- a/scripts/kernel-doc
+++ b/scripts/kernel-doc
@@ -464,7 +464,7 @@ my $doc_com = '\s*\*\s*';
 my $doc_com_body = '\s*\* ?';
 my $doc_decl = $doc_com . '(\w+)';
 # @params and a strictly limited set of supported section names
-my $doc_sect = $doc_com . 
+my $doc_sect = $doc_com .
     '\s*(\@[.\w]+|\@\.\.\.|description|context|returns?|notes?|examples?)\s*:(.*)';
 my $doc_content = $doc_com_body . '(.*)';
 my $doc_block = $doc_com . 'DOC:\s*(.*)?';
@@ -2167,6 +2167,8 @@ sub dump_struct($$) {
     my $nested;
 
     if ($x =~ /(struct|union)\s+(\w+)\s*{(.*)}/) {
+
+printf("dump_struct: $x\n");
 	#my $decl_type = $1;
 	$declaration_name = $2;
 	my $members = $3;
@@ -2190,6 +2192,9 @@ sub dump_struct($$) {
 	# replace DECLARE_BITMAP
 	$members =~ s/DECLARE_BITMAP\s*\(([^,)]+), ([^,)]+)\)/unsigned long $1\[BITS_TO_LONGS($2)\]/gos;
 
+printf("members: $members\n");
+
+
 	create_parameterlist($members, ';', $file);
 	check_sections($file, $declaration_name, "struct", $sectcheck, $struct_actual, $nested);
 
@@ -2751,6 +2756,8 @@ sub process_proto_type($$) {
     my $x = shift;
     my $file = shift;
 
+printf("process_proto_type - original:$x\n");
+
     $x =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
     $x =~ s@^\s+@@gos; # strip leading spaces
     $x =~ s@\s+$@@gos; # strip trailing spaces
@@ -2761,12 +2768,15 @@ sub process_proto_type($$) {
 	$x .= ";";
     }
 
+printf("process_proto_type - parsed: $x\n");
+
     while (1) {
 	if ( $x =~ /([^{};]*)([{};])(.*)/ ) {
 	    $prototype .= $1 . $2;
 	    ($2 eq '{') && $brcount++;
 	    ($2 eq '}') && $brcount--;
 	    if (($2 eq ';') && ($brcount == 0)) {
+printf("process_proto_type - to_dump: $prototype\n");
 		dump_declaration($prototype, $file);
 		reset_state();
 		last;

--
To unsubscribe from this list: send the line "unsubscribe linux-doc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux