Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
[build]
rustflags = ["-Clink-arg=-fuse-ld=lld", "-Zthreads=16"]
rustflags = ["-Clink-arg=-fuse-ld=lld", "-Zthreads=16", "-Ctarget-cpu=native"]
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,4 @@ tests/integration/verified_codemods/codemod_data/repo_commits.json
target/*
.benchmarks/*
**.snap.new
flamegraph.svg
35 changes: 32 additions & 3 deletions Cargo.lock

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

18 changes: 12 additions & 6 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,21 @@ edition = "2024"

[dependencies]
clap = { version = "4.5.28", features = ["derive"] }
codegen-sdk-analyzer = { path = "codegen-sdk-analyzer" }
codegen-sdk-analyzer = { path = "codegen-sdk-analyzer", default-features = false }
codegen-sdk-ast = { workspace = true}
codegen-sdk-common = { workspace = true}
anyhow = { workspace = true}
salsa = { workspace = true}
codegen-sdk-typescript = { workspace = true}
codegen-sdk-typescript = { workspace = true, optional = true }
codegen-sdk-python = { workspace = true, optional = true }
env_logger = { workspace = true }
log = { workspace = true }
codegen-sdk-resolution = { workspace = true}
sysinfo = "0.33.1"
rkyv.workspace = true
[features]
python = [ "codegen-sdk-analyzer/python"] # TODO: Add python support
typescript = [ "codegen-sdk-analyzer/typescript"]
python = [ "codegen-sdk-analyzer/python", "codegen-sdk-python"]
typescript = [ "codegen-sdk-analyzer/typescript", "codegen-sdk-typescript"]
tsx = [ "codegen-sdk-analyzer/tsx"]
jsx = [ "codegen-sdk-analyzer/jsx"]
javascript = [ "codegen-sdk-analyzer/javascript"]
Expand Down Expand Up @@ -116,15 +117,16 @@ insta = "1.42.1"
prettyplease = "0.2.29"
syn = { version = "2.0.98", features = ["proc-macro", "full"] }
derive_more = { version = "2.0.1", features = ["debug", "display"] }
salsa = {git = "https://github.com/salsa-rs/salsa", branch = "master"}
salsa = {git = "https://github.com/salsa-rs/salsa", rev ="dbb0e5f6ab2cd61e42b372f333ab694f24141cf1"}
subenum = {git = "https://github.com/mrenow/subenum", branch = "main"}
indicatif-log-bridge = "0.2.3"
indicatif = { version = "0.17.11", features = ["rayon"] }
crossbeam-channel = "0.5.11"
rstest = "0.25.0"
indextree = "4.7.3"
thiserror = "2.0.11"

indexmap = "2"
smallvec = "1.11.0"
[profile.dev]
# codegen-backend = "cranelift"
# split-debuginfo = "unpacked"
Expand Down Expand Up @@ -157,3 +159,7 @@ lto = false
name = "parse"
harness = false
required-features = ["stable"]

[profile.profiling]
inherits = "release"
debug = true
50 changes: 35 additions & 15 deletions codegen-sdk-analyzer/src/codebase.rs
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
use std::path::PathBuf;

use anyhow::Context;
use codegen_sdk_ast::Input;
#[cfg(feature = "serialization")]
use codegen_sdk_common::serialization::Cache;
use codegen_sdk_resolution::CodebaseContext;
use codegen_sdk_resolution::{CodebaseContext, Db};
use discovery::FilesToParse;
use notify_debouncer_mini::DebounceEventResult;
use salsa::Setter;

use crate::{
ParsedFile,
database::{CodegenDatabase, Db},
parser::parse_file,
};
use crate::{ParsedFile, database::CodegenDatabase, parser::parse_file};
mod discovery;
mod parser;
use parser::execute_op_with_progress;

pub struct Codebase {
db: CodegenDatabase,
root: PathBuf,
Expand All @@ -26,8 +23,9 @@ pub struct Codebase {

impl Codebase {
pub fn new(root: PathBuf) -> Self {
let root = root.canonicalize().unwrap();
let (tx, rx) = crossbeam_channel::unbounded();
let mut db = CodegenDatabase::new(tx);
let mut db = CodegenDatabase::new(tx, root.clone());
db.watch_dir(PathBuf::from(&root)).unwrap();
let codebase = Self { db, root, rx };
codebase.sync();
Expand All @@ -47,8 +45,7 @@ impl Codebase {
// to kick in, just like any other update to a salsa input.
let contents = std::fs::read_to_string(path)
.with_context(|| format!("Failed to read file {}", event.path.display()))?;
let input = Input::new(&self.db, contents);
file.set_contents(&mut self.db).to(input);
file.set_content(&mut self.db).to(contents);
}
Err(e) => {
log::error!(
Expand All @@ -68,7 +65,7 @@ impl Codebase {

pub fn errors(&self) -> Vec<()> {
let mut errors = Vec::new();
for file in self.discover().files(&self.db) {
for file in self.db.files() {
if self.get_file(file.path(&self.db)).is_none() {
errors.push(());
}
Expand All @@ -84,9 +81,29 @@ impl Codebase {
files,
)
}
fn _db(&self) -> &dyn Db {
&self.db
}
pub fn execute_op_with_progress<T: Send + Sync>(
&self,
name: &str,
parallel: bool,
op: fn(&dyn Db, codegen_sdk_common::FileNodeId<'_>) -> T,
) -> Vec<T> {
execute_op_with_progress(
self._db(),
codegen_sdk_resolution::files(self._db()),
name,
parallel,
op,
)
}
}
impl CodebaseContext for Codebase {
type File<'a> = ParsedFile<'a>;
fn root_path(&self) -> PathBuf {
self.root.clone()
}
fn files<'a>(&'a self) -> Vec<&'a Self::File<'a>> {
let mut files = Vec::new();
for file in self.discover().files(&self.db) {
Expand All @@ -96,13 +113,16 @@ impl CodebaseContext for Codebase {
}
files
}
fn db(&self) -> &dyn salsa::Database {
fn db(&self) -> &dyn Db {
&self.db
}
fn get_file<'a>(&'a self, path: PathBuf) -> Option<&'a Self::File<'a>> {
let file = self.db.files.get(&path);
if let Some(file) = file {
return parse_file(&self.db, file.clone()).file(&self.db).as_ref();
if let Ok(path) = path.canonicalize() {
let file = self.db.files.get(&path);
if let Some(_) = file {
let file_id = codegen_sdk_common::FileNodeId::new(&self.db, path);
return parse_file(&self.db, file_id).file(&self.db).as_ref();
}
}
None
}
Expand Down
9 changes: 6 additions & 3 deletions codegen-sdk-analyzer/src/codebase/discovery.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ use std::path::PathBuf;
use codegen_sdk_ast::*;
#[cfg(feature = "serialization")]
use codegen_sdk_common::serialize::Cache;
use codegen_sdk_resolution::Db;
use glob::glob;

use crate::database::{CodegenDatabase, Db};
use crate::database::CodegenDatabase;
#[salsa::input]
pub struct FilesToParse {
pub files: Vec<codegen_sdk_ast::input::File>,
pub files: codegen_sdk_common::hash::FxHashSet<codegen_sdk_cst::File>,
pub root: PathBuf,
}
pub fn log_languages() {
for language in LANGUAGES.iter() {
Expand Down Expand Up @@ -40,7 +42,8 @@ pub fn collect_files(db: &CodegenDatabase, dir: &PathBuf) -> FilesToParse {
.into_iter()
.filter_map(|file| file.ok())
.filter(|file| !file.is_dir() && !file.is_symlink())
.filter_map(|file| file.canonicalize().ok())
.map(|file| db.input(file).unwrap())
.collect();
FilesToParse::new(db, files)
FilesToParse::new(db, files, dir)
}
Loading