Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade tree-sitter to the latest version #233

Merged
merged 3 commits into from
Feb 27, 2024
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
4 changes: 4 additions & 0 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ test-and-build-arm64:
- python3 misc/test-production-rules.py -c $PWD/target/release/datadog-static-analyzer -s $PWD/target/release/datadog-static-analyzer-server -r csharp-best-practices
- python3 misc/test-production-rules.py -c $PWD/target/release/datadog-static-analyzer -s $PWD/target/release/datadog-static-analyzer-server -r csharp-inclusive
- python3 misc/test-production-rules.py -c $PWD/target/release/datadog-static-analyzer -s $PWD/target/release/datadog-static-analyzer-server -r csharp-security
- python3 misc/test-production-rules.py -c $PWD/target/release/datadog-static-analyzer -s $PWD/target/release/datadog-static-analyzer-server -r go-security
- python3 misc/test-production-rules.py -c $PWD/target/release/datadog-static-analyzer -s $PWD/target/release/datadog-static-analyzer-server -r go-best-practices
variables:
KUBERNETES_SERVICE_ACCOUNT_OVERWRITE: $CI_PROJECT_NAME
tags:
Expand Down Expand Up @@ -67,6 +69,8 @@ test-and-build-amd64:
- python3 misc/test-production-rules.py -c $PWD/target/release/datadog-static-analyzer -s $PWD/target/release/datadog-static-analyzer-server -r csharp-best-practices
- python3 misc/test-production-rules.py -c $PWD/target/release/datadog-static-analyzer -s $PWD/target/release/datadog-static-analyzer-server -r csharp-inclusive
- python3 misc/test-production-rules.py -c $PWD/target/release/datadog-static-analyzer -s $PWD/target/release/datadog-static-analyzer-server -r csharp-security
- python3 misc/test-production-rules.py -c $PWD/target/release/datadog-static-analyzer -s $PWD/target/release/datadog-static-analyzer-server -r go-security
- python3 misc/test-production-rules.py -c $PWD/target/release/datadog-static-analyzer -s $PWD/target/release/datadog-static-analyzer-server -r go-best-practices
variables:
KUBERNETES_SERVICE_ACCOUNT_OVERWRITE: $CI_PROJECT_NAME
tags:
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ lto = true
[workspace.dependencies]
anyhow = "1"
base64 = "0.21.2"
itertools = "0.11.0"
itertools = "0.12.1"
jasonforal marked this conversation as resolved.
Show resolved Hide resolved
serde = { version = "1", features = ["derive"] }
serde_json = "1"
derive_builder = "0.12"
Expand Down
3 changes: 1 addition & 2 deletions crates/static-analysis-kernel/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@ sha2 = { workspace = true }
deno_core = "0.196.0"
lazy_static = "1.4.0"
serde_v8 = "0.107.0"
tree-sitter = "0.20.10"
tree-sitter-swift = "=0.3.6"
tree-sitter = "0.21.0"

[build-dependencies]
cc="*"
9 changes: 9 additions & 0 deletions crates/static-analysis-kernel/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,15 @@ fn main() {
files: vec!["scanner.cc".to_string()],
cpp: true,
},
TreeSitterProject {
name: "tree-sitter-swift".to_string(),
compilation_unit: "tree-sitter-swift".to_string(),
repository: "https:/alex-pinkus/tree-sitter-swift.git".to_string(),
build_dir: "src".into(),
commit_hash: "b1b66955d420d5cf5ff268ae552f0d6e43ff66e1".to_string(),
files: vec!["parser.c".to_string(), "scanner.c".to_string()],
cpp: false,
},
];

// For each project:
Expand Down
19 changes: 8 additions & 11 deletions crates/static-analysis-kernel/src/analysis/tree_sitter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,6 @@ use anyhow::Result;
use std::collections::HashMap;
use tree_sitter::QueryCursor;

// Swift is implemented differently. While most languages are integrated from sources,
// the sources from the swift tree-sitter syntax do not compile and the rust package works.
use tree_sitter_swift::language as swift_language;

fn get_tree_sitter_language(language: &Language) -> tree_sitter::Language {
extern "C" {
fn tree_sitter_c_sharp() -> tree_sitter::Language;
Expand All @@ -20,6 +16,7 @@ fn get_tree_sitter_language(language: &Language) -> tree_sitter::Language {
fn tree_sitter_python() -> tree_sitter::Language;
fn tree_sitter_ruby() -> tree_sitter::Language;
fn tree_sitter_rust() -> tree_sitter::Language;
fn tree_sitter_swift() -> tree_sitter::Language;
fn tree_sitter_tsx() -> tree_sitter::Language;
fn tree_sitter_hcl() -> tree_sitter::Language;
fn tree_sitter_yaml() -> tree_sitter::Language;
Expand All @@ -37,7 +34,7 @@ fn get_tree_sitter_language(language: &Language) -> tree_sitter::Language {
Language::Python => unsafe { tree_sitter_python() },
Language::Ruby => unsafe { tree_sitter_ruby() },
Language::Rust => unsafe { tree_sitter_rust() },
Language::Swift => swift_language(),
Language::Swift => unsafe { tree_sitter_swift() },
Language::Terraform => unsafe { tree_sitter_hcl() },
Language::TypeScript => unsafe { tree_sitter_tsx() },
Language::Yaml => unsafe { tree_sitter_yaml() },
Expand All @@ -48,14 +45,16 @@ fn get_tree_sitter_language(language: &Language) -> tree_sitter::Language {
pub fn get_tree(code: &str, language: &Language) -> Option<tree_sitter::Tree> {
let mut tree_sitter_parser = tree_sitter::Parser::new();
let tree_sitter_language = get_tree_sitter_language(language);
tree_sitter_parser.set_language(tree_sitter_language).ok()?;
tree_sitter_parser
.set_language(&tree_sitter_language)
.ok()?;
tree_sitter_parser.parse(code, None)
}

// build the query from tree-sitter
pub fn get_query(query_code: &str, language: &Language) -> Result<tree_sitter::Query> {
let tree_sitter_language = get_tree_sitter_language(language);
Ok(tree_sitter::Query::new(tree_sitter_language, query_code)?)
Ok(tree_sitter::Query::new(&tree_sitter_language, query_code)?)
}

// Get all the match nodes based on a query. For each match, we build a `MatchNode`
Expand Down Expand Up @@ -88,11 +87,9 @@ pub fn get_query_nodes(

if let (Some(capture_name), Some(node)) = (capture_name_opt, node_opt) {
captures.insert(capture_name.to_string(), node.clone());
if !captures_list.contains_key(capture_name) {
captures_list.insert(capture_name.to_string(), vec![]);
}
captures_list.entry(capture_name.to_string()).or_default();
captures_list
.get_mut(capture_name)
.get_mut(&capture_name.to_string())
.unwrap()
.push(node.clone());
}
Expand Down
Loading