Commit 6d54e8fc3c

Andrew Kelley <andrew@ziglang.org>
2019-10-10 00:08:11
generated docs: render values
also fix pressing enter in search box before search finishes closes #3409
1 parent 13ae7d4
Changed files (3)
lib
std
lib/std/special/docs/index.html
@@ -156,7 +156,7 @@
         font-weight: bold;
       }
 
-      #sectGlobalVars td, #sectFns td, #sectFields td {
+      td {
         vertical-align: top;
         margin: 0;
         padding: 0.5em;
@@ -338,6 +338,13 @@
         </tbody>
       </table>
     </div>
+    <div id="sectValues" class="hidden">
+      <h2>Values</h2>
+      <table>
+        <tbody id="listValues">
+        </tbody>
+      </table>
+    </div>
     <div id="sectErrSets" class="hidden">
       <h2>Error Sets</h2>
       <ul id="listErrSets">
lib/std/special/docs/main.js
@@ -16,6 +16,8 @@
     var domListFields = document.getElementById("listFields");
     var domSectGlobalVars = document.getElementById("sectGlobalVars");
     var domListGlobalVars = document.getElementById("listGlobalVars");
+    var domSectValues = document.getElementById("sectValues");
+    var domListValues = document.getElementById("listValues");
     var domFnProto = document.getElementById("fnProto");
     var domFnProtoCode = document.getElementById("fnProtoCode");
     var domFnDocs = document.getElementById("fnDocs");
@@ -63,6 +65,7 @@
     };
     var curNavSearch = "";
     var curSearchIndex = -1;
+    var imFeelingLucky = false;
 
     var rootIsStd = detectRootIsStd();
 
@@ -111,6 +114,7 @@
         domFnErrorsAnyError.classList.add("hidden");
         domTableFnErrors.classList.add("hidden");
         domSectGlobalVars.classList.add("hidden");
+        domSectValues.classList.add("hidden");
 
         renderTitle();
         renderInfo();
@@ -157,13 +161,13 @@
         var lastDecl = curNav.declObjs[curNav.declObjs.length - 1];
         if (lastDecl.kind === 'var') {
             return renderVar(lastDecl);
-        }
-        if (lastDecl.type != null) {
+        } else if (lastDecl.kind === 'const' && lastDecl.type != null) {
             var typeObj = zigAnalysis.types[lastDecl.type];
             if (typeObj.kind === typeKinds.Fn) {
                 return renderFn(lastDecl);
+            } else {
+                return renderValue(lastDecl);
             }
-            throw new Error("docs for this decl which is not a container");
         }
         if (lastDecl.kind != null) {
             renderType(lastDecl);
@@ -208,7 +212,7 @@
             var retType = zigAnalysis.types[typeObj.ret];
             if (retType.kind === typeKinds.ErrorSet) {
                 errSetTypeIndex = typeObj.ret;
-            } else if (retType.kind === typeKinds.Union) {
+            } else if (retType.kind === typeKinds.ErrorUnion) {
                 errSetTypeIndex = retType.err;
             }
         }
@@ -515,7 +519,7 @@
                         return typeObj.name;
                     }
                 }
-            case typeKinds.Union:
+            case typeKinds.ErrorUnion:
                 var errSetTypeObj = zigAnalysis.types[typeObj.err];
                 var payloadHtml = typeIndexName(typeObj.payload, wantHtml, wantSubLink, null);
                 if (fnDecl != null && errSetTypeObj.fn === fnDecl.value) {
@@ -625,6 +629,19 @@
         return true;
     }
 
