Skip to content

Commit 06381f9

Browse files
author
Grant Wuerker
committed
Resolution handler API WIP.
1 parent 42c91a5 commit 06381f9

File tree

21 files changed

+1082
-596
lines changed

21 files changed

+1082
-596
lines changed

Cargo.lock

Lines changed: 249 additions & 97 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/common/src/input.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ impl InputFile {
7474
pub fn abs_path(&self, db: &dyn InputDb, ingot: InputIngot) -> Utf8PathBuf {
7575
ingot.path(db).join(self.path(db))
7676
}
77+
78+
pub fn parse_config(&self, db: &dyn InputDb) -> IngotConfig {
79+
todo!()
80+
}
7781
}
7882

7983
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
@@ -120,3 +124,9 @@ impl Ord for IngotDependency {
120124
}
121125

122126
pub type Version = semver::Version;
127+
128+
struct IngotConfig {
129+
pub name: (),
130+
pub version: (),
131+
pub dependencies: (),
132+
}

crates/driver/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ common.workspace = true
1818
hir.workspace = true
1919
hir-analysis.workspace = true
2020
resolver.workspace = true
21+
indexmap = "2.9"

crates/driver/src/db.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use hir_analysis::{
1717
ImplTraitAnalysisPass, TraitAnalysisPass, TypeAliasAnalysisPass,
1818
},
1919
};
20+
use resolver::ResolutionHandler;
2021

2122
use crate::diagnostics::ToCsDiag;
2223

crates/driver/src/lib.rs

