Skip to content

Commit

Permalink
first stab at generics
Browse files Browse the repository at this point in the history
  • Loading branch information
StuartHarris committed May 31, 2024
1 parent 83517b3 commit 73df161
Showing 1 changed file with 63 additions and 17 deletions.
80 changes: 63 additions & 17 deletions crux_cli/src/codegen.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
use anyhow::{bail, Result};
use rustdoc_types::{Crate, Id, Impl, ItemEnum, Path, StructKind, Type, VariantKind};
use rustdoc_types::{
Crate, GenericArg, GenericArgs, Id, Impl, ItemEnum, Path, StructKind, Type, VariantKind,
};
use std::{
fs::File,
io::{stdout, IsTerminal},
Expand Down Expand Up @@ -51,7 +53,7 @@ pub async fn codegen(args: &CodegenArgs) -> Result<()> {
);

for (name, id) in associated_items {
visit(0, name, id, &crate_)?;
visit_item(0, name, id, &crate_)?;
}
}
println!();
Expand All @@ -62,16 +64,14 @@ pub async fn codegen(args: &CodegenArgs) -> Result<()> {
);

for (name, id) in associated_items {
visit(0, name, id, &crate_)?;
visit_item(0, name, id, &crate_)?;
}
}

Ok(())
}

fn visit(level: usize, name: &str, id: &Id, crate_: &Crate) -> Result<()> {
let item = crate_.index.get(id);

fn visit_item(level: usize, name: &str, id: &Id, crate_: &Crate) -> Result<()> {
print!(
"\n{level} {id:18} {} {name:20} ",
" ".repeat(level * 4),
Expand All @@ -83,7 +83,7 @@ fn visit(level: usize, name: &str, id: &Id, crate_: &Crate) -> Result<()> {
print!("{path_str}");
}

if let Some(item) = item {
if let Some(item) = crate_.index.get(id) {
match &item.inner {
ItemEnum::Struct(ref struct_) => match &struct_.kind {
StructKind::Unit => {
Expand All @@ -102,7 +102,7 @@ fn visit(level: usize, name: &str, id: &Id, crate_: &Crate) -> Result<()> {
for id in fields {
let item = &crate_.index[id];
if let Some(name) = &item.name {
visit(level + 1, name, id, crate_)?;
visit_item(level + 1, name, id, crate_)?;
}
}
}
Expand All @@ -111,15 +111,12 @@ fn visit(level: usize, name: &str, id: &Id, crate_: &Crate) -> Result<()> {
for id in &enum_.variants {
let item = &crate_.index[id];
if let Some(name) = &item.name {
visit(level + 1, name, id, crate_)?;
visit_item(level + 1, name, id, crate_)?;
}
}
}
ItemEnum::StructField(Type::ResolvedPath(path)) => {
visit(level, name, &path.id, crate_)?;
}
ItemEnum::StructField(Type::Primitive(name)) => {
print!("{name}");
ItemEnum::StructField(ty) => {
visit_type(level, "", ty, crate_)?;
}
ItemEnum::Module(_) => (),
ItemEnum::ExternCrate { .. } => (),
Expand All @@ -132,7 +129,7 @@ fn visit(level: usize, name: &str, id: &Id, crate_: &Crate) -> Result<()> {
let Some(id) = id else { continue };
let item = &crate_.index[id];
if let Some(name) = &item.name {
visit(level + 1, name, id, crate_)?;
visit_item(level + 1, name, id, crate_)?;
}
}
}
Expand All @@ -146,7 +143,7 @@ fn visit(level: usize, name: &str, id: &Id, crate_: &Crate) -> Result<()> {
for id in fields {
let item = &crate_.index[id];
if let Some(name) = &item.name {
visit(level + 1, name, id, crate_)?;
visit_item(level + 1, name, id, crate_)?;
}
}
}
Expand All @@ -165,12 +162,61 @@ fn visit(level: usize, name: &str, id: &Id, crate_: &Crate) -> Result<()> {
ItemEnum::Primitive(_) => (),
ItemEnum::AssocConst { .. } => (),
ItemEnum::AssocType { .. } => (),
_ => (),
}
}
Ok(())
}

fn visit_type(level: usize, name: &str, ty: &Type, crate_: &Crate) -> Result<()> {
match ty {
Type::ResolvedPath(path) => {
visit_item(level + 1, name, &path.id, crate_)?;
if let Some(args) = &path.args {
match args.as_ref() {
GenericArgs::AngleBracketed { args, bindings: _ } => {
for (i, arg) in args.iter().enumerate() {
match arg {
GenericArg::Lifetime(_) => todo!(),
GenericArg::Type(ty) => {
print!(" ");
visit_type(level, &i.to_string(), ty, crate_)?;
}
GenericArg::Const(_) => todo!(),
GenericArg::Infer => todo!(),
}
}
}
GenericArgs::Parenthesized { .. } => (),
}
}
}
Type::DynTrait(_) => (),
Type::Generic(s) => print!("{s}"),
Type::Primitive(name) => {
print!("{name}");
}
Type::FunctionPointer(_) => (),
Type::Tuple(types) => {
for (i, ty) in types.iter().enumerate() {
visit_type(level, &i.to_string(), ty, crate_)?;
}
}
Type::Slice(_) => (),
Type::Array { type_: _, len: _ } => (),
Type::ImplTrait(_) => (),
Type::Infer => (),
Type::RawPointer { .. } => (),
Type::BorrowedRef { .. } => (),
Type::QualifiedPath {
name: _,
args: _,
self_type: _,
trait_: _,
} => (),
}
Ok(())
}

fn find_impls<'a>(
crate_: &'a Crate,
trait_name: &'a str,
Expand Down

0 comments on commit 73df161

Please sign in to comment.