Skip to content

Commit

Permalink
simplified error handling in resolver
Browse files Browse the repository at this point in the history
  • Loading branch information
timbod7 committed Dec 8, 2022
1 parent dcc79e1 commit a703089
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 27 deletions.
2 changes: 1 addition & 1 deletion rust/compiler/src/processing/checks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::collections::HashMap;
use crate::adlgen::sys::adlast2 as adlast;
use crate::utils::ast::{get_fields, get_type_params};

use super::{ErrorConsumer, ErrorLogger};
use super::ErrorConsumer;

pub mod check_duplicates {
use super::*;
Expand Down
46 changes: 22 additions & 24 deletions rust/compiler/src/processing/resolver.rs
Original file line number Diff line number Diff line change
@@ -1,24 +1,14 @@
use anyhow::anyhow;
use std::collections::{HashMap, HashSet};

use crate::adlgen::sys::adlast2 as adlast;
use crate::adlrt::custom::sys::types::map::Map;

use super::loader::AdlLoader;
use super::primitives::{prim_from_str, str_from_prim};
use super::{ErrorConsumer, ErrorLogger, Module0, TypeExpr0};

type Result<T> = std::result::Result<T, ResolveError>;

#[derive(Debug)]
pub enum ResolveError {
NoDeclForAnnotation,
ModuleNotFound,
DeclNotFound,
LocalNotFound(String),
CircularModules(ModuleName),
LoadFailed,
OtherError,
}
use super::primitives::prim_from_str;
use super::{Module0, TypeExpr0};

type Result<T> = anyhow::Result<T>;

pub type TypeRef = adlast::TypeRef;
pub type TypeExpr1 = adlast::TypeExpr1;
Expand Down Expand Up @@ -69,16 +59,15 @@ impl Resolver {
}

if in_progress.contains(module_name) {
return Err(ResolveError::CircularModules(module_name.clone()));
return Err(anyhow!("Circular reference loop including {}", module_name));
}

in_progress.insert(module_name.clone());

let mut module0 = self
.loader
.load(module_name)
.map_err(|_| ResolveError::LoadFailed)?
.ok_or_else(|| ResolveError::ModuleNotFound)?;
.load(module_name)?
.ok_or_else(|| anyhow!("Module {} not found", module_name))?;
self.add_default_imports(&mut module0);

let module_refs = find_module_refs(&module0);
Expand Down Expand Up @@ -143,7 +132,7 @@ pub fn check_module(m: &Module1) -> Result<()> {
let mut elog = super::ErrorLogger::new();
super::checks::check_duplicates::module(m, &mut elog);
if elog.failed {
Err(ResolveError::OtherError)
Err(anyhow!("checks failed"))
} else {
Ok(())
}
Expand Down Expand Up @@ -268,7 +257,10 @@ pub fn resolve_annotations(
if let TypeRef::ScopedName(sn1) = tr1 {
Ok((sn1, jv.clone()))
} else {
Err(ResolveError::NoDeclForAnnotation)
Err(anyhow!(
"no decl {} found for explicit annotation",
sn0.name
))
}
})
.collect::<Result<HashMap<_, _>>>()?;
Expand Down Expand Up @@ -313,12 +305,18 @@ impl<'a> ResolveCtx<'a> {
if let Some(scoped_name) = self.expanded_imports.get(name) {
return Ok(TypeRef::ScopedName(scoped_name.clone()));
}
Err(ResolveError::LocalNotFound(name.clone()))
Err(anyhow!("type {} not found", name))
} else {
match self.find_module(&scoped_name0.module_name)? {
None => return Err(ResolveError::ModuleNotFound),
None => return Err(anyhow!("module {} not found", scoped_name0.module_name)),
Some(module1) => match module1.decls.get(&scoped_name0.name) {
None => return Err(ResolveError::DeclNotFound),
None => {
return Err(anyhow!(
"type {}.{} not found",
scoped_name0.module_name,
scoped_name0.name
))
}
Some(_) => return Ok(TypeRef::ScopedName(scoped_name0.clone())),
},
}
Expand Down
4 changes: 2 additions & 2 deletions rust/compiler/src/utils/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ pub fn get_fields<T>(d: &adlast::Decl<T>) -> Option<&Vec<adlast::Field<T>>> {
match &d.r#type {
adlast::DeclType::Struct(s) => Some(&s.fields),
adlast::DeclType::Union(u) => Some(&u.fields),
adlast::DeclType::Type(t) => None,
adlast::DeclType::Newtype(n) => None,
adlast::DeclType::Type(_) => None,
adlast::DeclType::Newtype(_) => None,
}
}

Expand Down

0 comments on commit a703089

Please sign in to comment.