creating graph for comptime folding dependencies

This commit is contained in:
Janis 2024-09-16 01:04:52 +02:00
parent 5ad0e9e8e7
commit 464baa7bd7

View file

@ -2302,7 +2302,7 @@ impl Ast {
Tag::FieldDecl => true,
Tag::DeclRef => self.tags[data.as_index().index()] == Tag::GlobalDecl,
Tag::InternedType | Tag::PointerType | Tag::ArrayType | Tag::TypeDeclRef => true,
Tag::CallExpr => false,
Tag::CallExpr => false, // are_children_comptime(self, cache),
Tag::FieldAccess => {
let parent = data.as_index_intern().0;
cache.mark_as_dominated_by(index, parent);
@ -2729,6 +2729,57 @@ pub mod ast_gen {
let mut cache = TypeCache::new();
}
pub fn create_comptime_folding_graph(&mut self) {
let mut cache = ComptimeCache::default();
let mut nodes = self.ast.get_root_file_indices().collect::<Vec<_>>();
while let Some(node) = nodes.pop() {
if !self.ast.is_node_comptime_evaluable(&mut cache, node) {
nodes.extend(self.ast.get_node_children(node));
}
}
let mut node_map = Vec::<u32>::new();
let edges = cache
.inner
.iter()
.filter(|(_, b)| **b)
.map(|(e, _)| self.ast.get_node_children(*e).into_iter().map(|d| (*e, d)))
.flatten()
.map(|(a, b)| (a.into_u32(), b.into_u32()))
.map(|(a, b)| {
(
node_map.iter().position(|&i| i == a).unwrap_or_else(|| {
node_map.push(a);
node_map.len() - 1
}) as u32,
node_map.iter().position(|&i| i == b).unwrap_or_else(|| {
node_map.push(b);
node_map.len() - 1
}) as u32,
)
})
.collect::<Vec<_>>();
eprintln!("cache: {cache:?}");
eprintln!("edges: {edges:?}");
let mut graph = petgraph::stable_graph::StableDiGraph::<(), ()>::from_edges(edges);
std::fs::write(
"comptime_graph.dot",
&format!("{:?}", petgraph::dot::Dot::new(&graph)),
)
.expect("writing comptime graph repr");
let a = graph
.externals(petgraph::Direction::Outgoing)
.collect::<Vec<_>>();
while let Some(external) = graph.externals(petgraph::Direction::Outgoing).next() {
_ = node_map[external.index()];
// comptime fold node
graph.remove_node(external);
}
}
pub fn intern_types(&mut self) {
let mut nodes = self
.ast
@ -4294,6 +4345,7 @@ pub mod ast_gen {
self.ast.set_root([file]);
eprintln!("resolving decls:");
self.resolve_decl_refs();
self.create_comptime_folding_graph();
eprintln!("interning types:");
self.intern_types();
}