creating graph for comptime folding dependencies
This commit is contained in:
parent
5ad0e9e8e7
commit
464baa7bd7
|
@ -2302,7 +2302,7 @@ impl Ast {
|
||||||
Tag::FieldDecl => true,
|
Tag::FieldDecl => true,
|
||||||
Tag::DeclRef => self.tags[data.as_index().index()] == Tag::GlobalDecl,
|
Tag::DeclRef => self.tags[data.as_index().index()] == Tag::GlobalDecl,
|
||||||
Tag::InternedType | Tag::PointerType | Tag::ArrayType | Tag::TypeDeclRef => true,
|
Tag::InternedType | Tag::PointerType | Tag::ArrayType | Tag::TypeDeclRef => true,
|
||||||
Tag::CallExpr => false,
|
Tag::CallExpr => false, // are_children_comptime(self, cache),
|
||||||
Tag::FieldAccess => {
|
Tag::FieldAccess => {
|
||||||
let parent = data.as_index_intern().0;
|
let parent = data.as_index_intern().0;
|
||||||
cache.mark_as_dominated_by(index, parent);
|
cache.mark_as_dominated_by(index, parent);
|
||||||
|
@ -2729,6 +2729,57 @@ pub mod ast_gen {
|
||||||
let mut cache = TypeCache::new();
|
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) {
|
pub fn intern_types(&mut self) {
|
||||||
let mut nodes = self
|
let mut nodes = self
|
||||||
.ast
|
.ast
|
||||||
|
@ -4294,6 +4345,7 @@ pub mod ast_gen {
|
||||||
self.ast.set_root([file]);
|
self.ast.set_root([file]);
|
||||||
eprintln!("resolving decls:");
|
eprintln!("resolving decls:");
|
||||||
self.resolve_decl_refs();
|
self.resolve_decl_refs();
|
||||||
|
self.create_comptime_folding_graph();
|
||||||
eprintln!("interning types:");
|
eprintln!("interning types:");
|
||||||
self.intern_types();
|
self.intern_types();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue