Fixes #851: Document instructions' input operands in InstBuilder;
This commit is contained in:
@@ -895,11 +895,18 @@ fn gen_inst_builder(inst: &Instruction, format: &InstructionFormat, fmt: &mut Fo
|
|||||||
}
|
}
|
||||||
.to_string()];
|
.to_string()];
|
||||||
|
|
||||||
|
let mut args_doc = Vec::new();
|
||||||
|
let mut rets_doc = Vec::new();
|
||||||
|
|
||||||
// The controlling type variable will be inferred from the input values if
|
// The controlling type variable will be inferred from the input values if
|
||||||
// possible. Otherwise, it is the first method argument.
|
// possible. Otherwise, it is the first method argument.
|
||||||
if let Some(poly) = &inst.polymorphic_info {
|
if let Some(poly) = &inst.polymorphic_info {
|
||||||
if !poly.use_typevar_operand {
|
if !poly.use_typevar_operand {
|
||||||
args.push(format!("{}: crate::ir::Type", poly.ctrl_typevar.name));
|
args.push(format!("{}: crate::ir::Type", poly.ctrl_typevar.name));
|
||||||
|
args_doc.push(format!(
|
||||||
|
"- {} (controlling type variable): {}",
|
||||||
|
poly.ctrl_typevar.name, poly.ctrl_typevar.doc
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -915,6 +922,23 @@ fn gen_inst_builder(inst: &Instruction, format: &InstructionFormat, fmt: &mut Fo
|
|||||||
op.kind.rust_type.clone()
|
op.kind.rust_type.clone()
|
||||||
};
|
};
|
||||||
args.push(format!("{}: {}", op.name, t));
|
args.push(format!("{}: {}", op.name, t));
|
||||||
|
args_doc.push(format!(
|
||||||
|
"- {}: {}",
|
||||||
|
op.name,
|
||||||
|
op.doc
|
||||||
|
.as_ref()
|
||||||
|
.expect("every instruction's input operand must be documented")
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
for op in &inst.operands_out {
|
||||||
|
rets_doc.push(format!(
|
||||||
|
"- {}: {}",
|
||||||
|
op.name,
|
||||||
|
op.doc
|
||||||
|
.as_ref()
|
||||||
|
.expect("every instruction's output operand must be documented")
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
let rtype = match inst.value_results.len() {
|
let rtype = match inst.value_results.len() {
|
||||||
@@ -938,6 +962,23 @@ fn gen_inst_builder(inst: &Instruction, format: &InstructionFormat, fmt: &mut Fo
|
|||||||
);
|
);
|
||||||
|
|
||||||
fmt.doc_comment(&inst.doc);
|
fmt.doc_comment(&inst.doc);
|
||||||
|
if !args_doc.is_empty() {
|
||||||
|
fmt.line("///");
|
||||||
|
fmt.doc_comment("Inputs:");
|
||||||
|
fmt.line("///");
|
||||||
|
for doc_line in args_doc {
|
||||||
|
fmt.doc_comment(doc_line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !rets_doc.is_empty() {
|
||||||
|
fmt.line("///");
|
||||||
|
fmt.doc_comment("Outputs:");
|
||||||
|
fmt.line("///");
|
||||||
|
for doc_line in rets_doc {
|
||||||
|
fmt.doc_comment(doc_line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fmt.line("#[allow(non_snake_case)]");
|
fmt.line("#[allow(non_snake_case)]");
|
||||||
fmtln!(fmt, "fn {} {{", proto);
|
fmtln!(fmt, "fn {} {{", proto);
|
||||||
fmt.indent(|fmt| {
|
fmt.indent(|fmt| {
|
||||||
@@ -1058,9 +1099,13 @@ fn gen_builder(
|
|||||||
fmt.indent(|fmt| {
|
fmt.indent(|fmt| {
|
||||||
for inst in instructions.values() {
|
for inst in instructions.values() {
|
||||||
gen_inst_builder(inst, &*inst.format, fmt);
|
gen_inst_builder(inst, &*inst.format, fmt);
|
||||||
|
fmt.empty_line();
|
||||||
}
|
}
|
||||||
for format in formats {
|
for (i, format) in formats.iter().enumerate() {
|
||||||
gen_format_constructor(format, fmt);
|
gen_format_constructor(format, fmt);
|
||||||
|
if i + 1 != formats.len() {
|
||||||
|
fmt.empty_line();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
fmt.line("}");
|
fmt.line("}");
|
||||||
|
|||||||
Reference in New Issue
Block a user