2023-01-30 16:51:24 -05:00
|
|
|
|
// Packages represented on ASG
|
|
|
|
|
//
|
|
|
|
|
// Copyright (C) 2014-2023 Ryan Specialty, LLC.
|
|
|
|
|
//
|
|
|
|
|
// This file is part of TAME.
|
|
|
|
|
//
|
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
//
|
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
//
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
//! Package object on the ASG.
|
|
|
|
|
|
2023-01-31 16:37:25 -05:00
|
|
|
|
use super::{
|
2023-02-03 15:53:50 -05:00
|
|
|
|
Ident, Object, ObjectIndex, ObjectRel, ObjectRelFrom, ObjectRelTy,
|
tamer: Very basic support for template application NIR -> xmli
This this a big change that's difficult to break up, and I don't have the
energy after it.
This introduces nullary template application, short- and long-form. Note
that a body of the short form is a `@values@` argument, so that's not
supported yet.
This continues to formalize the idea of what "template application" and
"template expansion" mean in TAMER. It makes a separate `TplApply`
unnecessary, because now application is simply a reference to a
template. Expansion and application are one and the same: when a template
expands, it'll re-bind metavariables to the parent context. So in a
template context, this amounts to application.
But applying a closed template will have nothing to bind, and so is
equivalent to expansion. And since `Meta` objects are not valid outside of
a `Tpl` context, applying a non-closed template outside of another template
will be invalid.
So we get all of this with a single primitive (getting the "value" of a
template).
The expansion is conceptually like `,@` in Lisp, where we're splicing trees.
It's a mess in some spots, but I want to get this committed before I do a
little bit of cleanup.
2023-03-17 10:25:56 -04:00
|
|
|
|
ObjectRelatable, Tpl,
|
2023-01-31 16:37:25 -05:00
|
|
|
|
};
|
2023-02-07 12:19:27 -05:00
|
|
|
|
use crate::{asg::Asg, f::Functor, span::Span};
|
2023-02-03 15:53:50 -05:00
|
|
|
|
use std::fmt::Display;
|
|
|
|
|
|
|
|
|
|
#[cfg(doc)]
|
|
|
|
|
use super::ObjectKind;
|
2023-01-30 16:51:24 -05:00
|
|
|
|
|
|
|
|
|
#[derive(Debug, PartialEq, Eq)]
|
|
|
|
|
pub struct Pkg(Span);
|
|
|
|
|
|
|
|
|
|
impl Pkg {
|
|
|
|
|
pub fn new<S: Into<Span>>(span: S) -> Self {
|
|
|
|
|
Self(span.into())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn span(&self) -> Span {
|
|
|
|
|
match self {
|
|
|
|
|
Self(span) => *span,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Display for Pkg {
|
|
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
|
|
|
write!(f, "package")
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-01-31 16:37:25 -05:00
|
|
|
|
|
2023-02-07 12:19:27 -05:00
|
|
|
|
impl Functor<Span> for Pkg {
|
|
|
|
|
fn map(self, f: impl FnOnce(Span) -> Span) -> Self::Target {
|
|
|
|
|
match self {
|
|
|
|
|
Self(span) => Self(f(span)),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-25 23:56:05 -05:00
|
|
|
|
object_rel! {
|
2023-02-03 15:53:50 -05:00
|
|
|
|
/// Packages serve as a root for all identifiers defined therein,
|
|
|
|
|
/// and so an edge to [`Ident`] will never be a cross edge.
|
|
|
|
|
///
|
|
|
|
|
/// Imported [`Ident`]s do not have edges from this package.
|
2023-02-25 23:56:05 -05:00
|
|
|
|
Pkg -> {
|
|
|
|
|
tree Ident,
|
tamer: Very basic support for template application NIR -> xmli
This this a big change that's difficult to break up, and I don't have the
energy after it.
This introduces nullary template application, short- and long-form. Note
that a body of the short form is a `@values@` argument, so that's not
supported yet.
This continues to formalize the idea of what "template application" and
"template expansion" mean in TAMER. It makes a separate `TplApply`
unnecessary, because now application is simply a reference to a
template. Expansion and application are one and the same: when a template
expands, it'll re-bind metavariables to the parent context. So in a
template context, this amounts to application.
But applying a closed template will have nothing to bind, and so is
equivalent to expansion. And since `Meta` objects are not valid outside of
a `Tpl` context, applying a non-closed template outside of another template
will be invalid.
So we get all of this with a single primitive (getting the "value" of a
template).
The expansion is conceptually like `,@` in Lisp, where we're splicing trees.
It's a mess in some spots, but I want to get this committed before I do a
little bit of cleanup.
2023-03-17 10:25:56 -04:00
|
|
|
|
|
|
|
|
|
// Anonymous templates are used for expansion.
|
|
|
|
|
tree Tpl,
|
2023-01-31 16:37:25 -05:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl ObjectIndex<Pkg> {
|
|
|
|
|
/// Indicate that the given identifier `oi` is defined in this package.
|
2023-01-31 22:00:51 -05:00
|
|
|
|
pub fn defines(self, asg: &mut Asg, oi: ObjectIndex<Ident>) -> Self {
|
tamer: asg::graph: Formalize dynamic relationships (edges)
The `TreePreOrderDfs` iterator needed to expose additional edge context to
the caller (specifically, the `Span`). This was getting a bit messy, so
this consolodates everything into a new `DynObjectRel`, which also
emphasizes that it is in need of narrowing.
Packing everything up like that also allows us to return more information to
the caller without complicating the API, since the caller does not need to
be concerned with all of those values individually.
Depth is kept separate, since that is a property of the traversal and is not
stored on the graph. (Rather, it _is_ a property of the graph, but it's not
calculated until traversal. But, depth will also vary for a given node
because of cross edges, and so we cannot store any concrete depth on the
graph for a given node. Not even a canonical one, because once we start
doing inlining and common subexpression elimination, there will be shared
edges that are _not_ cross edges (the node is conceptually part of _both_
trees). Okay, enough of this rambling parenthetical.)
DEV-13708
2023-02-09 13:11:27 -05:00
|
|
|
|
self.add_edge_to(asg, oi, None)
|
2023-01-31 16:37:25 -05:00
|
|
|
|
}
|
2023-02-07 12:19:27 -05:00
|
|
|
|
|
|
|
|
|
/// Complete the definition of a package.
|
|
|
|
|
pub fn close(self, asg: &mut Asg, span: Span) -> Self {
|
|
|
|
|
self.map_obj(asg, Pkg::fmap(|open| open.merge(span).unwrap_or(open)))
|
|
|
|
|
}
|
2023-01-31 16:37:25 -05:00
|
|
|
|
}
|