Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
library2
Browse files Browse the repository at this point in the history
Grant Wuerker committed May 16, 2024

Verified

This commit was signed with the committer’s verified signature.
saschagrunert Sascha Grunert
1 parent 70fca41 commit 3c32fdf
Showing 22 changed files with 712 additions and 4 deletions.
9 changes: 9 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion crates/common2/src/input.rs
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@ use crate::InputDb;
#[salsa::input(constructor = __new_impl)]
pub struct InputIngot {
/// An absolute path to the ingot root directory.
/// The all files in the ingot should be located under this directory.
/// All files in the ingot should be located under this directory.
#[return_ref]
pub path: Utf8PathBuf,

1 change: 1 addition & 0 deletions crates/driver2/Cargo.toml
Original file line number Diff line number Diff line change
@@ -12,6 +12,7 @@ description = "Provides Fe driver"
[dependencies]
salsa = { git = "https://github.com/salsa-rs/salsa", package = "salsa-2022" }
codespan-reporting = "0.11"
library2 = { path = "../library2", package = "fe-library2" }

hir = { path = "../hir", package = "fe-hir" }
common = { path = "../common2", package = "fe-common2" }
23 changes: 21 additions & 2 deletions crates/driver2/src/lib.rs
Original file line number Diff line number Diff line change
@@ -12,8 +12,11 @@ use common::{
InputDb, InputFile, InputIngot,
};
use hir::{
analysis_pass::AnalysisPassManager, diagnostics::DiagnosticVoucher, hir_def::TopLevelMod,
lower::map_file_to_mod, HirDb, LowerHirDb, ParsingPass, SpannedHirDb,
analysis_pass::AnalysisPassManager,
diagnostics::DiagnosticVoucher,
hir_def::TopLevelMod,
lower::{map_file_to_mod, module_tree},
HirDb, LowerHirDb, ParsingPass, SpannedHirDb,
};
use hir_analysis::{
name_resolution::{DefConflictAnalysisPass, ImportAnalysisPass, PathAnalysisPass},
@@ -58,6 +61,10 @@ impl DriverDataBase {
self.run_on_file_with_pass_manager(top_mod, initialize_analysis_pass);
}

pub fn run_on_ingot(&mut self, ingot: InputIngot) {
self.run_on_ingot_with_pass_manager(ingot, initialize_analysis_pass);
}

pub fn run_on_file_with_pass_manager<F>(&mut self, top_mod: TopLevelMod, pm_builder: F)
where
F: FnOnce(&DriverDataBase) -> AnalysisPassManager<'_>,
@@ -69,6 +76,18 @@ impl DriverDataBase {
};
}

pub fn run_on_ingot_with_pass_manager<F>(&mut self, ingot: InputIngot, pm_builder: F)
where
F: FnOnce(&DriverDataBase) -> AnalysisPassManager<'_>,
{
self.diags.clear();
let tree = module_tree(self, ingot);
self.diags = {
let mut pass_manager = pm_builder(self);
pass_manager.run_on_module_tree(tree)
};
}

pub fn top_mod_from_file(&mut self, file_path: &path::Path, source: &str) -> TopLevelMod {
let kind = IngotKind::StandAlone;

13 changes: 13 additions & 0 deletions crates/driver2/tests/std_lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
use fe_driver2::DriverDataBase;

#[test]
fn check_std_lib() {
let mut driver = DriverDataBase::default();
let std_ingot = library2::std_lib_input_ingot(&mut driver);
driver.run_on_ingot(std_ingot);

let diags = driver.format_diags();
if !diags.is_empty() {
panic!("{diags}")
}
}
15 changes: 14 additions & 1 deletion crates/hir/src/analysis_pass.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use crate::{diagnostics::DiagnosticVoucher, hir_def::TopLevelMod};
use crate::{
diagnostics::DiagnosticVoucher,
hir_def::{ModuleTree, TopLevelMod},
};

/// All analysis passes that run analysis on the HIR top level module
/// granularity should implement this trait.
@@ -27,4 +30,14 @@ impl<'db> AnalysisPassManager<'db> {
}
diags
}

pub fn run_on_module_tree(&mut self, tree: &ModuleTree) -> Vec<Box<dyn DiagnosticVoucher>> {
let mut diags = vec![];
for module in tree.all_modules() {
for pass in self.module_passes.iter_mut() {
diags.extend(pass.run_on_module(module));
}
}
diags
}
}
11 changes: 11 additions & 0 deletions crates/library2/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[package]
name = "fe-library2"
version = "0.23.0"
authors = ["The Fe Developers <snakecharmers@ethereum.org>"]
edition = "2021"
license = "Apache-2.0"
repository = "https://github.com/ethereum/fe"

