cl-typeck: Sketch out a new path resolver algorithm, and reparent some unused cruft
This commit is contained in:
parent
b796411742
commit
9449e5ba06
@ -248,13 +248,33 @@ pub mod module {
|
|||||||
pub imports: Vec<DefID>,
|
pub imports: Vec<DefID>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Module<'_> {
|
impl<'a> Module<'a> {
|
||||||
pub fn new(parent: DefID) -> Self {
|
pub fn new(parent: DefID) -> Self {
|
||||||
Self { parent: Some(parent), ..Default::default() }
|
Self { parent: Some(parent), ..Default::default() }
|
||||||
}
|
}
|
||||||
pub fn with_optional_parent(parent: Option<DefID>) -> Self {
|
pub fn with_optional_parent(parent: Option<DefID>) -> Self {
|
||||||
Self { parent, ..Default::default() }
|
Self { parent, ..Default::default() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get(&self, name: &'a str) -> (Option<DefID>, Option<DefID>) {
|
||||||
|
(self.get_type(name), self.get_value(name))
|
||||||
|
}
|
||||||
|
pub fn get_type(&self, name: &'a str) -> Option<DefID> {
|
||||||
|
self.types.get(name).copied()
|
||||||
|
}
|
||||||
|
pub fn get_value(&self, name: &'a str) -> Option<DefID> {
|
||||||
|
self.values.get(name).copied()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Inserts a type with the provided [name](str) and [id](DefID)
|
||||||
|
pub fn insert_type(&mut self, name: &'a str, id: DefID) -> Option<DefID> {
|
||||||
|
self.types.insert(name, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Inserts a value with the provided [name](str) and [id](DefID)
|
||||||
|
pub fn insert_value(&mut self, name: &'a str, id: DefID) -> Option<DefID> {
|
||||||
|
self.values.insert(name, id)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Display for Module<'_> {
|
impl std::fmt::Display for Module<'_> {
|
||||||
@ -321,6 +341,11 @@ pub mod path {
|
|||||||
Self::new(value)
|
Self::new(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
impl AsRef<[PathPart]> for Path<'_> {
|
||||||
|
fn as_ref(&self) -> &[PathPart] {
|
||||||
|
self.parts
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl std::fmt::Display for Path<'_> {
|
impl std::fmt::Display for Path<'_> {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
@ -419,6 +444,30 @@ pub mod project {
|
|||||||
None => module,
|
None => module,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get<'p>(
|
||||||
|
&self,
|
||||||
|
path: Path<'p>,
|
||||||
|
within: DefID,
|
||||||
|
) -> Option<(Option<DefID>, Option<DefID>, Path<'p>)> {
|
||||||
|
if path.absolute {
|
||||||
|
return self.get(path.relative(), self.root_of(within));
|
||||||
|
}
|
||||||
|
match path.as_ref() {
|
||||||
|
[] => Some((Some(within), None, path)),
|
||||||
|
[PathPart::Ident(Identifier(name))] => {
|
||||||
|
let (ty, val) = self[within].module.get(name);
|
||||||
|
Some((ty, val, path.pop_front()?))
|
||||||
|
}
|
||||||
|
[PathPart::Ident(Identifier(name)), ..] => {
|
||||||
|
let ty = self[within].module.get_type(name)?;
|
||||||
|
self.get(path.pop_front()?, ty)
|
||||||
|
}
|
||||||
|
[PathPart::SelfKw, ..] => self.get(path.pop_front()?, within),
|
||||||
|
[PathPart::SuperKw, ..] => self.get(path.pop_front()?, self.parent_of(within)?),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Resolves a path within a module tree, finding the innermost module.
|
/// Resolves a path within a module tree, finding the innermost module.
|
||||||
/// Returns the remaining path parts.
|
/// Returns the remaining path parts.
|
||||||
pub fn get_type<'p>(&self, path: Path<'p>, within: DefID) -> Option<(DefID, Path<'p>)> {
|
pub fn get_type<'p>(&self, path: Path<'p>, within: DefID) -> Option<(DefID, Path<'p>)> {
|
||||||
@ -449,17 +498,6 @@ pub mod project {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[rustfmt::skip]
|
|
||||||
pub fn insert_type(&mut self, name: &'a str, value: Def<'a>, parent: DefID) -> Option<DefID> {
|
|
||||||
let id = self.pool.insert(value);
|
|
||||||
self[parent].module.types.insert(name, id)
|
|
||||||
}
|
|
||||||
#[rustfmt::skip]
|
|
||||||
pub fn insert_value(&mut self, name: &'a str, value: Def<'a>, parent: DefID) -> Option<DefID> {
|
|
||||||
let id = self.pool.insert(value);
|
|
||||||
self[parent].module.values.insert(name, id)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Inserts the type returned by the provided closure iff the TypeKind doesn't already exist
|
/// Inserts the type returned by the provided closure iff the TypeKind doesn't already exist
|
||||||
///
|
///
|
||||||
/// Assumes `kind` uniquely identifies the type!
|
/// Assumes `kind` uniquely identifies the type!
|
||||||
|
Loading…
Reference in New Issue
Block a user