Commit b7ba9aa892

Krzysztof Wolicki <der.teufel.mail@gmail.com>
2023-05-10 01:53:00
autodoc: Add layout to Struct and Union to properly display packed and extern; Make rendering of types in exprName more similar to zig fmt
1 parent 5260657
Changed files (2)
lib
docs
src
lib/docs/main.js
@@ -1844,18 +1844,26 @@ const NAV_MODES = {
           case typeKinds.Struct: {
             let structObj = typeObj;
             let name = "";
+            let layout = "";
+            if (structObj.layout !== null) {
+              switch (structObj.layout.enumLiteral) {
+                case "Packed": {
+                  layout = "packed ";
+                  break;
+                }
+                case "Extern": {
+                  layout = "extern ";
+                  break;
+                }
+              }
+            }
             if (opts.wantHtml) {
-              name = "<span class='tok-kw'>struct</span>";
+              name = "<span class='tok-kw'>" + layout + "struct</span>";
             } else {
-              name = "struct";
+              name = layout + "struct";
             }
             if (structObj.backing_int !== null) {
-              if (opts.wantHtml) {
-                name = "<span class='tok-kw'>packed</span> " + name;
-              } else {
-                name = "packed " + name;
-              }
-              name += " (" + exprName(structObj.backing_int, opts) + ")";
+              name += "(" + exprName(structObj.backing_int, opts) + ")";
             }
             name += " { ";
             if (structObj.field_types.length > 1 && opts.wantHtml) { name += "</br>"; }
@@ -1912,7 +1920,7 @@ const NAV_MODES = {
               name = "enum";
             }
             if (enumObj.tag) {
-              name += " (" + exprName(enumObj.tag, opts) + ")";
+              name += "(" + exprName(enumObj.tag, opts) + ")";
             }
             name += " { ";
             let enumNode = getAstNode(enumObj.src);
@@ -1963,16 +1971,29 @@ const NAV_MODES = {
           case typeKinds.Union: {
             let unionObj = typeObj;
             let name = "";
+            let layout = "";
+            if (unionObj.layout !== null) {
+              switch (unionObj.layout.enumLiteral) {
+                case "Packed": {
+                  layout = "packed ";
+                  break;
+                }
+                case "Extern": {
+                  layout = "extern ";
+                  break;
+                }
+              }
+            }
             if (opts.wantHtml) {
-              name = "<span class='tok-kw'>union</span>";
+              name = "<span class='tok-kw'>" + layout + "union</span>";
             } else {
-              name = "union";
+              name = layout + "union";
             }
             if (unionObj.auto_tag) {
               if (opts.wantHtml) {
-                name += " (<span class='tok-kw'>enum</span>";
+                name += "(<span class='tok-kw'>enum</span>";
               } else {
-                name += " (enum";
+                name += "(enum";
               }
               if (unionObj.tag) {
                 name += "(" + exprName(unionObj.tag, opts) + "))";
@@ -1980,7 +2001,7 @@ const NAV_MODES = {
                 name += ")";
               }
             } else if (unionObj.tag) {
-              name += " (" + exprName(unionObj.tag, opts) + ")";
+              name += "(" + exprName(unionObj.tag, opts) + ")";
             }
             name += " { ";
             if (unionObj.field_types.length > 1 && opts.wantHtml) {
@@ -4499,6 +4520,7 @@ function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) {
           is_tuple: ty[8],
           line_number: ty[9],
           parent_container: ty[10],
+          layout: ty[11],
         };
       case 10: // ComptimeExpr
       case 11: // ComptimeFloat
@@ -4552,6 +4574,7 @@ function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) {
           tag: ty[6],
           auto_tag: ty[7],
           parent_container: ty[8],
+          layout: ty[9],
         };
       case 21: // Fn
         return {
src/Autodoc.zig
@@ -608,6 +608,7 @@ const DocData = struct {
             is_tuple: bool,
             line_number: usize,
             parent_container: ?usize, // index into `types`
+            layout: ?Expr, // if different than Auto
         },
         ComptimeExpr: struct { name: []const u8 },
         ComptimeFloat: struct { name: []const u8 },
@@ -645,6 +646,7 @@ const DocData = struct {
             tag: ?Expr, // tag type if specified
             auto_enum: bool, // tag is an auto enum
             parent_container: ?usize, // index into `types`
+            layout: ?Expr, // if different than Auto
         },
         Fn: struct {
             name: []const u8,
@@ -2613,6 +2615,11 @@ fn walkInstruction(
                         break :blk fields_len;
                     } else 0;
 
+                    const layout_expr: ?DocData.Expr = switch (small.layout) {
+                        .Auto => null,
+                        else => .{ .enumLiteral = @tagName(small.layout) },
+                    };
+
                     var decl_indexes: std.ArrayListUnmanaged(usize) = .{};
                     var priv_decl_indexes: std.ArrayListUnmanaged(usize) = .{};
 
@@ -2667,6 +2674,7 @@ fn walkInstruction(
                             .tag = tag_type,
                             .auto_enum = small.auto_enum_tag,
                             .parent_container = parent_scope.enclosing_type,
+                            .layout = layout_expr,
                         },
                     };
 
@@ -2877,6 +2885,11 @@ fn walkInstruction(
                         }
                     }
 
+                    const layout_expr: ?DocData.Expr = switch (small.layout) {
+                        .Auto => null,
+                        else => .{ .enumLiteral = @tagName(small.layout) },
+                    };
+
                     var decl_indexes: std.ArrayListUnmanaged(usize) = .{};
                     var priv_decl_indexes: std.ArrayListUnmanaged(usize) = .{};
 
@@ -2918,6 +2931,7 @@ fn walkInstruction(
                             .backing_int = backing_int,
                             .line_number = self.ast_nodes.items[self_ast_node_index].line,
                             .parent_container = parent_scope.enclosing_type,
+                            .layout = layout_expr,
                         },
                     };
                     if (self.ref_paths_pending_on_types.get(type_slot_index)) |paths| {