[dependencies]
include_dir = "0.7.2"
common = { path = "../common2", package = "fe-common2" }
3 changes: 3 additions & 0 deletions crates/library2/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
fn main() {
println!("cargo:rerun-if-changed=./std");
}
58 changes: 58 additions & 0 deletions crates/library2/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
use std::collections::BTreeSet;

pub use ::include_dir;
use common::{
input::{IngotKind, Version},
InputDb, InputFile, InputIngot,
};
use include_dir::{include_dir, Dir};

pub const STD: Dir = include_dir!("$CARGO_MANIFEST_DIR/std");

fn std_src_input_files(db: &mut dyn InputDb, ingot: InputIngot) -> BTreeSet<InputFile> {
static_dir_files(&STD)
.into_iter()
.map(|(path, content)| InputFile::new(db, ingot, path.into(), content.into()))
.collect()
}

pub fn std_lib_input_ingot(db: &mut dyn InputDb) -> InputIngot {
let ingot = InputIngot::new(
db,
"/",
IngotKind::Std,
Version::new(0, 0, 0),
BTreeSet::default(),
);

let input_files = std_src_input_files(db, ingot);
let root_file = input_files
.iter()
.find(|file| file.path(db).ends_with("lib.fe"))
.unwrap()
.to_owned();

ingot.set_root_file(db, root_file);
ingot.set_files(db, input_files);

ingot
}

pub fn static_dir_files(dir: &'static Dir) -> Vec<(&'static str, &'static str)> {
fn add_files(dir: &'static Dir, accum: &mut Vec<(&'static str, &'static str)>) {
accum.extend(dir.files().map(|file| {
(
file.path().to_str().unwrap(),
file.contents_utf8().expect("non-utf8 static file"),
)
}));

for sub_dir in dir.dirs() {
add_files(sub_dir, accum)
}
}

let mut files = vec![];
add_files(dir, &mut files);
files
}
1 change: 1 addition & 0 deletions crates/library2/std/src/lib.fe
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
//! The Fe standard library.
1 change: 1 addition & 0 deletions crates/library2/std/src/num.fe
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
//! Basic numeric functionality.
4 changes: 4 additions & 0 deletions crates/library2/std/src/num/int.fe
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
//! Basic integer functionality.

pub type isize = i256
pub type usize = u256
69 changes: 69 additions & 0 deletions crates/library2/std/src/num/int/extend.fe
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
//! Integer extension.

extern {
fn u8_u16_extend(_ x: u8) -> u16
fn u8_u32_extend(_ x: u8) -> u32
fn u8_u64_extend(_ x: u8) -> u64
fn u8_u128_extend(_ x: u8) -> u128
fn u8_u256_extend(_ x: u8) -> u256
fn u16_u32_extend(_ x: u16) -> u32
fn u16_u64_extend(_ x: u16) -> u64
fn u16_u128_extend(_ x: u16) -> u128
fn u16_u256_extend(_ x: u16) -> u256
fn u32_u64_extend(_ x: u32) -> u64
fn u32_u128_extend(_ x: u32) -> u128
fn u32_u256_extend(_ x: u32) -> u256
fn u64_u128_extend(_ x: u64) -> u128
fn u64_u256_extend(_ x: u64) -> u256
fn u128_u256_extend(_ x: u128) -> u256
fn i8_i16_extend(_ x: i8) -> i16
fn i8_i32_extend(_ x: i8) -> i32
fn i8_i64_extend(_ x: i8) -> i64
fn i8_i128_extend(_ x: i8) -> i128
fn i8_i256_extend(_ x: i8) -> i256
fn i16_i32_extend(_ x: i16) -> i32
fn i16_i64_extend(_ x: i16) -> i64
fn i16_i128_extend(_ x: i16) -> i128
fn i16_i256_extend(_ x: i16) -> i256
fn i32_i64_extend(_ x: i32) -> i64
fn i32_i128_extend(_ x: i32) -> i128
fn i32_i256_extend(_ x: i32) -> i256
fn i64_i128_extend(_ x: i64) -> i128
fn i64_i256_extend(_ x: i64) -> i256
fn i128_i256_extend(_ x: i128) -> i256
}

