tamer: obj::xmlo::{lower=>air}: Rename {LowerState=>XmloToAir}

This provides much more clarity as to what is going on.  Further, it's less
ambiguous, since I'm about to introduce a new type of xmlo lowering into XIR
for writing the actual xmlo files.

DEV-7145
main
Mike Gerwitz 2022-06-02 13:23:41 -04:00
parent 8d92667388
commit 45bbf3879e
3 changed files with 58 additions and 56 deletions

View File

@ -36,7 +36,10 @@ use crate::{
VisitOnceFilesystem,
},
ld::xmle::Sections,
obj::xmlo::{self, XmloError, XmloLowerError, XmloReader, XmloToken},
obj::xmlo::{
XmloAirContext, XmloAirError, XmloError, XmloReader, XmloToAir,
XmloToken,
},
parse::{Lower, ParseError, Parsed, ParsedObject, UnknownToken},
sym::{GlobalSymbolResolve, SymbolId},
xir::reader::XmlXirReader,
@ -67,10 +70,10 @@ pub fn xmle(package_path: &str, output: &str) -> Result<(), TameldError> {
&mut fs,
LinkerAsg::with_capacity(65536, 65536),
&escaper,
xmlo::LowerContext::default(),
XmloAirContext::default(),
)?;
let xmlo::LowerContext {
let XmloAirContext {
prog_name: name,
relroot,
..
@ -125,7 +128,7 @@ pub fn graphml(package_path: &str, output: &str) -> Result<(), TameldError> {
&mut fs,
LinkerAsg::with_capacity(65536, 65536),
&escaper,
xmlo::LowerContext::default(),
XmloAirContext::default(),
)?;
// if we move away from petgraph, we will need to abstract this away
@ -177,8 +180,8 @@ fn load_xmlo<'a, P: AsRef<Path>, S: Escaper>(
fs: &mut VisitOnceFilesystem<FsCanonicalizer, FxBuildHasher>,
asg: Asg,
escaper: &S,
state: xmlo::LowerContext,
) -> Result<(Asg, xmlo::LowerContext), TameldError> {
state: XmloAirContext,
) -> Result<(Asg, XmloAirContext), TameldError> {
let PathFile(path, file, ctx): PathFile<BufReader<fs::File>> =
match fs.open(path_str)? {
VisitOnceFile::FirstVisit(file) => file,
@ -187,12 +190,11 @@ fn load_xmlo<'a, P: AsRef<Path>, S: Escaper>(
// TODO: This entire block is a WIP and will be incrementally
// abstracted away.
let (mut asg, mut state) = Lower::<
ParsedObject<XirToken, XirError>,
flat::State<64>,
>::lower::<_, TameldError>(
&mut XmlXirReader::new(file, escaper, ctx),
|toks| {
let (mut asg, mut state) =
Lower::<ParsedObject<XirToken, XirError>, flat::State<64>>::lower::<
_,
TameldError,
>(&mut XmlXirReader::new(file, escaper, ctx), |toks| {
Lower::<flat::State<64>, XmloReader>::lower(toks, |xmlo| {
let mut iter = xmlo.scan(false, |st, rtok| match st {
true => None,
@ -205,27 +207,27 @@ fn load_xmlo<'a, P: AsRef<Path>, S: Escaper>(
}
});
Lower::<XmloReader, xmlo::LowerState>::lower_with_context(
Lower::<XmloReader, XmloToAir>::lower_with_context(
&mut iter,
state,
|air| {
let (_, asg) = Lower::<xmlo::LowerState, AirState>::lower_with_context(
air,
asg,
|end| {
end.fold(
Result::<(), TameldError>::Ok(()),
|x, _| x,
)
},
)?;
let (_, asg) =
Lower::<XmloToAir, AirState>::lower_with_context(
air,
asg,
|end| {
end.fold(
Result::<(), TameldError>::Ok(()),
|x, _| x,
)
},
)?;
Ok(asg)
},
)
})
},
)?;
})?;
let mut dir: PathBuf = path.clone();
dir.pop();
@ -280,7 +282,7 @@ pub enum TameldError {
XirParseError(ParseError<UnknownToken, XirError>),
XirfParseError(ParseError<XirToken, XirfError>),
XmloParseError(ParseError<XirfToken, XmloError>),
XmloLowerError(ParseError<XmloToken, XmloLowerError>),
XmloLowerError(ParseError<XmloToken, XmloAirError>),
AirLowerError(ParseError<AirToken, AsgError>),
XirWriterError(XirWriterError),
CycleError(Vec<Vec<SymbolId>>),
@ -317,8 +319,8 @@ impl From<ParseError<XirToken, XirfError>> for TameldError {
}
}
impl From<ParseError<XmloToken, XmloLowerError>> for TameldError {
fn from(e: ParseError<XmloToken, XmloLowerError>) -> Self {
impl From<ParseError<XmloToken, XmloAirError>> for TameldError {
fn from(e: ParseError<XmloToken, XmloAirError>) -> Self {
Self::XmloLowerError(e)
}
}

View File

@ -1,4 +1,4 @@
// Lower `xmlo` object file into the ASG
// Lower `xmlo` object file into AIR
//
// Copyright (C) 2014-2022 Ryan Specialty Group, LLC.
//
@ -39,9 +39,9 @@ use super::XmloToken;
/// Persistent `xmlo` lowering context to be shared among all `xmlo` files.
///
/// TODO: Continue refactoring this into [`LowerState`] and the ASG itself.
/// TODO: Continue refactoring this into [`XmloToAir`] and the ASG itself.
#[derive(Debug)]
pub struct LowerContext {
pub struct XmloAirContext {
/// Relative paths to imported packages that have been discovered.
///
/// The caller will use these to perform recursive loads.
@ -65,7 +65,7 @@ pub struct LowerContext {
first: bool,
}
impl Default for LowerContext {
impl Default for XmloAirContext {
fn default() -> Self {
Self {
found: None,
@ -76,7 +76,7 @@ impl Default for LowerContext {
}
}
impl LowerContext {
impl XmloAirContext {
/// Whether this is the first discovered package.
#[inline]
fn is_first(&self) -> bool {
@ -89,7 +89,7 @@ type PackageName = SymbolId;
/// State machine for lowering into the [`Asg`](crate::asg::Asg) via
/// [`AirToken`].
#[derive(Debug, PartialEq, Eq, Default)]
pub enum LowerState {
pub enum XmloToAir {
#[default]
PackageExpected,
Package(PackageName, Span),
@ -98,19 +98,19 @@ pub enum LowerState {
Done(Span),
}
impl ParseState for LowerState {
impl ParseState for XmloToAir {
type Token = XmloToken;
type Object = AirToken;
type Error = XmloLowerError;
type Error = XmloAirError;
type Context = LowerContext;
type Context = XmloAirContext;
fn parse_token(
self,
tok: Self::Token,
ctx: &mut Self::Context,
) -> crate::parse::TransitionResult<Self> {
use LowerState::*;
use XmloToAir::*;
match (self, tok) {
(PackageExpected, XmloToken::PkgName(name, span)) => {
@ -239,9 +239,9 @@ impl ParseState for LowerState {
}
}
impl Display for LowerState {
impl Display for XmloToAir {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
use LowerState::*;
use XmloToAir::*;
match self {
PackageExpected => write!(f, "expecting package definition"),
@ -257,7 +257,7 @@ impl Display for LowerState {
}
impl TryFrom<SymAttrs> for IdentKind {
type Error = XmloLowerError;
type Error = XmloAirError;
/// Attempt to raise [`SymAttrs`] into an [`IdentKind`].
///
@ -269,7 +269,7 @@ impl TryFrom<SymAttrs> for IdentKind {
}
impl TryFrom<&SymAttrs> for IdentKind {
type Error = XmloLowerError;
type Error = XmloAirError;
/// Attempt to raise [`SymAttrs`] into an [`IdentKind`].
///
@ -342,7 +342,7 @@ impl From<SymAttrs> for Source {
///
/// TODO: Spans are needed!
#[derive(Debug, PartialEq)]
pub enum XmloLowerError {
pub enum XmloAirError {
/// Symbol type was not provided.
MissingType,
@ -359,7 +359,7 @@ pub enum XmloLowerError {
BadEligRef(SymbolId),
}
impl Display for XmloLowerError {
impl Display for XmloAirError {
fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Self::MissingType => write!(fmt, "missing symbol type"),
@ -374,9 +374,9 @@ impl Display for XmloLowerError {
}
}
impl Diagnostic for XmloLowerError {
impl Diagnostic for XmloAirError {
fn describe(&self) -> Vec<AnnotatedSpan> {
use XmloLowerError::*;
use XmloAirError::*;
match self {
// TODO: Missing spans!
@ -385,7 +385,7 @@ impl Diagnostic for XmloLowerError {
}
}
impl Error for XmloLowerError {
impl Error for XmloAirError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
None
}
@ -403,7 +403,7 @@ mod test {
sym::GlobalSymbolIntern,
};
type Sut = LowerState;
type Sut = XmloToAir;
const S1: Span = DUMMY_SPAN;
const S2: Span = S1.offset_add(1).unwrap();
@ -643,7 +643,7 @@ mod test {
// This is all that's needed to not consider this to be the first
// package,
// so that pkg_name is retained below.
let ctx = LowerContext {
let ctx = XmloAirContext {
first: false,
..Default::default()
};
@ -686,7 +686,7 @@ mod test {
let sym = "sym".into();
let pkg_name = "pkg name".into();
let ctx = LowerContext {
let ctx = XmloAirContext {
first: false,
..Default::default()
};
@ -796,7 +796,7 @@ mod test {
})
.expect_err("must fail when missing dim");
assert_eq!(XmloLowerError::MissingDim, result);
assert_eq!(XmloAirError::MissingDim, result);
}
};
@ -822,7 +822,7 @@ mod test {
})
.expect_err("must fail when missing dtype");
assert_eq!(XmloLowerError::MissingDtype, result);
assert_eq!(XmloAirError::MissingDtype, result);
}
};
@ -851,7 +851,7 @@ mod test {
})
.expect_err("must fail when missing dim");
assert_eq!(XmloLowerError::MissingDim, dim_result);
assert_eq!(XmloAirError::MissingDim, dim_result);
// no dtype
let dtype_result = IdentKind::try_from(SymAttrs {
@ -861,7 +861,7 @@ mod test {
})
.expect_err("must fail when missing dtype");
assert_eq!(XmloLowerError::MissingDtype, dtype_result);
assert_eq!(XmloAirError::MissingDtype, dtype_result);
}
};
}

View File

@ -74,14 +74,14 @@
//! </package>
//! ```
mod air;
mod error;
mod ir;
mod lower;
mod reader;
pub use error::XmloError;
pub use ir::{SymAttrs, SymType};
// TODO: Encapsulate LowerContext once it is no longer needed by the caller
// in `poc.rs`.
pub use lower::{LowerContext, LowerState, XmloLowerError};
pub use air::{XmloAirContext, XmloAirError, XmloToAir};
pub use reader::{XmloReader, XmloToken};