+    function renderValue(decl) {
+        domFnProtoCode.innerHTML = '<span class="tok-kw">pub</span> <span class="tok-kw">const</span> ' +
+            escapeHtml(decl.name) + ': ' + typeIndexName(decl.type, true, true);
+
+        var docs = zigAnalysis.astNodes[decl.src].docs;
+        if (docs != null) {
+            domFnDocs.innerHTML = markdown(docs);
+            domFnDocs.classList.remove("hidden");
+        }
+
+        domFnProto.classList.remove("hidden");
+    }
+
     function renderVar(decl) {
         domFnProtoCode.innerHTML = '<span class="tok-kw">pub</span> <span class="tok-kw">var</span> ' +
             escapeHtml(decl.name) + ': ' + typeIndexName(decl.type, true, true);
@@ -644,13 +661,13 @@
         var errSetsList = [];
         var fnsList = [];
         var varsList = [];
+        var valsList = [];
         for (var i = 0; i < container.pubDecls.length; i += 1) {
             var decl = zigAnalysis.decls[container.pubDecls[i]];
             if (decl.kind === 'var') {
                 varsList.push(decl);
                 continue;
-            }
-            if (decl.type != null) {
+            } else if (decl.kind === 'const' && decl.type != null) {
                 if (decl.type == typeTypeId) {
                     if (typeIsErrSet(decl.value)) {
                         errSetsList.push(decl);
@@ -667,25 +684,18 @@
                         } else {
                             fnsList.push(decl);
                         }
+                    } else {
+                        valsList.push(decl);
                     }
                 }
             }
         }
-        typesList.sort(function(a, b) {
-            return operatorCompare(a.name, b.name);
-        });
-        namespacesList.sort(function(a, b) {
-            return operatorCompare(a.name, b.name);
-        });
-        errSetsList.sort(function(a, b) {
-            return operatorCompare(a.name, b.name);
-        });
-        fnsList.sort(function(a, b) {
-            return operatorCompare(a.name, b.name);
-        });
-        varsList.sort(function(a, b) {
-            return operatorCompare(a.name, b.name);
-        });
+        typesList.sort(byNameProperty);
+        namespacesList.sort(byNameProperty);
+        errSetsList.sort(byNameProperty);
+        fnsList.sort(byNameProperty);
+        varsList.sort(byNameProperty);
+        valsList.sort(byNameProperty);
 
         if (typesList.length !== 0) {
             resizeDomList(domListTypes, typesList.length, '<li><a href="#"></a></li>');
@@ -793,6 +803,33 @@
             }
             domSectGlobalVars.classList.remove("hidden");
         }
+
+        if (valsList.length !== 0) {
+            resizeDomList(domListValues, valsList.length,
+                '<tr><td><a href="#"></a></td><td></td><td></td></tr>');
+            for (var i = 0; i < valsList.length; i += 1) {
+                var decl = valsList[i];
+                var trDom = domListValues.children[i];
+
+                var tdName = trDom.children[0];
+                var tdNameA = tdName.children[0];
+                var tdType = trDom.children[1];
+                var tdDesc = trDom.children[2];
+
+                tdNameA.setAttribute('href', navLinkDecl(decl.name));
+                tdNameA.textContent = decl.name;
+
+                tdType.innerHTML = typeIndexName(decl.type, true, true);
+
+                var docs = zigAnalysis.astNodes[decl.src].docs;
+                if (docs != null) {
+                    tdDesc.innerHTML = shortDescMarkdown(docs);
+                } else {
+                    tdDesc.textContent = "";
+                }
+            }
+            domSectValues.classList.remove("hidden");
+        }
     }
 
     function operatorCompare(a, b) {
@@ -840,7 +877,7 @@
         throw new Error("No type 'type' found");
     }
 
-    function onHashChange() {
+    function updateCurNav() {
         curNav = {
             pkgNames: [],
             pkgObjs: [],
@@ -865,10 +902,18 @@
                 curNav.declNames = decodeURIComponent(parts[1]).split(".");
             }
         }
+    }
+
+    function onHashChange() {
+        updateCurNav();
         if (domSearch.value !== curNavSearch) {
             domSearch.value = curNavSearch;
         }
         render();
+        if (imFeelingLucky) {
+            imFeelingLucky = false;
+            activateSelectedResult();
+        }
     }
 
     function findSubDecl(parentType, childName) {
@@ -999,21 +1044,38 @@
         return escapeHtml(mdText);
     }
 