Lines changed: 134 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
pub mod db;
22
pub mod diagnostics;
33
pub mod files;
4+
mod resolution_handlers;
45
use camino::Utf8PathBuf;
56
use common::{
67
ingot::{builtin_core, IngotBuilder},
@@ -10,127 +11,148 @@ pub use db::DriverDataBase;
1011

1112
use clap::{Parser, Subcommand};
1213
use hir::hir_def::TopLevelMod;
13-
use resolver::{
14-
ingot::{config::Config, source_files::SourceFiles, Ingot, IngotResolver},
15-
Resolver,
16-
};
14+
use resolution_handlers::{IngotFilesHandler, IngotGraphHandler};
15+
use resolver::{files::FilesResolver, graph::GraphResolverImpl, Resolver};
16+
17+
// pub fn run(opts: &Options) {
18+
// match &opts.command {
19+
// Command::Build => eprintln!("`fe build` doesn't work at the moment"),
20+
// Command::Check { path, core } => {
21+
// let db = DriverDataBase::default();
22+
// let mut ingot_resolver = IngotResolver::default();
23+
//
24+
// let core_ingot = if let Some(core_path) = core {
25+
// match ingot_resolver.resolve(core_path) {
26+
// Ok(Ingot::Folder {
27+
// config:
28+
// Some(Config {
29+
// version: Some(version),
30+
// ..
31+
// }),
32+
// source_files:
33+
// Some(SourceFiles {
34+
// root: Some(root),
35+
// files,
36+
// }),
37+
// }) => {
38+
// let diagnostics = ingot_resolver.take_diagnostics();
39+
// if !diagnostics.is_empty() {
40+
// eprintln!("an error was encountered while resolving `{core_path}`");
41+
// for diagnostic in diagnostics {
42+
// eprintln!("{diagnostic}")
43+
// }
44+
// std::process::exit(2)
45+
// }
46+
// IngotBuilder::new(&db, "core")
47+
// .kind(IngotKind::Core)
48+
// .version(version)
49+
// .entrypoint(root)
50+
// .files_from_contents(files)
51+
// .build()
52+
// .0
53+
// }
54+
// Ok(Ingot::SingleFile { .. }) => {
55+
// eprintln!("standalone core ingot not supported");
56+
// std::process::exit(2)
57+
// }
58+
// Ok(_) => {
59+
// eprintln!("an error was encountered while resolving `{core_path}`");
60+
// for diagnostic in ingot_resolver.take_diagnostics() {
61+
// eprintln!("{diagnostic}")
62+
// }
63+
// std::process::exit(2)
64+
// }
65+
// Err(error) => {
66+
// eprintln!("an error was encountered while resolving `{core_path}`");
67+
// eprintln!("{error}");
68+
// std::process::exit(2)
69+
// }
70+
// }
71+
// } else {
72+
// builtin_core(&db)
73+
// };
74+
//
75+
// let local_ingot = match ingot_resolver.resolve(path) {
76+
// Ok(Ingot::Folder {
77+
// config:
78+
// Some(Config {
79+
// version: Some(version),
80+
// ..
81+
// }),
82+
// source_files:
83+
// Some(SourceFiles {
84+
// root: Some(root),
85+
// files,
86+
// }),
87+
// }) => {
88+
// let diagnostics = ingot_resolver.take_diagnostics();
89+
// if !diagnostics.is_empty() {
90+
// eprintln!("an error was encountered while resolving `{path}`");
91+
// for diagnostic in diagnostics {
92+
// eprintln!("{diagnostic}")
93+
// }
94+
// std::process::exit(2)
95+
// }
96+
// // db.local_ingot(path, &version, &root, files, core_ingot).0
97+
// IngotBuilder::new(&db, path)
98+
// .kind(IngotKind::Local)
99+
// .version(version)
100+
// .entrypoint(root)
101+
// .files_from_contents(files)
102+
// .build()
103+
// .0
104+
// }
105+
// Ok(Ingot::SingleFile { path, content }) => {
106+
// IngotBuilder::standalone(&db, path, content)
107+
// .with_core_ingot(core_ingot)
108+
// .build()
109+
// .0
110+
// }
111+
// Ok(_) => {
112+
// eprintln!("an error was encountered while resolving `{path}`");
113+
// for diagnostic in ingot_resolver.take_diagnostics() {
114+
// eprintln!("{diagnostic}")
115+
// }
116+
// std::process::exit(2)
117+
// }
118+
// Err(error) => {
119+
// eprintln!("an error was encountered while resolving `{path}`");
120+
// eprintln!("{error}");
121+
// std::process::exit(2)
122+
// }
123+
// };
124+
//
125+
// let core_diags = db.run_on_ingot(core_ingot);
126+
// let local_diags = db.run_on_ingot(local_ingot);
127+
//
128+
// if !core_diags.is_empty() || !local_diags.is_empty() {
129+
// core_diags.emit(&db);
130+
// local_diags.emit(&db);
131+
// std::process::exit(1);
132+
// }
133+
// }
134+
// Command::New => eprintln!("`fe new` doesn't work at the moment"),
135+
// }
136+
// }
17137

18138
pub fn run(opts: &Options) {
19139
match &opts.command {
20140
Command::Build => eprintln!("`fe build` doesn't work at the moment"),
21141
Command::Check { path, core } => {
22142
let db = DriverDataBase::default();
23-
let mut ingot_resolver = IngotResolver::default();
24-
25-
let core_ingot = if let Some(core_path) = core {
26-
match ingot_resolver.resolve(core_path) {
27-
Ok(Ingot::Folder {
28-
config:
29-
Some(Config {
30-
version: Some(version),
31-
..
32-
}),
33-
source_files:
34-
Some(SourceFiles {
35-
root: Some(root),
36-
files,
37-
}),
38-
}) => {
39-
let diagnostics = ingot_resolver.take_diagnostics();
40-
if !diagnostics.is_empty() {
41-
eprintln!("an error was encountered while resolving `{core_path}`");
42-
for diagnostic in diagnostics {
43-
eprintln!("{diagnostic}")
44-
}
45-
std::process::exit(2)
46-
}
47-
IngotBuilder::new(&db, "core")
48-
.kind(IngotKind::Core)
49-
.version(version)
50-
.entrypoint(root)
51-
.files_from_contents(files)
52-
.build()
53-
.0
54-
}
55-
Ok(Ingot::SingleFile { .. }) => {
56-
eprintln!("standalone core ingot not supported");
57-
std::process::exit(2)
58-
}
59-
Ok(_) => {
60-
eprintln!("an error was encountered while resolving `{core_path}`");
61-
for diagnostic in ingot_resolver.take_diagnostics() {
62-
eprintln!("{diagnostic}")
63-
}
64-
std::process::exit(2)
65-
}
66-
Err(error) => {
67-
eprintln!("an error was encountered while resolving `{core_path}`");
68-
eprintln!("{error}");
69-
std::process::exit(2)
70-
}
71-
}
72-
} else {
73-
builtin_core(&db)
74-
};
75143

76-
let local_ingot = match ingot_resolver.resolve(path) {
77-
Ok(Ingot::Folder {
78-
config:
79-
Some(Config {
80-
version: Some(version),
81-
..
82-
}),
83-
source_files:
84-
Some(SourceFiles {
85-
root: Some(root),
86-
files,
87-
}),
88-
}) => {
89-
let diagnostics = ingot_resolver.take_diagnostics();
90-
if !diagnostics.is_empty() {
91-
eprintln!("an error was encountered while resolving `{path}`");
92-
for diagnostic in diagnostics {
93-
eprintln!("{diagnostic}")
94-
}
95-
std::process::exit(2)
96-
}
97-
// db.local_ingot(path, &version, &root, files, core_ingot).0
98-
IngotBuilder::new(&db, path)
99-
.kind(IngotKind::Local)
100-
.version(version)
101-
.entrypoint(root)
102-
.files_from_contents(files)
103-
.build()
104-
.0
105-
}
106-
Ok(Ingot::SingleFile { path, content }) => {
107-
IngotBuilder::standalone(&db, path, content)
108-
.with_core_ingot(core_ingot)
109-
.build()
110-
.0
111-
}
112-
Ok(_) => {
113-
eprintln!("an error was encountered while resolving `{path}`");
114-
for diagnostic in ingot_resolver.take_diagnostics() {
115-
eprintln!("{diagnostic}")
116-
}
117-
std::process::exit(2)
118-
}
119-
Err(error) => {
120-
eprintln!("an error was encountered while resolving `{path}`");
121-
eprintln!("{error}");
122-
std::process::exit(2)
123-
}
124-
};
144+
// let mut files_resolver = FilesResolver::with_patterns(&["fe.toml", "src/**/*.fe"]);
145+
let mut files_resolver = FilesResolver::default();
146+
let mut files_handler = IngotFilesHandler::default();
147+
let mut graph_resolver = GraphResolverImpl::new(files_resolver, files_handler);
148+
let mut graph_handler = IngotGraphHandler::default();
125149

126-
let core_diags = db.run_on_ingot(core_ingot);
127-
let local_diags = db.run_on_ingot(local_ingot);
150+
graph_resolver.resolve(&mut graph_handler, &path);
128151

129-
if !core_diags.is_empty() || !local_diags.is_empty() {
130-
core_diags.emit(&db);
131-
local_diags.emit(&db);
132-
std::process::exit(1);
133-
}
152+
// the above code could be encapsulated in an `IngotResolver`.
153+
let ingot_resolver = IngotResolver::<IngotFilesHandler, IngotGraphHandler>::default();
154+
let ingot_handler = IngotHandler::default();
155+
let local_ingot = ingot_resolver.resolve(&mut ingot_handler, &path);
134156
}
135157
Command::New => eprintln!("`fe new` doesn't work at the moment"),
136158
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
use indexmap::IndexSet;
2+
use resolver::{
3+
files::FilesResolver,
4+
graph::{GraphNode, GraphResolver, GraphResolverImpl},
5+
ResolutionHandler,
6+
};
7+
8+
#[derive(Default)]
9+
pub struct IngotFilesHandler {
10+
// Ingot builder instances.
11+
builds: (),
12+
}
13+
14+
#[derive(Default)]
15+
pub struct IngotGraphHandler;
16+
17+
pub struct IngotDependencyNode;
18+
19+
impl GraphNode<<FilesResolver as resolver::Resolver>::Description> for IngotDependencyNode {
20+
fn id(&self) -> <FilesResolver as resolver::Resolver>::Description {
21+
todo!()
22+
}
23+
24+
fn forward_ids(&self) -> IndexSet<<FilesResolver as resolver::Resolver>::Description> {
25+
todo!()
26+
}
27+
}
28+
29+
impl ResolutionHandler<FilesResolver> for IngotFilesHandler {
30+
type Item = IngotDependencyNode;
31+
32+
fn handle_resolution(
33+
&mut self,
34+
description: &<FilesResolver as resolver::Resolver>::Description,
35+
resource: <FilesResolver as resolver::Resolver>::Resource,
36+
) -> Self::Item {
37+
todo!()
38+
}
39+
}
40+
41+
impl<GR> ResolutionHandler<GR> for IngotGraphHandler
42+
where
43+
GR: GraphResolver<FilesResolver, IngotFilesHandler>,
44+
{
45+
type Item = ();
46+
47+
fn handle_resolution(
48+
&mut self,
49+
description: &GR::Description,
50+
resource: GR::Resource,
51+
) -> Self::Item {
52+
todo!()
53+
}
54+
}

crates/resolver/Cargo.toml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ common.workspace = true
1313
camino.workspace = true
1414
glob.workspace = true
1515
semver.workspace = true
16-
smol_str = "0.1"
16+
indexmap = "2.9"
17+
petgraph = "0.8"
18+
git2 = "0.19"
19+
dir-test.workspace = true
1720
toml = "0.8"
18-
serde = { version = "1", features = ["derive"] }
21+
test-utils.workspace = true
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
source: crates/resolver/tests/graph.rs
3+
expression: graph
4+
input_file: fixtures/graph/dag.toml
5+
---
6+
digraph {
7+
0 [ label = "\"a\"" ]
8+
1 [ label = "\"d\"" ]
9+
2 [ label = "\"e\"" ]
10+
3 [ label = "\"c\"" ]
11+
4 [ label = "\"b\"" ]
12+
0 -> 1 [ ]
13+
1 -> 2 [ ]
14+
0 -> 3 [ ]
15+
3 -> 1 [ ]
16+
0 -> 4 [ ]
17+
4 -> 3 [ ]
18+
4 -> 1 [ ]
19+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"a" = ["b","c","d"]
2+
"b" = ["c","d"]
3+
"c" = ["d"]
4+
"d" = ["e"]
5+
"e" = []

0 commit comments

Comments
 (0)