Skip to content

Commit a506269

Browse files
committed
expose parent of struct in analysis dump and use it to link from FnFrame
1 parent d7ecc1d commit a506269

File tree

2 files changed

+61
-13
lines changed

2 files changed

+61
-13
lines changed

lib/std/special/docs/main.js

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,20 @@
458458
return navLink(canonPkgPaths[pkgIndex], []);
459459
}
460460

461-
function navLinkDecl(childName) {
461+
function navLinkDecl(declObj) {
462+
if (declObj.container) {
463+
var declNames = [declObj.name];
464+
var container = zigAnalysis.types[declObj.container];
465+
while (container && container.name !== '(root)') {
466+
var names = container.name.split('.');
467+
declNames.unshift(names[names.length - 1]);
468+
container = zigAnalysis[container.parent];
469+
}
470+
471+
return navLink(curNav.pkgNames, declNames);
472+
}
473+
474+
// hope local lookup is correct
462475
return navLink(curNav.pkgNames, curNav.declNames.concat([childName]));
463476
}
464477

@@ -730,19 +743,19 @@
730743
var name = '@Frame(';
731744
var fnObj = zigAnalysis.fns[typeObj.fn];
732745
var declObj = fnObj.decl && zigAnalysis.decls[fnObj.decl];
733-
var fn_name = declObj ? declObj.name : typeObj.fn_name;
746+
var fnName = declObj ? declObj.name : typeObj.name;
734747
if (wantHtml) {
735748
name += '<span class="tok-fn">';
736749
if (declObj) {
737750
// TODO look up decl package and import path
738-
name += '<a href="' + navLinkDecl(declObj.name) + '">'
739-
+ escapeHtml(fn_name) + '</a>';
751+
name += '<a href="' + navLinkDecl(declObj) + '">'
752+
+ escapeHtml(fnName) + '</a>';
740753
} else {
741-
name += escapeHtml(fn_name);
754+
name += escapeHtml(fnName);
742755
}
743756
name += '</span>';
744757
} else {
745-
name += fn_name;
758+
name += fnName;
746759
}
747760
name += ')';
748761
return name;
@@ -994,7 +1007,7 @@
9941007
var aDom = liDom.children[0];
9951008
var decl = typesList[i];
9961009
aDom.textContent = decl.name;
997-
aDom.setAttribute('href', navLinkDecl(decl.name));
1010+
aDom.setAttribute('href', navLinkDecl(decl));
9981011
}
9991012
domListTypes.innerHTML = "";
10001013
domListTypes.appendChild(domListTypesFragment);
@@ -1007,7 +1020,7 @@
10071020
var aDom = liDom.children[0];
10081021
var decl = namespacesList[i];
10091022
aDom.textContent = decl.name;
1010-
aDom.setAttribute('href', navLinkDecl(decl.name));
1023+
aDom.setAttribute('href', navLinkDecl(decl));
10111024
}
10121025
domListNamespaces.innerHTML = "";
10131026
domListNamespaces.appendChild(domListNamespacesFragment);
@@ -1021,7 +1034,7 @@
10211034
var aDom = liDom.children[0];
10221035
var decl = errSetsList[i];
10231036
aDom.textContent = decl.name;
1024-
aDom.setAttribute('href', navLinkDecl(decl.name));
1037+
aDom.setAttribute('href', navLinkDecl(decl));
10251038
}
10261039
domListErrSets.innerHTML = "";
10271040
domListErrSets.appendChild(domListErrSetsFragment);
@@ -1037,7 +1050,7 @@
10371050
var tdFnCode = trDom.children[0];
10381051
var tdDesc = trDom.children[1];
10391052

1040-
tdFnCode.innerHTML = typeIndexName(decl.type, true, true, decl, navLinkDecl(decl.name));
1053+
tdFnCode.innerHTML = typeIndexName(decl.type, true, true, decl, navLinkDecl(decl));
10411054

10421055
var docs = zigAnalysis.astNodes[decl.src].docs;
10431056
if (docs != null) {
@@ -1098,7 +1111,7 @@
10981111
var tdType = trDom.children[1];
10991112
var tdDesc = trDom.children[2];
11001113

1101-
tdNameA.setAttribute('href', navLinkDecl(decl.name));
1114+
tdNameA.setAttribute('href', navLinkDecl(decl));
11021115
tdNameA.textContent = decl.name;
11031116

11041117
tdType.innerHTML = typeIndexName(decl.type, true, true);
@@ -1127,7 +1140,7 @@
11271140
var tdType = trDom.children[1];
11281141
var tdDesc = trDom.children[2];
11291142

1130-
tdNameA.setAttribute('href', navLinkDecl(decl.name));
1143+
tdNameA.setAttribute('href', navLinkDecl(decl));
11311144
tdNameA.textContent = decl.name;
11321145

11331146
tdType.innerHTML = typeIndexName(decl.type, true, true);

src/stage1/dump_analysis.cpp

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,22 @@ static void anal_dump_decl(AnalDumpCtx *ctx, Tld *tld) {
602602

603603
jw_object_field(jw, "name");
604604
jw_string(jw, buf_ptr(tld->name));
605+
606+
Scope* scope = tld->parent_scope;
607+
while (scope != nullptr) {
608+
if (scope->id == ScopeIdDecls) {
609+
ScopeDecls *parent_scope = reinterpret_cast<ScopeDecls *>(scope);
610+
611+
if (parent_scope->container_type) {
612+
jw_object_field(jw, "container");
613+
anal_dump_type_ref(ctx, parent_scope->container_type);
614+
}
615+
616+
break;
617+
}
618+
619+
scope = scope->parent;
620+
}
605621
}
606622

607623
switch (tld->id) {
@@ -828,6 +844,25 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) {
828844
jw_object_field(jw, "file");
829845
anal_dump_file_ref(ctx, path_buf);
830846
}
847+
848+
{
849+
Scope* scope = ty->data.structure.decls_scope->base.parent;
850+
while (scope != nullptr) {
851+
if (scope->id == ScopeIdDecls) {
852+
ScopeDecls *parent_scope = reinterpret_cast<ScopeDecls *>(scope);
853+
854+
if (parent_scope->container_type) {
855+
jw_object_field(jw, "parent");
856+
anal_dump_type_ref(ctx, parent_scope->container_type);
857+
}
858+
859+
break;
860+
}
861+
862+
scope = scope->parent;
863+
}
864+
}
865+
831866
break;
832867
}
833868
case ZigTypeIdUnion: {
@@ -1064,7 +1099,7 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) {
10641099
break;
10651100
}
10661101
case ZigTypeIdFnFrame: {
1067-
jw_object_field(jw, "fn_name");
1102+
jw_object_field(jw, "name");
10681103
jw_string(jw, buf_ptr(&ty->data.frame.fn->symbol_name));
10691104

10701105
jw_object_field(jw, "fn");

0 commit comments

Comments
 (0)