+    function activateSelectedResult() {
+        if (domSectSearchResults.classList.contains("hidden")) {
+            return;
+        }
+
+        var liDom = domListSearchResults.children[curSearchIndex];
+        if (liDom == null && domListSearchResults.children.length !== 0) {
+            liDom = domListSearchResults.children[0];
+        }
+        if (liDom != null) {
+            var aDom = liDom.children[0];
+            location.href = aDom.getAttribute("href");
+            curSearchIndex = -1;
+        }
+        domSearch.blur();
+    }
+
     function onSearchKeyDown(ev) {
         switch (ev.which) {
             case 13:
-                var liDom = domListSearchResults.children[curSearchIndex];
-                if (liDom == null && domListSearchResults.children.length !== 0) {
-                    liDom = domListSearchResults.children[0];
-                }
-                if (liDom != null) {
-                    var aDom = liDom.children[0];
-                    location.href = aDom.getAttribute("href");
-                    curSearchIndex = -1;
-                    ev.preventDefault();
-                    ev.stopPropagation();
-                    return;
-                }
+                // detect if this search changes anything
+                var terms1 = getSearchTerms();
+                startSearch();
+                updateCurNav();
+                var terms2 = getSearchTerms();
+                // we might have to wait for onHashChange to trigger
+                imFeelingLucky = (terms1.join(' ') !== terms2.join(' '));
+                if (!imFeelingLucky) activateSelectedResult();
+
+                ev.preventDefault();
+                ev.stopPropagation();
+                return;
             case 27:
                 domSearch.value = "";
                 domSearch.blur();
@@ -1036,6 +1098,7 @@
                 curSearchIndex = -1;
                 ev.stopPropagation();
                 startAsyncSearch();
+                return;
         }
     }
 
@@ -1090,7 +1153,10 @@
     }
 
     function clearAsyncSearch() {
-        if (searchTimer != null) clearTimeout(searchTimer);
+        if (searchTimer != null) {
+            clearTimeout(searchTimer);
+            searchTimer = null;
+        }
     }
 
     function startAsyncSearch() {
@@ -1098,18 +1164,21 @@
         searchTimer = setTimeout(startSearch, 100);
     }
     function startSearch() {
-        var parts = location.hash.split("?");
+        clearAsyncSearch();
+        var oldHash = location.hash;
+        var parts = oldHash.split("?");
         var newPart2 = (domSearch.value === "") ? "" : ("?" + domSearch.value);
-        if (parts.length === 1) {
-            location.hash = location.hash + newPart2;
-        } else {
-            location.hash = parts[0] + newPart2;
-        }
+        location.hash = (parts.length === 1) ? (oldHash + newPart2) : (parts[0] + newPart2);
+    }
+    function getSearchTerms() {
+        var list = curNavSearch.trim().split(/[ \r\n\t]+/);
+        list.sort();
+        return list;
     }
     function renderSearch() {
         var matchedItems = [];
         var ignoreCase = (curNavSearch.toLowerCase() === curNavSearch);
-        var terms = curNavSearch.split(/[ \r\n\t]+/);
+        var terms = getSearchTerms();
 
         decl_loop: for (var declIndex = 0; declIndex < zigAnalysis.decls.length; declIndex += 1) {
             var canonPath = getCanonDeclPath(declIndex);
@@ -1226,4 +1295,8 @@
         }
         return map;
     }
+
+    function byNameProperty(a, b) {
+        return operatorCompare(a.name, b.name);
+    }
 })();
lib/std/math.zig
@@ -4,7 +4,10 @@ const TypeId = builtin.TypeId;
 const assert = std.debug.assert;
 const testing = std.testing;
 
+/// Euler's number (e)
 pub const e = 2.71828182845904523536028747135266249775724709369995;
+
+/// Archimedes' constant (π)
 pub const pi = 3.14159265358979323846264338327950288419716939937510;
 
 // From a small c++ [program using boost float128](https://github.com/winksaville/cpp_boost_float128)