mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 04:48:20 +00:00
autodocs: added basic support for functions
This commit is contained in:
parent
5a31126d89
commit
b296f5ac02
@ -130,17 +130,17 @@
|
||||
return typeKind === typeKinds.ErrorSet || typeKindIsContainer(typeKind);
|
||||
}
|
||||
|
||||
function resolveDeclValue(decl) {
|
||||
function resolveValue(value) {
|
||||
var i = 0;
|
||||
while(i < 1000) {
|
||||
i += 1;
|
||||
|
||||
if ("declRef" in decl.value) {
|
||||
decl = zigAnalysis.decls[decl.value.declRef];
|
||||
if ("declRef" in value) {
|
||||
value = zigAnalysis.decls[value.declRef].value;
|
||||
continue;
|
||||
}
|
||||
|
||||
return decl.value;
|
||||
return value;
|
||||
|
||||
}
|
||||
console.assert(false);
|
||||
@ -249,8 +249,9 @@
|
||||
return render404();
|
||||
}
|
||||
|
||||
var childDeclValue = resolveDeclValue(childDecl);
|
||||
if ("type" in childDeclValue){
|
||||
var childDeclValue = resolveValue(childDecl.value);
|
||||
if ("type" in childDeclValue &&
|
||||
zigAnalysis.types[childDeclValue.type].kind !== typeKinds.Fn){
|
||||
if (i + 1 === curNav.declNames.length) {
|
||||
curNav.declObjs.push(zigAnalysis.types[childDeclValue.type]);
|
||||
break;
|
||||
@ -277,7 +278,7 @@
|
||||
} else if (lastIsDecl && last.kind === 'var') {
|
||||
return renderVar(last);
|
||||
} else if (lastIsDecl && last.kind === 'const' && !(declContainsType(last))) {
|
||||
var typeObj = zigAnalysis.types[resolveDeclValueTypeId(last)];
|
||||
var typeObj = zigAnalysis.types[resolveValue(last.value).type];
|
||||
if (typeObj.kind === typeKinds.Fn) {
|
||||
return renderFn(last);
|
||||
} else {
|
||||
@ -321,7 +322,11 @@
|
||||
}
|
||||
|
||||
function renderFn(fnDecl) {
|
||||
domFnProtoCode.innerHTML = typeIndexName(fnDecl.type, true, true, fnDecl);
|
||||
var value = resolveValue(fnDecl.value);
|
||||
console.assert("type" in value);
|
||||
var typeObj = zigAnalysis.types[value.type];
|
||||
|
||||
domFnProtoCode.innerHTML = typeIndexName(value.type, true, true, fnDecl);
|
||||
|
||||
var docsSource = null;
|
||||
var srcNode = zigAnalysis.astNodes[fnDecl.src];
|
||||
@ -329,26 +334,23 @@
|
||||
docsSource = srcNode.docs;
|
||||
}
|
||||
|
||||
var typeObj = zigAnalysis.types[fnDecl.type];
|
||||
var retIndex = resolveValue(typeObj.ret).type;
|
||||
renderFnParamDocs(fnDecl, typeObj);
|
||||
|
||||
var errSetTypeIndex = null;
|
||||
if (typeObj.ret != null) {
|
||||
var retType = zigAnalysis.types[typeObj.ret];
|
||||
if (retType.kind === typeKinds.ErrorSet) {
|
||||
errSetTypeIndex = typeObj.ret;
|
||||
} else if (retType.kind === typeKinds.ErrorUnion) {
|
||||
errSetTypeIndex = retType.err;
|
||||
}
|
||||
var retType = zigAnalysis.types[retIndex];
|
||||
if (retType.kind === typeKinds.ErrorSet) {
|
||||
errSetTypeIndex = retIndex;
|
||||
} else if (retType.kind === typeKinds.ErrorUnion) {
|
||||
errSetTypeIndex = retType.err;
|
||||
}
|
||||
if (errSetTypeIndex != null) {
|
||||
var errSetType = zigAnalysis.types[errSetTypeIndex];
|
||||
renderErrorSet(errSetType);
|
||||
}
|
||||
|
||||
var fnObj = zigAnalysis.fns[fnDecl.value];
|
||||
var protoSrcIndex = fnObj.src;
|
||||
if (typeIsGenericFn(fnDecl.type)) {
|
||||
var protoSrcIndex = fnDecl.src;
|
||||
if (typeIsGenericFn(value.type)) {
|
||||
var instantiations = nodesToFnsMap[protoSrcIndex];
|
||||
var calls = nodesToCallsMap[protoSrcIndex];
|
||||
if (instantiations == null && calls == null) {
|
||||
@ -388,8 +390,7 @@
|
||||
function renderFnParamDocs(fnDecl, typeObj) {
|
||||
var docCount = 0;
|
||||
|
||||
var fnObj = zigAnalysis.fns[fnDecl.value];
|
||||
var fnNode = zigAnalysis.astNodes[fnObj.src];
|
||||
var fnNode = zigAnalysis.astNodes[fnDecl.src];
|
||||
var fields = fnNode.fields;
|
||||
var isVarArgs = fnNode.varArgs;
|
||||
|
||||
@ -415,10 +416,11 @@
|
||||
}
|
||||
var divDom = domListParams.children[domIndex];
|
||||
domIndex += 1;
|
||||
var argTypeIndex = typeObj.args[i];
|
||||
|
||||
var value = resolveValue(typeObj.params[i]);
|
||||
console.assert("type" in value);
|
||||
var argTypeIndex = value.type;
|
||||
var html = '<pre>' + escapeHtml(fieldNode.name) + ": ";
|
||||
if (isVarArgs && i === typeObj.args.length - 1) {
|
||||
if (isVarArgs && i === typeObj.params.length - 1) {
|
||||
html += '...';
|
||||
} else if (argTypeIndex != null) {
|
||||
html += typeIndexName(argTypeIndex, true, true);
|
||||
@ -741,11 +743,7 @@
|
||||
return "f" + typeObj.bits;
|
||||
}
|
||||
case typeKinds.Int:
|
||||
var signed = (typeObj.i != null) ? 'i' : 'u';
|
||||
var bits = typeObj[signed] || typeObj.name;
|
||||
|
||||
var name = typeObj.name ? typeObj.name : signed + bits;
|
||||
|
||||
var name = typeObj.name;
|
||||
if (wantHtml) {
|
||||
return '<span class="tok-type">' + name + '</span>';
|
||||
} else {
|
||||
@ -834,22 +832,21 @@
|
||||
payloadHtml += 'fn'
|
||||
}
|
||||
payloadHtml += '(';
|
||||
if (typeObj.args != null) {
|
||||
if (typeObj.params) {
|
||||
var fields = null;
|
||||
var isVarArgs = false;
|
||||
if (fnDecl != null) {
|
||||
var fnObj = zigAnalysis.fns[fnDecl.value];
|
||||
var fnNode = zigAnalysis.astNodes[fnObj.src];
|
||||
fields = fnNode.fields;
|
||||
isVarArgs = fnNode.varArgs;
|
||||
}
|
||||
var fnNode = zigAnalysis.astNodes[fnDecl.src];
|
||||
fields = fnNode.fields;
|
||||
isVarArgs = fnNode.varArgs;
|
||||
|
||||
for (var i = 0; i < typeObj.args.length; i += 1) {
|
||||
for (var i = 0; i < typeObj.params.length; i += 1) {
|
||||
if (i != 0) {
|
||||
payloadHtml += ', ';
|
||||
}
|
||||
|
||||
var argTypeIndex = typeObj.args[i];
|
||||
var paramValue = resolveValue(typeObj.params[i]);
|
||||
console.assert("type" in paramValue);
|
||||
var argTypeIndex = paramValue.type;
|
||||
|
||||
if (fields != null) {
|
||||
var paramNode = zigAnalysis.astNodes[fields[i]];
|
||||
@ -896,13 +893,17 @@
|
||||
}
|
||||
}
|
||||
|
||||
var retValue = resolveValue(typeObj.ret);
|
||||
console.assert("type" in retValue);
|
||||
var retTypeIndex = retValue.type;
|
||||
|
||||
payloadHtml += ') ';
|
||||
if (typeObj.ret != null) {
|
||||
payloadHtml += typeIndexName(typeObj.ret, wantHtml, wantSubLink, fnDecl);
|
||||
if (retTypeIndex != null) {
|
||||
payloadHtml += typeIndexName(retTypeIndex, wantHtml, wantSubLink, fnDecl);
|
||||
} else if (wantHtml) {
|
||||
payloadHtml += '<span class="tok-kw">var</span>';
|
||||
payloadHtml += '<span class="tok-kw">anytype</span>';
|
||||
} else {
|
||||
payloadHtml += 'var';
|
||||
payloadHtml += 'anytype';
|
||||
}
|
||||
return payloadHtml;
|
||||
default:
|
||||
@ -1233,7 +1234,7 @@
|
||||
html += '<span class="tok-kw" style="color:red;">#FAILURE#</span>';
|
||||
} else if ("declRef" in field) {
|
||||
var decl = zigAnalysis.decls[field.declRef];
|
||||
var val = resolveDeclValue(decl);
|
||||
var val = resolveValue(decl.value);
|
||||
console.assert("type" in val);
|
||||
var valType = zigAnalysis.types[val.type];
|
||||
|
||||
|
||||
@ -560,6 +560,13 @@ fn walkInstruction(
|
||||
});
|
||||
return DocData.WalkResult{ .type = self.types.items.len - 1 };
|
||||
},
|
||||
//.block => {
|
||||
//const pl_node = data[inst_index].pl_node;
|
||||
//const extra = zir.extraData(Zir.Inst.Block, pl_node.payload_index);
|
||||
//const last_instr_index = zir.extra[extra.end..][extra.data.body_len - 1];
|
||||
//const break_operand = data[break_index].@"break".operand;
|
||||
//return self.walkRef(zir, parent_scope, break_operand);
|
||||
//},
|
||||
.block_inline => {
|
||||
const pl_node = data[inst_index].pl_node;
|
||||
const extra = zir.extraData(Zir.Inst.Block, pl_node.payload_index);
|
||||
@ -585,29 +592,41 @@ fn walkInstruction(
|
||||
if (tags[param_index] != .param) unreachable; // TODO: handle more param types
|
||||
const pl_tok = data[param_index].pl_tok;
|
||||
const extra = zir.extraData(Zir.Inst.Param, pl_tok.payload_index);
|
||||
const doc_comment = if (extra.data.doc_comment != 0)
|
||||
zir.nullTerminatedString(extra.data.doc_comment)
|
||||
else
|
||||
"";
|
||||
|
||||
param_ast_indexes.appendAssumeCapacity(self.ast_nodes.items.len);
|
||||
try self.ast_nodes.append(self.arena, .{
|
||||
.name = zir.nullTerminatedString(zir.extra[extra.data.name]),
|
||||
.docs = "",
|
||||
.name = zir.nullTerminatedString(extra.data.name),
|
||||
.docs = doc_comment,
|
||||
});
|
||||
|
||||
const break_index = zir.extra[extra.end..][extra.data.body_len - 1];
|
||||
const break_operand = data[break_index].@"break".operand;
|
||||
const walk_res = try self.walkRef(zir, parent_scope, break_operand);
|
||||
const param_type_ref = try self.walkRef(zir, parent_scope, break_operand);
|
||||
|
||||
param_type_refs.appendAssumeCapacity(
|
||||
DocData.TypeRef.fromWalkResult(walk_res),
|
||||
DocData.TypeRef.fromWalkResult(param_type_ref),
|
||||
);
|
||||
}
|
||||
|
||||
// ret
|
||||
const ret_type_ref = blk: {
|
||||
const last_instr_index = fn_info.ret_ty_body[fn_info.ret_ty_body.len - 1];
|
||||
const break_operand = data[last_instr_index].@"break".operand;
|
||||
const wr = try self.walkRef(zir, parent_scope, break_operand);
|
||||
break :blk DocData.TypeRef.fromWalkResult(wr);
|
||||
};
|
||||
|
||||
self.ast_nodes.items[self_ast_node_index].fields = param_ast_indexes.items;
|
||||
try self.types.append(self.arena, .{
|
||||
.Fn = .{
|
||||
.name = "todo_name func",
|
||||
.src = self_ast_node_index,
|
||||
.params = param_type_refs.items,
|
||||
.ret = .{ .type = @enumToInt(Ref.void_type) },
|
||||
.ret = ret_type_ref,
|
||||
},
|
||||
});
|
||||
return DocData.WalkResult{ .type = self.types.items.len - 1 };
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user