Commit 4250d27fe5

Timon Kruiper <timonkruiper@gmail.com>
2019-10-10 14:21:35
Generated docs: store static container info in a containerDecl astNode
And then get the struct field astNodes through the containerDecl astNode. The type of a struct field is still stored in the types array, but the static information is in the astNodes.
1 parent 12ed85d
Changed files (2)
lib
std
special
docs
src
lib/std/special/docs/main.js
@@ -776,14 +776,17 @@
 
         if (container.fields != null && container.fields.length !== 0) {
             resizeDomList(domListFields, container.fields.length, '<div></div>');
+
+            var containerNode = zigAnalysis.astNodes[container.src];
             for (var i = 0; i < container.fields.length; i += 1) {
-                var field = container.fields[i];
+                var fieldTypeIndex = container.fields[i];
+                var fieldNode = zigAnalysis.astNodes[containerNode.fields[i]];
                 var divDom = domListFields.children[i];
 
-                var html = '<pre>' + escapeHtml(field.name) + ": " +
-                    typeIndexName(field.type, true, true) + ',</pre>';
+                var html = '<pre>' + escapeHtml(fieldNode.name) + ": " +
+                    typeIndexName(fieldTypeIndex, true, true) + ',</pre>';
 
-                var docs = zigAnalysis.astNodes[field.src].docs;
+                var docs = fieldNode.docs;
                 if (docs != null) {
                     html += markdown(docs);
                 }
src/dump_analysis.cpp
@@ -732,23 +732,6 @@ static void anal_dump_pointer_attrs(AnalDumpCtx *ctx, ZigType *ty) {
     anal_dump_type_ref(ctx, ty->data.pointer.child_type);
 }
 
-static void anal_dump_struct_field(AnalDumpCtx *ctx, const TypeStructField *struct_field) {
-    JsonWriter *jw = &ctx->jw;
-
-    jw_begin_object(jw);
-
-    jw_object_field(jw, "name");
-    jw_string(jw, buf_ptr(struct_field->name));
-
-    jw_object_field(jw, "type");
-    anal_dump_type_ref(ctx, struct_field->type_entry);
-
-    jw_object_field(jw, "src");
-    anal_dump_node_ref(ctx, struct_field->decl_node);
-
-    jw_end_object(jw);
-}
-
 static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) {
     JsonWriter *jw = &ctx->jw;
     jw_array_elem(jw);
@@ -811,13 +794,16 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) {
                 jw_end_array(jw);
             }
 
+            jw_object_field(jw, "src");
+            anal_dump_node_ref(ctx, ty->data.structure.decl_node);
+
             if (ty->data.structure.src_field_count != 0) {
                 jw_object_field(jw, "fields");
                 jw_begin_array(jw);
 
                 for(size_t i = 0; i < ty->data.structure.src_field_count; i += 1) {
                     jw_array_elem(jw);
-                    anal_dump_struct_field(ctx, &ty->data.structure.fields[i]);
+                    anal_dump_type_ref(ctx, ty->data.structure.fields[i].type_entry);
                 }
                 jw_end_array(jw);
             }
@@ -827,7 +813,6 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) {
 
                 jw_object_field(jw, "file");
                 anal_dump_file_ref(ctx, path_buf);
-
             }
             break;
         }
@@ -974,6 +959,39 @@ static void anal_dump_node(AnalDumpCtx *ctx, const AstNode *node) {
         jw_string(jw, buf_ptr(doc_comments_buf));
     }
 
+    const Buf *name_buf;
+    switch (node->type) {
+        case NodeTypeStructField:
+            name_buf = node->data.struct_field.name;
+            break;
+        default:
+            name_buf = nullptr;
+            break;
+    }
+    if (name_buf != nullptr) {
+        jw_object_field(jw, "name");
+        jw_string(jw, buf_ptr(name_buf));
+    }
+
+    const ZigList<AstNode *> *fieldNodes;
+    switch (node->type) {
+        case NodeTypeContainerDecl:
+            fieldNodes = &node->data.container_decl.fields;
+            break;
+        default:
+            fieldNodes = nullptr;
+            break;
+    }
+    if (fieldNodes != nullptr) {
+        jw_object_field(jw, "fields");
+        jw_begin_array(jw);
+        for (size_t i = 0; i < fieldNodes->length; i += 1) {
+            jw_array_elem(jw);
+            anal_dump_node_ref(ctx, fieldNodes->at(i));
+        }
+        jw_end_array(jw);
+    }
+
     jw_end_object(jw);
 }