From f2ca7cf31479b19bdbf46d2a44d72f5f30318974 Mon Sep 17 00:00:00 2001 From: Wilfred Hughes Date: Mon, 11 Jul 2022 09:31:04 -0700 Subject: [PATCH] Add SQL support Closes #311 --- CHANGELOG.md | 2 ++ build.rs | 5 +++++ src/diff/sliders.rs | 4 ++++ src/parse/guess_language.rs | 3 +++ src/parse/tree_sitter_parser.rs | 15 +++++++++++++++ vendor/highlights/sql.scm | 1 + vendor/tree-sitter-sql-src | 1 + 7 files changed, 31 insertions(+) create mode 120000 vendor/highlights/sql.scm create mode 120000 vendor/tree-sitter-sql-src diff --git a/CHANGELOG.md b/CHANGELOG.md index fdebfdd66..9b0efff67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ### Parsing +Added SQL support. + Updated to the latest tree-sitter parsers for C#, Dart, Elm, Gleam, Haskell, HCL, Java, JSON, OCaml, PHP, Python, Ruby, Scala and TypeScript. diff --git a/build.rs b/build.rs index 39d3e5ea8..fd43183b2 100644 --- a/build.rs +++ b/build.rs @@ -228,6 +228,11 @@ fn main() { src_dir: "vendor/tree-sitter-scala-src", extra_files: vec!["scanner.c"], }, + TreeSitterParser { + name: "tree-sitter-sql", + src_dir: "vendor/tree-sitter-sql-src", + extra_files: vec!["scanner.cc"], + }, TreeSitterParser { name: "tree-sitter-swift", src_dir: "vendor/tree-sitter-swift-src", diff --git a/src/diff/sliders.rs b/src/diff/sliders.rs index 6f68a2e49..79b496191 100644 --- a/src/diff/sliders.rs +++ b/src/diff/sliders.rs @@ -60,6 +60,10 @@ fn prefer_outer_delimiter(language: guess_language::Language) -> bool { // JSON and TOML are like Lisp: the outer delimiter in an array object // is the most relevant. Json | Toml | Hcl => true, + // It's probably the case that outer delimiters are used more + // frequently than inner delimiters in SQl. (foo = 1 OR bar = 2) + // is more likely than foo(1). + Sql => true, // For everything else, prefer the inner delimiter. These // languages have syntax like `foo(bar)` or `foo[bar]` where // the inner delimiter is more relevant. diff --git a/src/parse/guess_language.rs b/src/parse/guess_language.rs index 7484a9b56..0aee252a4 100644 --- a/src/parse/guess_language.rs +++ b/src/parse/guess_language.rs @@ -52,6 +52,7 @@ pub enum Language { Ruby, Rust, Scala, + Sql, Swift, Toml, Tsx, @@ -127,6 +128,7 @@ fn from_emacs_mode_header(src: &str) -> Option { "rust" => Some(Rust), "scala" => Some(Scala), "sh" => Some(Bash), + "sql" => Some(Sql), "swift" => Some(Swift), "toml" => Some(Toml), "tuareg" => Some(OCaml), @@ -245,6 +247,7 @@ pub fn from_extension(extension: &OsStr) -> Option { "rb" | "builder" | "spec" | "rake" => Some(Ruby), "rs" => Some(Rust), "scala" | "sbt" | "sc" => Some(Scala), + "sql" | "pgsql" => Some(Sql), "swift" => Some(Swift), "toml" => Some(Toml), "ts" => Some(TypeScript), diff --git a/src/parse/tree_sitter_parser.rs b/src/parse/tree_sitter_parser.rs index ebcbfe7c2..31e17ad57 100644 --- a/src/parse/tree_sitter_parser.rs +++ b/src/parse/tree_sitter_parser.rs @@ -76,6 +76,7 @@ extern "C" { fn tree_sitter_ruby() -> ts::Language; fn tree_sitter_rust() -> ts::Language; fn tree_sitter_scala() -> ts::Language; + fn tree_sitter_sql() -> ts::Language; fn tree_sitter_swift() -> ts::Language; fn tree_sitter_toml() -> ts::Language; fn tree_sitter_tsx() -> ts::Language; @@ -650,6 +651,20 @@ pub fn from_language(language: guess::Language) -> TreeSitterConfig { .unwrap(), } } + Sql => { + let language = unsafe { tree_sitter_sql() }; + TreeSitterConfig { + name: "SQL", + language, + atom_nodes: vec!["string", "identifier"].into_iter().collect(), + delimiter_tokens: vec![("(", ")")], + highlight_query: ts::Query::new( + language, + include_str!("../../vendor/highlights/sql.scm"), + ) + .unwrap(), + } + } Swift => { let language = unsafe { tree_sitter_swift() }; TreeSitterConfig { diff --git a/vendor/highlights/sql.scm b/vendor/highlights/sql.scm new file mode 120000 index 000000000..79954e4c8 --- /dev/null +++ b/vendor/highlights/sql.scm @@ -0,0 +1 @@ +../tree-sitter-sql/queries/highlights.scm \ No newline at end of file diff --git a/vendor/tree-sitter-sql-src b/vendor/tree-sitter-sql-src new file mode 120000 index 000000000..d9248a3aa --- /dev/null +++ b/vendor/tree-sitter-sql-src @@ -0,0 +1 @@ +tree-sitter-sql/src \ No newline at end of file