pub trait Extend<Out> {
fn extend(self) -> Out
}

impl Extend<u16> for u8 { fn extend(self) -> u16 { u8_u16_extend(self) } }
impl Extend<u32> for u8 { fn extend(self) -> u32 { u8_u32_extend(self) } }
impl Extend<u64> for u8 { fn extend(self) -> u64 { u8_u64_extend(self) } }
impl Extend<u128> for u8 { fn extend(self) -> u128 { u8_u128_extend(self) } }
impl Extend<u256> for u8 { fn extend(self) -> u256 { u8_u256_extend(self) } }
impl Extend<u32> for u16 { fn extend(self) -> u32 { u16_u32_extend(self) } }
impl Extend<u64> for u16 { fn extend(self) -> u64 { u16_u64_extend(self) } }
impl Extend<u128> for u16 { fn extend(self) -> u128 { u16_u128_extend(self) } }
impl Extend<u256> for u16 { fn extend(self) -> u256 { u16_u256_extend(self) } }
impl Extend<u64> for u32 { fn extend(self) -> u64 { u32_u64_extend(self) } }
impl Extend<u128> for u32 { fn extend(self) -> u128 { u32_u128_extend(self) } }
impl Extend<u256> for u32 { fn extend(self) -> u256 { u32_u256_extend(self) } }
impl Extend<u128> for u64 { fn extend(self) -> u128 { u64_u128_extend(self) } }
impl Extend<u256> for u64 { fn extend(self) -> u256 { u64_u256_extend(self) } }
impl Extend<u256> for u128 { fn extend(self) -> u256 { u128_u256_extend(self) } }
impl Extend<i16> for i8 { fn extend(self) -> i16 { i8_i16_extend(self) } }
impl Extend<i32> for i8 { fn extend(self) -> i32 { i8_i32_extend(self) } }
impl Extend<i64> for i8 { fn extend(self) -> i64 { i8_i64_extend(self) } }
impl Extend<i128> for i8 { fn extend(self) -> i128 { i8_i128_extend(self) } }
impl Extend<i256> for i8 { fn extend(self) -> i256 { i8_i256_extend(self) } }
impl Extend<i32> for i16 { fn extend(self) -> i32 { i16_i32_extend(self) } }
impl Extend<i64> for i16 { fn extend(self) -> i64 { i16_i64_extend(self) } }
impl Extend<i128> for i16 { fn extend(self) -> i128 { i16_i128_extend(self) } }
impl Extend<i256> for i16 { fn extend(self) -> i256 { i16_i256_extend(self) } }
impl Extend<i64> for i32 { fn extend(self) -> i64 { i32_i64_extend(self) } }
impl Extend<i128> for i32 { fn extend(self) -> i128 { i32_i128_extend(self) } }
impl Extend<i256> for i32 { fn extend(self) -> i256 { i32_i256_extend(self) } }
impl Extend<i128> for i64 { fn extend(self) -> i128 { i64_i128_extend(self) } }
impl Extend<i256> for i64 { fn extend(self) -> i256 { i64_i256_extend(self) } }
impl Extend<i256> for i128 { fn extend(self) -> i256 { i128_i256_extend(self) } }
1 change: 1 addition & 0 deletions crates/library2/std/src/num/int/ops.fe
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
//! Integer operations.
Loading

0 comments on commit 3c32fdf

Please sign in to comment.